Objektauswahl im Leveleditor, Problem
-
Oh man das ist doch echt zum Ratten melken, hab jetzt drei Methoden,
Methode 1: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, vPickRayDir, vPickRayOrig; 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_jet.Init(&MainObjects.dd_obj, MainObjects.m_camera.m_vPosition, MainObjects.m_camera.m_vPosition + (vPickRayDir*500));
Methode 2:
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 = 1.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); D3DXVECTOR3 pEnd = MainObjects.m_camera.m_vPosition + (vec*500); MainObjects.m_jet.Init(&MainObjects.dd_obj, D3DXVECTOR3MainObjects.m_camera.m_vPosition , pEnd);
Methode 3:
D3DVECTOR p1, p2; POINT p; GetCursorPos(&p); ScreenToClient(MainObjects.dd_obj.hwnd, &p); calcRay(p.x, p.y, p1, p2); MainObjects.m_jet.Init(&MainObjects.dd_obj, p1, p2);
Bei Methode 1 und Methode 3 erziele ich in etwa das gleiche Ergebnis: Der Strahl fährt ein Stück zu weit oben und meist auch ein Stück zu weit Rechts am tatsächlichen Objekt vorbei. Bei Methode 2 trifft der Strahl 100% exakt auf das Objekt, aber nur, wenn ich mich nicht vorwärts, rückwärts oder seitwärts bewege. Die Perspektive kann ich hierbei aber beliebig ändern. Hat jemand vielleicht eine Ahnung? Langsam wirds wirklich deprimierend
Danke,
Gruß,
Kevin
-
Um euch das mal alles zu demonstrieren, gibt es hier für jede Methode eine Exe:
http://mitglied.lycos.de/Surkevin2/RayTransformation.zip
Um durch die Welt zu fliegen, müsst ihr die Rechte Maustaste gedrückt halten. Um einen Strahl zu erzeugen, müsst ihr einfach klicken.
Per Datei->Laden einfach ein DirectX File laden. Ich wäre euch wirklich dankbar, wenn ihr mir helfen könntet. Komm TGGC, du bist doch der Godfather of DirectX(auch wenn es mir ein wenig peinlich ist, da ich nicht immer einverstanden mit deinen Posts bin, und das dir nicht unbedingt höflich gezeigt habe).
Gruß,
Kevin
-
Surkevin schrieb:
Um euch das mal alles zu demonstrieren, gibt es hier für jede Methode eine Exe:
http://mitglied.lycos.de/Surkevin2/RayTransformation.zip
Um durch die Welt zu fliegen, müsst ihr die Rechte Maustaste gedrückt halten. Um einen Strahl zu erzeugen, müsst ihr einfach klicken.
Per Datei->Laden einfach ein DirectX File laden. Ich wäre euch wirklich dankbar, wenn ihr mir helfen könntet. Komm TGGC, du bist doch der Godfather of DirectX(auch wenn es mir ein wenig peinlich ist, da ich nicht immer einverstanden mit deinen Posts bin, und das dir nicht unbedingt höflich gezeigt habe).
Gruß,
KevinDie Programme laufen bei mir nicht.
Lade doch gleich den Quellcode mit hoch, vielleicht wird dann deutlicher wo dein Fehler liegt.Viele Grüße
Fischi
-
Die laufen bei dir nicht? Geht die Fehlerbeschreibung bitte präziser?
Der Source:
http://mitglied.lycos.de/Surkevin2/ModelModificator(DX9).zipDie Struktur ist noch nicht die Beste, ich weiß
In OnLMouseButtonDown geschehen die Berechnungen.
Gruß,
Kevin
-
Dein Fenster ist zwar 640x480 groß, nichtaber(?) der Clientbereich wo reingezeichnet wird. Daran könnte es liegen, oder daran, dass das dargestelle Prisma falsch ist.
Nein, ich denke eher das erste.
-
Mh, ich initialisiere aber alles mit 640*480
-
Wenn ich Stefan Zerbts Methode mit GetClientRect Daten mache, funktioniert alles, JUHU! Aber wieso kapiert D3DXVec3Unproject das nicht, obwohl ich alles mit 640*480 initalisiere?
DANKE,
Gruß,
Kevin
-
Surkevin schrieb:
Wenn ich Stefan Zerbts Methode mit GetClientRect Daten mache, funktioniert alles, JUHU! Aber wieso kapiert D3DXVec3Unproject das nicht, obwohl ich alles mit 640*480 initalisiere?
DANKE,
Gruß,
KevinDu initialisierst die Größe des Fensters mit 640 x 480, dann musst
du aber noch die Größe des Titelleiste und des Randes abziehen, dann hast
du die Größe des Zeichenbereiches.Also solltest du das an folgender Stelle so machen:
D3DSURFACE_DESC ddsd; memset(&ddsd,0,sizeof(ddsd)); IDirect3DSurface9 *lpDDS; MainObjects.dd_obj.lpD3DDevice->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&lpDDS); lpDDS->GetDesc(&ddsd); // Compute the vector of the pick ray in screen space D3DXVECTOR3 v, vPickRayDir, vPickRayOrig; v.x = ( ( ( 2.0f * ptCursor.x ) / ddsd.Width ) - 1 ) / matProj._11; v.y = -( ( ( 2.0f * ptCursor.y ) / ddsd.Height ) - 1) / matProj._22; v.z = 1.0f; ...
Wenn ich das Programm bei mir compiliere funktioniert es auch.
(Die exe von dir hat bei mir eine Accessviolation verursacht)Viele Grüße
Fischi
-
Hatte Stefan nicht von Anfang an gesagt, die Rechnung wäre nicht der Fehler...
Bye, TGGC \-/
-
Hallo,
Ja die Berechnung funktioniert ja mit GetClientRect-DatenAber wieso funktioniert die D3DXVec3Unproject-Funktion nicht korrekt, wenn ich mich bewege?
Cool, dass die Anwendung bei euch Accessviolations verursacht *fg*
Gruß,
Kevin