Objektauswahl im Leveleditor, Problem



  • Hm ok danke, aber was hab ich bei der Funktion falsch gemacht?

    /EDIT
    *g* Mit dieser Methode zeigt der Strahl auch irgendwo hin, aber nicht dahin, wo ich hinklicke 🙂



  • Hi,

    komisch im SDK Sample und bei meinen eigenen Programmen funktioniert das ... 🙄

    Ciao,
    Stefan



  • naja viel falsch kann man da wohl kaum machen
    Was soll denn hier falsch angewendet sein?! CJet funktioniert 100%ig

    D3DXVECTOR3 vPickRayDir, vPickRayOrig;
    
    		D3DXMATRIXA16 matProj; 
            MainObjects.dd_obj.lpD3DDevice->GetTransform( D3DTS_PROJECTION, &matProj ); 
    
            POINT ptCursor; 
            GetCursorPos( &ptCursor ); 
            ScreenToClient( MainObjects.dd_obj.hwnd, &ptCursor ); 
    
            // Compute the vector of the pick ray in screen space 
            D3DXVECTOR3 v; 
            v.x =  ( ( ( 2.0f * ptCursor.x ) / 640  ) - 1 ) / matProj._11; 
            v.y = -( ( ( 2.0f * ptCursor.y ) / 480 ) - 1 ) / matProj._22; 
            v.z =  1.0f; 
    
            // Get the inverse of the composite view and world matrix 
            D3DXMATRIXA16 matView, matWorld, m; 
            MainObjects.dd_obj.lpD3DDevice->GetTransform( D3DTS_VIEW, &matView ); 
            MainObjects.dd_obj.lpD3DDevice->GetTransform( D3DTS_WORLD, &matWorld ); 
    
            m = matWorld * matView; 
            D3DXMatrixInverse( &m, NULL, &m ); 
    
            // Transform the screen space pick ray into 3D space 
            vPickRayDir.x  = v.x*m._11 + v.y*m._21 + v.z*m._31; 
            vPickRayDir.y  = v.x*m._12 + v.y*m._22 + v.z*m._32; 
            vPickRayDir.z  = v.x*m._13 + v.y*m._23 + v.z*m._33; 
            vPickRayOrig.x = m._41; 
            vPickRayOrig.y = m._42; 
            vPickRayOrig.z = m._43;
    		//MainObjects.m_camera.m_vPosition
    		MainObjects.m_jet.Init(&MainObjects.dd_obj, vPickRayOrig, vPickRayDir*100);
    

    Gruß,
    Kevin



  • Das Bild ist die geometrische Deutung von dem Code den Stefan postete.

    Doku + Google findet so gut wie nichts

    Dann bist du zu dumm zum Suchen.

    Bye, TGGC \-/



  • TGGC schrieb:

    Das Bild ist die geometrische Deutung von dem Code den Stefan postete.

    Doku + Google findet so gut wie nichts

    Dann bist du zu dumm zum Suchen.

    Bye, TGGC \-/

    Zu D3DXVec3Unproject gibts nicht besonders viel Doku. Dass das Bild etwas damit zu tun hat, ist mir auch klar...nur was O A zB sind nicht. Hab ich denn bei dem Code was falsch gemacht? Einmal bei der Verwendung von D3DXVec3Unproject und dann bei der von Stefans Code? Wenn ich mich aus der Ursprungssituation wenig bewege, trifft der Strahl noch ziemlich genau, was ich anklicke, wenn ich aber ganz weit weg "fliege" trifft der Strahl immer total daneben, meistens den selben Fleck 😕



  • Sollte doch eigentlich klar sein. V ist der Platz der Kamera. A und B spannen parallel zur Blickrichtung die Bildebene auf. Dort drauf wählst du dann einen Punkt, durch den den Strahl dann geht. Alles simple Geometrie mit ähnlichen Dreiecken.

    Bye, TGGC \-/



  • Manmanman, was kann man denn hier groß falsch machen? Wieso zeigt der Strahl den ich zeichne so eigentlich genau hinter mich? Auch irgendwie komisch 🙂 Ich versteh nicht, wieso das nicht funktioniert, das ist so ein kleines Stück Code, hier kann man doch nichts falsch machen!

    D3DVIEWPORT9 viewport;
    	MainObjects.dd_obj.lpD3DDevice->GetViewport(&viewport);
    
    	POINT p;
    	GetCursorPos(&p);
    	ScreenToClient(MainObjects.dd_obj.hwnd, &p);
    
    	D3DXVECTOR3 point, vec;
    	point.x = (float)p.x;
    	point.y = (float)p.y;
    	point.z = 0.0f;
    
        D3DXMATRIX matWorld, matView, matProjection; 
    	MainObjects.dd_obj.lpD3DDevice->GetTransform( D3DTS_WORLD, &matWorld ); 
    	MainObjects.dd_obj.lpD3DDevice->GetTransform( D3DTS_VIEW, &matView ); 
    	MainObjects.dd_obj.lpD3DDevice->GetTransform( D3DTS_PROJECTION, &matProjection ); 
    
    	D3DXVec3Unproject(&vec, &point, &viewport, &matProjection,
    		&matView, &matWorld);
    
    		MainObjects.m_jet.Init(&MainObjects.dd_obj, MainObjects.m_camera.m_vPosition, vec*100);
    

    Menno 😞
    So wird man motiviert 🙄
    Kevin


  • Mod

    vielleicht wäre für dich die einfachste lösung, wenn du jedes objekt mit einer frabe (unter 32bit) zeichnest und dann aus dem frabebuffer den pixel ausließt auf dem die maus ist. über die ID kommst du dann sicherlich zum objekt.

    dann brauchst du keinen mathekram 😉

    rapso->greets();



  • ich hasse nichts mehr als ein ungelöstes Problem in seinem Zustand zu belassen 🙂 Ich hoff mal auf eure Hilfe 🙂 Google gibt mir auf den Befehl nur Forenthreads, in denen dann steht "Oh yeah, thanks, it works fine!"...nice, bei mir nicht 🙂



  • Die sagen das warscheinlich weils sie die Antworten gelesen, verstanden und umgesetzt haben. Und wenn der Strahl genau hinter dich zeigt, dann dreh ihn doch mal um.

    dann brauchst du keinen mathekram

    So langsam glaub ich auch, das ist hier die einzige Lösung. 😎

    Bye, TGGC \-/



  • hab ihn ja schon längst umgedreht...zeigt aber trotzdem in die falsche Richtung



  • dann dreh ihn nochmal rum?!



  • dann zeigt er wieder nach hinten....lol supa Idee



  • hat keiner ne idee woran das noch liegen könnte? Ist der Code, den ich gepostet habe, falsch? Ein Ja würde mir schon reichen, wenn ihr mir nicht alles sagen wollt *TGGC anguck*
    Gruß,
    Kevin



  • Ich weiss nun nicht, wie genau dein Koordinatensystem ist. Aber z= 0 find ich irgendwie komisch. Beim "Standard" Koordinatensystem würde das bedeuten man blickt paralell (?) zum Bildschirm.

    Bye, TGGC (Just think about it)



  • parallel 🙂
    Mh...was würdest du angeben? Soll ich vielleicht doch die erste genannte Methode anwenden? Mich wundert, dass weder die UnProject, noch die Funktion, die Stefan Zerbst gepostet hat, funktioniert....manmanman
    Gruß,
    Kevin



  • Hi,

    mich wundert vielmehr, dass ein Vektor immer in die verkehrte Richtung zeigt auch wenn man ihn umdreht 😃

    Was den Code und die 0 angeht so schau einfach mal auf den Code den ich gepostet habe. Dort steht eine 1 statt der 0 für z und da die Berechnung (die D3DXUnproject wohl auch so durchführen wird) diese Koordinate auch tatsächlich verwenden ist es nicht verwunderliuch, dass das Ergebnis ein anderes ist 😉

    regards,
    Stefan





  • Nein das mein ich nicht 🙂 Er zeigt zuerst hinter mich. OK, also dreh ich ihn um (per mal -1, bitte nicht lachen, wenn es falsch ist....hatte mit Vektoren noch nie was in der Schule zutun (vlt. mal 2dimensionale ganz kurz :))). Dann zeigt er aber nicht genau dahin, wo ich hinklicke 🙂
    Ich werde das mit dem z = 1 und der Funktion auf der Seite mal ausprobieren! DANKE!



  • Also mit dem Z = 1 und der Unproject Funktion sieht es schonmal ganz gut aus. Zu mindest wenn ich nicht weit "fliege". Lade ich zum Beispiel das ziemlich kleine Objekt heli.x und fliege nur ein wenig zurück und gehe mit der Maus über den Propeller, kommt der Strahl genau da an! Lade ich jetzt aber das Dinofile tiny.x und fliege ziemlich weit, um nach außerhalb des Models zu gelangen, und schieße dann zB auf die Hand (die sich in der Perspektive links unten in der Bildschirmecke befindet), schießt der Strahl zwar halbwegs in die Richtung, aber er trifft nicht die Hand, also geht schon sichtlich daneben, und das nicht, weil ich daneben klicke *g*....komisch 😕

    /EDIT
    Es KÖNNTE (!) ja sein, dass CJet nicht 100%ig funktioniert...deswegen teste ich das jetzt auf eine andere Methode. Ich möchte einfach die angeklickten Polygone farbig erscheinen lassen :). Da ich ja nicht so einfach beim alten Model sagen kann, dass er das Polygon nicht mehr zeichnen soll, oder anders zeichnen soll, dachte ich mir, ich mach einen neuen Vertex/Indexbuffer, indem alle Daten zu den angeklickten Polygonen stehen. Diese render ich dann einfach nach dem Model...ich denke, dass das aber Flimmern wird, oder? Gibt es eine Möglichkeit, das zu vermeiden?

    Danke euch allen,
    Gruß,
    Kevin


Anmelden zum Antworten