Objektauswahl im Leveleditor, Problem
-
Hallo!
Ich code ja einen Nachleveleditor. Hier bin ich jetzt bei einem Problem (ach ne?). Und zwar möchte ich in das gerenderte Bild klicken, und dann das Objekt auswählen können. Das wäre ja kein Problem, wenn ich dann den Vektor bekommen würde....Strahl schneidet Objekt kann ich selbst. Ich habe nur den momentanen Richtungsvektor, die Position und die Maus X/Y Koordinaten. wie berechne ich hieraus den Strahl? Wäre ich in der Egoperspektive wäre der Startpunkt Position und der Endpunkt Richtungsvektor*zB 100. Nur verändert sich die Perspektive nicht, wenn ich die Maus verschiebe. Versteht ihr wie ich das meine? Also wie in 3DSM zB, soll man in der 3D Ansicht per willkürlichen Mausklick irgendwo ins Bild das Objekt auswählen können, auf das man so eben klickt. Ich hoffe, ich hab das Problem nicht zu kompliziert beschrieben.
Danke,
Gruß,
Kevin
-
hm, vielleicht kann man es so machen, dassman bei jedem mausklick die kamera so dreht, dass der richtungsvektor der verschiebung der maus position entspricht (halt so wie in der ego perspektive), dann berechnen und dann wieder zurücksetzen bzw n temporären vektor anlegen...
mfg
-
ok, gute Idee, danke! Weitere Vorschläge?
-
Solltest du mit DirectX arbeiten, ist es das hier was du suchst :
-
Ich hab da sogar noch'n Bild dazu auf'm Server:
http://www.fh-merseburg.de/~roesch/trash/raypick.jpgBye, TGGC (Reden wie die Großen)
-
HI!
Danke! Klingt ja super. Hab ne Frage dazu(Doku + Google findet so gut wie nichts).
Wieso erwartet der als Input einen Vektor mit X,Y,Z? Wenn ich ihm alle übergebe, für Z 0 und für X,Y die Mauskoordinaten (umgerechnet auf das Spielfenster), bekomme ich dann den richtigen Vektor? Also so funktioniert es, wieso auch immer, schonmal nicht:D3DVIEWPORT9 viewport; viewport.Height = 480; viewport.Width = 640; viewport.X = 0; viewport.Y = 0; viewport.MinZ = 0.01f; viewport.MaxZ = 500.0f; 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; D3DXVec3Unproject(&vec, &point, &viewport, &MainObjects.m_camera.m_mProjectionMatrix, &MainObjects.m_camera.m_mViewMatrix, 0); MainObjects.m_jet.Init(&MainObjects.dd_obj, MainObjects.m_camera.m_vPosition, vec*-100);
TGGC kannst du bitte ein paar Takte zu deinem Bild sagen?
Danke,
Gruß,
Kevin
-
Hi,
im SDK von DirectX gibt es ein Sample namens Pick:
D3DXMATRIXA16 matProj; m_pd3dDevice->GetTransform( D3DTS_PROJECTION, &matProj ); POINT ptCursor; GetCursorPos( &ptCursor ); ScreenToClient( m_hWnd, &ptCursor ); // Compute the vector of the pick ray in screen space D3DXVECTOR3 v; v.x = ( ( ( 2.0f * ptCursor.x ) / m_d3dsdBackBuffer.Width ) - 1 ) / matProj._11; v.y = -( ( ( 2.0f * ptCursor.y ) / m_d3dsdBackBuffer.Height ) - 1 ) / matProj._22; v.z = 1.0f; // Get the inverse of the composite view and world matrix D3DXMATRIXA16 matView, matWorld, m; m_pd3dDevice->GetTransform( D3DTS_VIEW, &matView ); m_pd3dDevice->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;
Ciao,
Stefan
-
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%igD3DXVECTOR3 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
-
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