Mouse 2d Coords zu 3d
-
Hi!
ich hab nur eine kleine verständnissfrage was das teilen durch die MatProject macht.
vtest.x = ( ( ( 2.0f * mousePos.mx ) / viewporttest.Width ) - 1 ) / matProjtest._11;
ich erstelle damit ja einen x wert der von -1 linke kante, über 0 im zentrum bis +1 in zur rechten kante des viewbereichs.
aber was genau macht jetzt das teilen durch die Projektionsmatrix?ich wollte das picking selbst schreiben um auch zu wissen wie es funktioniert. bzw um das Interset(mesh...) zu umgehen. um nur für bestimmte objekte, abstand zwischen punkt gerade zu berechnen.
-
cl90 schrieb:
aber was genau macht jetzt das teilen durch die Projektionsmatrix?
Im Prinzip macht es die Skalierung der Projektionsmatrix (eine Folge von aspect und fov) rückgängig. Man beachte, dass diese Methode keine allgemeine Lösung ist, sondern nur für eine ganz spezielle Art von Projektionsmatrix funktioniert (zentrierte perspektivische Projektion).
Die allgemeine Lösung wäre, Punkte vom Screenspace über Normalized Device Coordinates in den Clipspace zurück zu rechnen und über die inverse View-Projection-Matrix in den Worldspace zurück zu projizieren. Das funktioniert dann mit jeder beliebigen Projektionsmatrix, ist aber natürlich etwas rechenaufwändiger.
-
ok
also ist das ganze nicht so leicht geometrisch realisierbar.
also am besten einfach ein sample nehmen und nachmachen
-
cl90 schrieb:
also ist das ganze nicht so leicht geometrisch realisierbar.
Naja, deine Variante da oben ist eigentlich genau die einfache "geometrische Realisierung"...
Der Rest von deinem Code sieht vermutlich so aus, dass als Strahlursprung die Kameraposition dient...
-
jain. so weit war ich noch nicht.
ich hing damit fest, die koordinaten maus.x und y, in irgendwie brauchbare punkte im 3d Raum zu ändern.um den punkt des Mousecursors zu bekommen, würde ich einfach meinen oben ausgerechneten Punkt (ohne matproj), + den punkt der Cam nehmen.
müsste passen, da ich max (1,1,1) oder (-1,-1,1) von der cam entfernt sein könnte, was immer max 45° sind.aber beim drüber nachdenken sehe ich das mein fenster nicht cubisch ist. und das 1 hochrizontal nicht der länge von 1 vertikal entspricht
also wirds vlt im zentrum klappen und nach außen nicht mehr.
-
cl90 schrieb:
aber beim drüber nachdenken sehe ich das mein fenster nicht cubisch ist. und das 1 hochrizontal nicht der länge von 1 vertikal entspricht
Ich bin mir nicht ganz sicher was genau du damit meinst, aber ich vermute, dass du genau das meinst, worum sich die Division durch matProjtest._11 kümmert
-
ich hab ein bisschen gesucht und rumgebastelt. aber irgendwie ist es noch etwas ungenau.
D3DXVECTOR3 vec, rayOrigin,rayDir; D3DXMATRIX matProj, matView, mVI; d3ddev -> GetTransform(D3DTS_PROJECTION, &matProj); d3ddev -> GetTransform(D3DTS_VIEW, &matView); D3DXMatrixInverse( &mVI, NULL, &matView); vec.x = ( ( ( 2.0f * mousedata.Xi ) / SCREEN_WIDTH ) - 1 ) / matProj._11; vec.y = -( ( ( 2.0f * mousedata.Yi ) / SCREEN_HEIGHT ) - 1 ) / matProj._22; vec.z = 1.0f; // Transform the screen space pick ray into 3D space rayDir.x = vec.x*mVI._11 + vec.y*mVI._21 + vec.z*mVI._31; rayDir.y = vec.x*mVI._12 + vec.y*mVI._22 + vec.z*mVI._32; rayDir.z = vec.x*mVI._13 + vec.y*mVI._23 + vec.z*mVI._33; rayOrigin.x = mVI._41; rayOrigin.y = mVI._42; rayOrigin.z = mVI._43;
den Strahl pack ich dann in diese funktion für, abstand zwischen gerade und einem Punkt.
float lineP_distance(D3DXVECTOR3 origin, D3DXVECTOR3 dir, D3DXVECTOR3 point) { D3DXVECTOR3 cross; D3DXVec3Cross(&cross, &dir, &(point-origin)); return (D3DXVec3Length(&cross)/D3DXVec3Length(&dir)); }
ich hab nur das problem das der strahl nicht direkt durch meine cursor spitze läuft. also je nach ort ein bisschen gestreut.
ist mein cursor falsch? oder hab ich einen fehler beim erstellen vom Ray?