Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Mai 21, 2024 10:32

Foren-Übersicht » Programmierung » Mathematik-Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Jul 02, 2008 23:13 
Offline
DGL Member
Benutzeravatar

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.

Code:
  1.  
  2. procedure TGun.Move(speed, Direction, shipx, shipy: single; LookVec: TVector4f; rot: double);
  3. const
  4.   RotZAxis  : TVector3f = (0, 0, 1);
  5. var
  6.   mat11, mat21, mat12, mat22: double;
  7. begin
  8.   //Rotationswinkel - Ausrichtung der Kanone
  9.   Rotation:=rot-Adjustment;
  10.  
  11.   // Den Look-Vektor um die Z-Achse drehen
  12.   VectorRotate(LookVec, RotZAxis, -DegToRad(Rotation));
  13.  
  14.   // Rotationsmatrix
  15.   mat11 := cos(rot);
  16.   mat21 := -sin(rot);
  17.   mat12 := sin(rot);
  18.   mat22 := mat11;
  19.  
  20.   PosVect[0] := shipx + (mat11 * X) + (mat21 * Y) + (LookVec[0] * (Direction * speed));
  21.   PosVect[1] := shipy + (mat12 * X) + (mat22 * Y) + (LookVec[1] * (Direction * speed));
  22.   PosVect[2] := PosVect[2] + (LookVec[2] * (Direction * speed));
  23.  
  24.  
  25. end;
  26.  


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 :D

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

MfG
MB


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 03, 2008 00:16 
Offline
Ernährungsberater
Benutzeravatar

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?

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 03, 2008 07:27 
Offline
DGL Member
Benutzeravatar

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:

Bild

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 03, 2008 08:51 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
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.

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 03, 2008 10:11 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 03, 2008 10:46 
Offline
DGL Member
Benutzeravatar

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.

Ganz zuletzt ist der Verschiebevektor dran.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 03, 2008 12:02 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 29, 2003 00:11
Beiträge: 436
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:
  1.  
  2. (1 0 x)(cosa -sina 0)(1 0 -x)
  3. (0 1 y)(sina  cosa 0)(0 1 -y)
  4. (0 0 1)(0      0      1)(0 0 1)
  5.  

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).


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 03, 2008 13:02 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 03, 2008 13:12 
Offline
DGL Member
Benutzeravatar

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 :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 03, 2008 20:03 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
MB hat geschrieben:
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.

sin und cos erwarten aber radians

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 03, 2008 21:25 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Jul 22, 2006 00:43
Beiträge: 30
Wohnort: Borland
Super, vielen Dank :D

Das war der Fehler, habe nun rot in rad umgewandelt und es funktioniert ;)

Perfekt, danke an alle Helfer.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Foren-Übersicht » Programmierung » Mathematik-Forum


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]