Rotation aus Welt View Matrix
-
Hey ihr.
Hab mal ne Frage (wie immer ;-))
wie kann ich aus einer View Matrix (konstruiert mit D3DXMatrixLookAtLH) die Rotation der "virtuellen Kamera" ermitteln? Hoffe man kann mir helfen, danke schonmal im vorraus.
-
Tjo mei, musst dir halt ausrechnen wie die Kamera gerade steht.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/directx/graphics/reference/d3dx/functions/math/d3dxmatrixlookatrh.aspHier hast ma die Parameter beschrieben
Ich würd mir ein Bleistift und ein Stück Papier nehmen und mir das aufzeichnen, sowas hilft!
-
die viewmatrix und generell die ganze matrix rechnerei ist eine sache, die man um sie zu verstehen selber machen muss.
die funktion von directx ist in diesem fall höchst komplex und unübersichtlich, desweiteren bietet sie nur sehr eingeschränkte möglichkeiten.
btw: ich würde dazu tendieren, diese view matrix durch eine andere zu ersetzen,dann musste aber wirklich alles selber einprogramieren
die funktion erwartet die parameter rotation um x/y/z(zb als vector) und die position der kamera.
dann rotierst du die kamera um den negativen x/y/z wert, und translatierst sie um das negative ihrer position, ganz einfach,und du musst dich am ende nichmehr fragen, wieweit du dich rotierst@fireyourguns ich glaub er kennt die parameter, wenn er die funktion schonmal erstellt hat
//Edit nach meinen erfahrungen und nach benutzen der symetriesätze kam ich zum schluss, dass es unmöglich ist,den winkel der zwischen den beiden sichtvektoren liegt zu bestimmen(siehe rechtwinkliges dreieck im einheitskreis)
-
@otze: das ist gerade das, was ich nicht will. ich habe berewits eine funktion, die die kamera um einen bestimmten winkel rotiert (sagt man das so?). was ich nun will ist, die kamera auf einen bestimmten punkt ausrichten. dazu bietete sich mir diese funktion an. da ich aber in meiner kamera klasse auch die rotation (als vektor) speichere, möchte ich diesen vektor nach dem aufruf von D3DXMatrixLookAtLHmit dem korrekten wert füllen. ich weiß eben nur nicht wie, hat noch jemand eine idee?
-
es gibt ne rechnerische möglichkeit dass mit deiner schon selbst geschriebenen funktion hinzubekommen
du musst nur versuchen, als kameraposition den punkt zu nehmen, wo die kamera draufschaun soll+/- einen bestimmten wert, da die kamera ja sonst direkt auf dem objekt sein würde, und dann die sichtwinkel der kamera so ausrichten, dass sie genau auf das objekt schaut.
ich kann ja mal schaun, wie mand as machen kann
-
also, ich habe mir jetzt überlegt, ich errechne den lookat punkt vor der ausrichtung und nach der ausrichtung und berechne dfann den winkel zwischen diesen beiden punkten. es kommt jedoch schon das erste problem. ich rechne den "vorher-punkt" so:
D3DXVECTOR3 SPrevLookAt = D3DXVECTOR3(cos(SRotation.z), sin(SRotation.z), cos(SRotation.X));
Wobei SRotation der Rotationswinkel der Kamera ist (dargestellt als D3DXVECTOR3). nun ergibt sich aber das problem, dass bei einer Rotation von pitch=0, yaw=0, roll=0 der lookatpunkt 0|0|1 sein müsste, nach der rechnung (aus nem buch gezogen) aber 1|0|1 ist. mir kam die idee, quasi das koordinatensystem 90 grad um die z-achse zu drehen, dann sollten die werte passen. rechnung also:
D3DXVECTOR3 SPrevLookAt = D3DXVECTOR3(cos(SRotation.z - D3DX_PI / 2), sin(SRotation.z), cos(SRotation.X));
Nun gibt es aber ein weiteres problem: SPrevLookAt.x ist nun irgendwas mit -4,irgendwas... warum? wenn ich das in den windows rechner eingebe, funzt es, und der wert ist 0... woran liegt das?
-
Die Rotation befindet sich in den ersten 3x3 Elementen der Matrix. Grundlegende Sachen sollte man sich vielleicht vorher beibringen...
-
Moin,
1.) Wenn du mit D3DXMatrixLookAtLH( pOut, pEye, pAt, pUp) deine Matrix erstellst, und daraus die entsprechenden Winkel extrahieren möchtest, solltest du darauf achten, dass die Matrix auch tatsächlich nur eine Rotationsmatrix ist, d.h. pEye sollte ( 0.0, 0.0, 0.0 ) sein und pAt sollte nur die LookAt-Richtung enthalten und nicht den tatsächlichen Lookat-Punkt ( pAt sollte also z.B. VecLookAt - VecPosition ).
2.) Code zum Extrahieren der Winkel aus einer Matrix:
VEC GetXYZRotationFromMatrix( const D3DXMATRIX &matrot ) { float angle_x, angle_y, angle_z, D, C, tr_x, tr_y; angle_y = D = asin( matrot[2] ); /* Calculate Y-axis angle */ C = cos( angle_y ); if ( fabs( C ) > 0.005f ) { /* Gimball lock? */ tr_x = matrot[10] / C; /* No, so get X-axis angle */ tr_y = -matrot[6] / C; angle_x = atan2( tr_y, tr_x ); tr_x = matrot[0] / C; /* Get Z-axis angle */ tr_y = -matrot[1] / C; angle_z = atan2( tr_y, tr_x ); } else { /* Gimball lock has occurred */ angle_x = 0.0f; /* Set X-axis angle to zero */ tr_x = matrot[5]; /* And calculate Z-axis angle */ tr_y = matrot[4]; angle_z = atan2( tr_y, tr_x ); } return VEC( angle_x, angle_y, angle_z ); }
Quelle ( da könntest du sowieso mal reinschauen
):
[url]ftp://ftp.netcom.com/pub/he/hexapod/index.html [/url]3.) Code zum Ermitteln der XY-Rotationswinkel eines Vektors relativ zum UNIT-Z-Vektor:
VEC GetXYRotationFromUnitZ( const VEC &vec ) { VEC v_unit( 0.0f, 0.0f, 1.0f ); VEC v_rot( 0.0f, 0.0f, 0.0f ); VEC v_in = vec; float phi; //---------- Rotation um Y-Achse ermitteln //---------- Eingabevektor auf X-Z-Ebene abbilden v_in.Y = 0.0f; v_in.Unitize(); //---------- Wenn Vektor auf Z-Achse if( v_in.X == 0.0f ) { if( v_in.Z >= 0.0f ) { phi = 0.0f; } else { phi = PI; } } else{ //---------- Winkel bestimmen ( abhängig von Richtung der Rotationsachse ) if( v_in.X < 0.0f ) phi = -acos( v_in.Z ); else phi = acos( v_in.Z ); } //---------- Winkel merken v_rot.Y = phi; //---------- Rotation um X-Achse ermitteln //---------- Eingabevektor auf Y-Z-Ebene abbilden v_in = vec; v_in.RotateY( phi ); v_in.X = 0.0f; v_in.Unitize(); //---------- Wenn Vektor auf Z-Achse if( v_in.Y == 0.0f ) { phi = 0.0f; } else { //---------- Winkel bestimmen ( abhängig von Richtung der Rotationsachse ) if( -v_in.Y < 0.0f ) phi = -acos( v_in.Z ); else phi = acos( v_in.Z ); } v_rot.X = phi; return v_rot; }
Der ist auf meinem eigenen Mist gewachsen und kann gerne von euch auseinandergenommen ( d.h. verbessert ) werden.
-
also, sorry, dass ich so lange nicht geschrieben hab, unser internet war irgendwie kaput... (ich hasse AOL ;-))
@submerged: ich denke schon, dass ich die basics drauf habe (soll nicht eingebildet klingen), ich habe auch schon versucht, aus den ersten 3x3 elementen die rotation zu ermitteln, doch das führte mich irgendwie zu falschen ergebnissen. (soll nicht böse sein oder so)
@Solid: Danke für diese zwei funktionen. werde sie mir aufmerksam durchlesen und einbauen.
danke nochmal an alle