Kameraposition und Ausrichtung ändert sich trotz wechselnder Vektoren nicht [DirectX/C++]
-
Hallo an alle!
Ich hab mal wieder ein relativ beklopptes Problem mit DirectX in C++.
Als erstes einmal hat man natürlich die Viewmatrix, dann habe ich noch zwei Vektoren, genauer eyePoint und lookAt. Ersterer ist die Position, letzterer die Richtung.Mithilfe von D3DXMatrixLookAtLH verrechne ich nun diese beiden Vektoren mit der Viewmatrix und mit SetTransform wende ich diese Matrix an. So. Genau dasselbe, nur mit der World Matrix, verwende ich, um ein Objekt zu rendern. Das Objekt selber hat fast exakt die selben Werte wie die Kamera. Dieses Objekt bewegt sich, wie es sich bewegen sollte. Theoretisch gesehen sollte man aber nicht merken, wenn man sich bewegt, da die Kamera ja eigentlich dem Objekt folgen sollte.
Ich habe mir auch alle 4 Werte (Campos, Camdir, Objpos, Objdir) mehrfach ausgeben lassen. Wie erwartet sind sie nahezu identisch, ändern sich aber auch. Nur die Kamera will sich nicht bewegen. Wo dran liegt das?
Greetings,
Chaos
-
Okay, vielleicht bringt es mehr, wenn ich den "fehlerhaften" Code hier darstelle:
// Set transform for view D3DXMatrixLookAtLH(&view, &eyePoint, &lookAt, &D3DXVECTOR3(0.0f, -1.0f, 0.0f)); game_engine.device->SetTransform(D3DTS_VIEW, &view); D3DXMatrixLookAtLH(&world, &spieler.position, &spieler.direction, &D3DXVECTOR3(0.0f, 1.0f, 0.0f)); game_engine.device->SetTransform(D3DTS_WORLD, &world); spieler.heli.draw(); char buf[512]; sprintf(buf, "Kameraposition (%f|%f|%f)\nKameradirektion (%f|%f|%f)\n\ Helikopterposition (%f|%f|%f)\nHelikopterdirektion (%f|%f|%f)\n\n", eyePoint.x, eyePoint.y, eyePoint.z, lookAt.x, lookAt.y, lookAt.z, spieler.position.x, spieler.position.y, spieler.position.z, spieler.direction.x, spieler.direction.y, spieler.direction.z); cout << buf;Man sieht also, dass ich mir alle 4 Vektoren ausgeben lasse, und anhand dieser Ausgaben sieht man immer, dass sowohl eyePoint & spieler.position als auch lookAt & spieler.direction gleich sind. Trotzdem mag die Funktion das nicht. Jetzt vielleicht einer eine Idee?

Greetings,
Chaos
-
Ich glaube, die World-matrix mit D3DXMatrixLookAtLH zu bilden ist nicht richtig... Damit erstellst du eine Kameramatrix. also sozusagen deine Augen, wo die sind und wo die hingucken.
Deine Weltmatrix solltest du mit D3DXMatrixIdentity, D3DXMatrixMultiply, D3DXMatrixTranslation, D3DXMatrixRotation usw. zusammenbauen.
Oder du nimmst gleich D3DXMatrixTransformation, das hab ich grad gefunden: http://msdn2.microsoft.com/en-us/library/bb205365.aspxAber das mit lookatlh für die weltmatrix ist sicher falsch
-
Dann frage ich mich nur warum das dann funktioniert?? Weil mit D3DXMatrixLookAtLH ist nur eine Funktion, die aus 2 Vektoren eine Matrix aufbaut, das ist im Grunde keine reine Kamerafunktion sondern kann auch so verwendet werden. Zumindest hat das schonmal geklappt.
Darum verstehe ich es ja nicht, das Objekt zu bewegen funktioniert, es funktioniert halt nur nicht so.
Und ich hab das mal getestet: Wenn ich die Vektoren z.B. so drehe, dass sich die Kamera immer auf der X-Z-Ebene um den Nullpunkt dreht, dann bewegt sich die Kamera. UND das Objekt.
Das hab ich so gemacht:
static double winkel = 0.0; ... D3DXMatrixLookAtLH(&view, &D3DXVECTOR3(sin(winkel), 0.0f, cos(winkel)), &D3DXVECTOR3(0.0f, 0.0f, 0.0f), &D3DXVECTOR3(0.0f, 1.0f, 0.0f)); winkel += 0.001;Dieser Code bewirkt es, dass sich die Kamera langsam um den Nullpunkt (0, 0, 0) bewegt. Und die bewegt sich so wirklich. Nur die Variablen scheint der nicht zu mögen.
Greetings,
Chaos
-
hm und was isst jetzt dein problem? Ja der Code ist richtig, die kamera bewegt sich im Kreis um den Nullpunkt. Setz doch mal zwei objekte nebeneinander in die nähe des nullpunktes und setzt als worldmatrix die identität, dann siehst du, dass die kamera um den nullpunkt fliegt.
aber dass man die weltmatrix mit lookAtLH erstellt, hab ich noch nie gehört
-
Okay, ich habs auch net gelernt mit D3DXMatrixLookAtLH die World Matrix zu bilden aber so ist das um einiges einfacher, weil du einfach die Ausrichtung mithilfe der Position und Richtung bestimmen kannst. Dann brauchst du dich nicht um Winkel, cos, sin, tan, yaw, pitch oder roll zu kümmern

Darum verwende ich eigentlich nur noch diese Funktion, weil es einfach so herrlich einfach ist

Und ansonsten ist mein Problem ja wie schon im Startpost gesagt bekloppt: Wenn ich die beiden Position/Richtung Vektoren manuell eingebe´, d.h. in der Funktion ein &D3DXVECTOR3(1.0f, 5.0f, 0.0f) verwende, funktioniert das. Auch die Zahlen für die einzelnen Koordinaten kann ich dynamisch bestimmen. Sobald ich aber ganze Variablen wie z.B. eben &eyePoint oder &lookAt einsetze, will der nimmer. Und auch wenn ich die Vektoren so zusammensetze: D3DXVECTOR3(eyePoint.x, eyePoint.y, eyePoint.z) funktioniert es nicht. Und das ist eben das, was mich sehr anstößt.

Greetings,
ChaosEDIT:: Fragt mich nicht wieso, aber seitdem ich noch ein 3. Objekt darstelle, auch mit D3DXMatrixLookAtLH, funktioniert alles so wie es sollte..

Nur beim Nullpunkt gibts ein paar Rechenfehler *hihihi*