Registriert: Sa Jul 22, 2006 00:43 Beiträge: 30 Wohnort: Borland
Hallo
folgende Situation liegt zugrunde:
Ich habe ein Objekt, welches sich beim Drehen eines anderen Objekts mitdreht. Einfach ausgedrückt: Eine Kanone auf einem Raumschiff.
Klassenvariablen:
Rotation: Rotationswinkel der Kanone
PosVect[]: Positionsvektor der Kanone
Parameter:
shipx: X Koordinate des Schiffs
shipy: Y Koordinate des Schiffs
speed: Geschwindigkeit des Schiffs
LookVec: Richtungsvektor des Schiffs
rot: Rotationswinkel des Schiffs, bewegt sich immer zwischen 0 und 360 und wird bei Überschreitung wieder auf 0 gesetzt bzw bei Unterschreitung auf 360.
Mittels der Rotationsmatrix berechne ich die neue Position der Kanone und addiere sie mit dem Positionsvektor des Schiffes. Das Ganze sieht auch einigermaßne richtig aus, nur weiß ich einfach nicht welchen Winkel ich für die Drehung nehmen muss, irgendwie denke ich in die falsche Richtung, denn zurzeit dreht sich die Kanone wild um den Mittelpunkt des Schiffs
Btw: Das Ganze ist eine 2D Anwendung und die Rotation findet um die Z-Achse statt, was ihr aber wahrscheinlich schon erkannt habt.
Wäre super wenn mir jemand dabei helfen könnte.
Danke
Registriert: Sa Jan 01, 2005 17:11 Beiträge: 2067
Programmiersprache: C++
Eine kleine Verständisfrage:
Die Kanone befindet sich immer an der selben Stelle des Raumschiffes?
Und trotz 2D ist dein Raumschiff 3D und du hast kein Raumschiff-Bitmap?
Registriert: Sa Jul 22, 2006 00:43 Beiträge: 30 Wohnort: Borland
Genau, die Kanone befindet sich immer an einer bestimmten Stelle am Raumschiff.
Die Variablen X und Y sind in diesem Falle die Koordinaten des Vektors der vom Schiffsmittelpunkt zur Position der Kanone zeigt, ungefähr so:
Mein Raumschiff ist schon 2D, lasse es nur um die Z-Achse rotieren. EIn Raumschiff bitmap habe ich schon, dachte nur, dass hier eben die Methode ausreichen würde. Falls noch Codefetzen gebraucht werden füge ich die gerne hinzu, müsste dann nur wissen was.
PS: Die kleinstmögliche Drehung ist in diesem Falle 0.3.
Dein Code scheint Probleme mit Deg vs Rad zu haben.
Rotation:=rot-Adjustment;
=>rot und Rotation haben die selbe Einheit
cos(rot)
=>rot ist in Radians
DegToRad(Rotation)
=>Rotation ist in Degrees
=>Widerspruch
außerdem weiß ich nicht was für Einheit VectorRotate haben will.
Registriert: Sa Jul 22, 2006 00:43 Beiträge: 30 Wohnort: Borland
Also eigentlich sind beides Degree Werte, rot und Rotation. Die Werte werden zur Zeit nur bei der der Vektordrehung in rad umgewandelt. Die normale Rotation um den Mittelpunkt der Objekte um ihren eigenen Mittelpunkt funktioniert ja soweit.
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Also, ohne jetzt allzu mathematisch zu werden:
Zuerst ist die Kanone dran, die richtet sich zuerst aus. Daher musst Du ZUERST die Kanone mit ihrer Rotationsmatrix transformieren.
DANN folgt das Schiff mitsamt der Kanone. Das heisst, sowohl die Kanone als auch das Schiff wird jetzt mit der Schiffsmatrix transformiert. Bei der Matrizenmultiplikation bitte auf die Reihenfolge achten.
Mal so ausgedrückt:
- Kanone in Ursprung schieben (-> -canonPosOnShip - shipPos)
- Kanone drehen
- Kanone auf den alten Platz verschieben (-> -canonPosOnShip + shipPos)
- Schiff in den Ursprung schieben (-> -shipPos)
- Schiff drehen
- Schiff auf den alten Platz verschieben. (-> +shipPos)
Beispielmatrix für die Schiffsdrehung also:
Code:
(10 x)(cosa -sina 0)(10 -x)
(01 y)(sina cosa 0)(01 -y)
(001)(001)(001)
Bischen Matrixmultiplikation auf dem Papier und fertig.
Das packst du dir am besten in eine Funktion, die:
- einen Drehwinkel
- einen Drehmittelpunkt
als Parameter nimmt und den gedrehten Vektor zurückliefert.
Kanone selbst ist der Positionsvektor halt (canonPosOnShip + shipPos).
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
@Alibi: rein grundsätzlich stimmt das. Aber normalerweise stehen Modelle zunächst einmal immer im Ursprung. Daher muss man sie gar nicht in den Ursprung schieben, um sie dann dort rotieren zu können. Wenn das Modell sich zu Beginn NICHT im Ursprung befindet, dann ist die obige Lösing OK.
Registriert: Sa Jul 22, 2006 00:43 Beiträge: 30 Wohnort: Borland
Vielen Dank für eure Mühen schon mal an dieser Stelle
Ich dachte es wäre eventuell nur ein falscher Wert für den Winkel, sonst funktioniert ja eigentlich alles, die Kanone dreht sich nur zu schnell
Ich werde das heute Abend wenn ich Zeit habe mal versuchen so umzusetzen, auch wenn ich noch nicht ganz weiß wie. Mein aktueller Code geht irgendwie etwas anders vor habe ich das Gefühl
Also eigentlich sind beides Degree Werte, rot und Rotation. Die Werte werden zur Zeit nur bei der der Vektordrehung in rad umgewandelt. Die normale Rotation um den Mittelpunkt der Objekte um ihren eigenen Mittelpunkt funktioniert ja soweit.
Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.