Entwickler-Ecke

Multimedia / Grafik - Direct3D Ego-Perspektive


hd - Mi 04.06.03 21:55
Titel: Direct3D Ego-Perspektive
Hallo alle zusammen!

Ich hab da mal ein recht kniffliges Problem mit Direct3D. Ich programmiere einen Ego-Shooter und habe gerade die Mausunterstützung eingebaut. Ich kann also mit der Maus meinen Blickwinkel verändern (oben/unten und links/rechts). Das klappt auch alles wunderbar, so lange man sich nur nach rechts/links (also um die Y-Achse) oder unten/oben (also um die X-Achse) dreht. Schaut man aber z.B. nach unten links so findet gleichzeitig eine Drehung um die Z-Achse statt, was im 3D-Raum auch logisch ist. Nur möchte ich das irgendwie verhindern bzw. kompensieren, da ich meinen "Kopf" nicht zur Seite neigen möchte (verwirrt in einem 3D-Shooter nur unnötig). Bei Half-Life & Co ist das ja schließlich auch nicht der Fall, muß also irgendwie möglich sein...
Wenn einer weiß, wie das geht oder auch nur ne Vermutung hat, wär ich für jeden Vorschlag seeehr dankbar.

Gruß,
hd


Tweafis - Mi 04.06.03 22:04

Du musst aus der Mausbewegung die Y Bewegung und die X Bewegung rausfiltern und dann auf die einzelnen Achsen anwenden.

(sorry, falls ich *mist*e gelabert hab, ist nur n Denkanstoss)

Fis


hd - Do 05.06.03 12:15

Da liegt ja gerade das Problem! Wenn ich mich erst um die Y-Achse und danach um die X-Achse (oder umgekehrt) drehe, rotiere ich automatisch ein Stück um die Z-Achse. Ich müßte erstmal eine Drehung um X und danach eine Drehung um eine um X-mitgedrehte Y-Achse machen, damit's stimmt. Ich weiß aber leider nicht genau, wie das geht. Ich habe folgendes mal ausprobiert, aber dadurch wurde der Effekt irgendwie noch verstärkt:


Quelltext
1:
2:
3:
4:
D3DXMatrixMultiply(matView, matView, matRotX);
D3DXVec3TransformCoord(vNew, vNew, matRotX);
D3DXMatrixRotationAxis(matRot, vNew, -diff_pos.X * MOUSE_SENSITIVITY);
D3DXMatrixMultiply(matView, matView, matRot);

Wobei vNew mein Normalvektor der Kamera in Y-Richtung ist.
Kann ich übehaupt einen Vektor mit einer Rotationsmatrix drehen?? Wär toll, wenn mir das jemand sagen könnte.


Simon Joker - Do 05.06.03 12:24

Hi hd

ich kann die nicht sagen, wie du es in DirektX machst, aber grundsätzlich müsstes du dafür hierarchische Objekte haben.
Zum Beispiel

Quelltext
1:
2:
3:
_DummyObject für Y-Drehung
  |_DummyObject für X-Drehung
     |_CameraObjekt

So könntes du die Drehungen unabhängig von ein ander haben.