Objektauswahl im Leveleditor, Problem
-
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
-
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