3D - Rotation

Anfängerfragen zum Programmieren mit PureBasic.
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

3D - Rotation

Beitrag von Andreas_S »

Ich habe hier für jede Ache eine Rotations-Gleichung gemacht:

Code: Alles auswählen

// X Rotation
   result.x = point.x;
   result.y = rotatePoint.y + (cos(rotateAngle.x) * d.y - sin(rotateAngle.x) * d.z);
   result.z = rotatePoint.z + (sin(rotateAngle.x) * d.y + cos(rotateAngle.x) * d.z);
// Y Rotation
   result.x = rotatePoint.x + (cos(rotateAngle.y) * d.x - sin(rotateAngle.y) * d.z);
   result.y = point.y;
   result.z = rotatePoint.z + (sin(rotateAngle.y) * d.x + cos(rotateAngle.y) * d.z);
// Z Rotation
   result.x = rotatePoint.x + (cos(rotateAngle.z) * d.x - sin(rotateAngle.z) * d.y);
   result.y = rotatePoint.y + (sin(rotateAngle.z) * d.x + cos(rotateAngle.z) * d.y);
   result.z = point.z;
Und jetzt will ich die Gleichungen zusammenfügen...
Nur hab ich das nicht ganz hinbekommen:

Code: Alles auswählen

// X + Y + Z Rotation
   result.x = rotatePoint.x + (cos(rotateAngle.y) * cos(rotateAngle.z) * d.x - sin(rotateAngle.z) * d.y - sin(rotateAngle.y) * d.z);
   result.y = rotatePoint.y + (sin(rotateAngle.z) * d.x + cos(rotateAngle.z) * cos(rotateAngle.x) * d.y - sin(rotateAngle.x) * d.z);
   result.z = rotatePoint.z + (sin(rotateAngle.y) * d.x + cos(rotateAngle.y) * cos(rotateAngle.x) * d.z + sin(rotateAngle.x) * d.y);
Danke voraus,
Andreas
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag von Andreas_S »

Kann mir da keiner helfen? ...
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Das hier ist weder ein Chat noch eine 24/7-Supporthotline, sondern ein Forum.
Durchaus möglich, dass du ein paar Stunden oder Tage auf ne Antwort warten musst.

Geduld, gut Ding will Weile haben! :wink:
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag von Andreas_S »

Wollte nur rasch meinen Code weiterschreiben und war ein bischen ungeduldig...

Sorry
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

1 Stunde :shock: :freak:

Kein Wunder das du keine Antwort bekommst :)

Wieso lässt du den Code nicht einfach in 3 Formeln aufgeteilt?

Ansonsten kann ich dir empfehlen, die Schreibweise zu vereinfachen und cos(rotateanglex) einfach durch a sin(rotateangle) durch b usw zu erstzen, dann ist es am Ende ganz einfach die übersichtlicheren Buchstaben zu ordnen und zusammenzufügen...

Eine Beschreibung (Skizze) was die Bezeichnungen im einzelnen Bedeuten währ auch nicht schlecht....

Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag von Andreas_S »

sorry... hatte vergessen die Variablen und den Sinn dieser Gleichungen zu erklären...
// X Rotation
result.x = point.x;
result.y = rotatePoint.y + (cos(rotateAngle.x) * d.y - sin(rotateAngle.x) * d.z);
result.z = rotatePoint.z + (sin(rotateAngle.x) * d.y + cos(rotateAngle.x) * d.z);
// Y Rotation
result.x = rotatePoint.x + (cos(rotateAngle.y) * d.x - sin(rotateAngle.y) * d.z);
result.y = point.y;
result.z = rotatePoint.z + (sin(rotateAngle.y) * d.x + cos(rotateAngle.y) * d.z);
// Z Rotation
result.x = rotatePoint.x + (cos(rotateAngle.z) * d.x - sin(rotateAngle.z) * d.y);
result.y = rotatePoint.y + (sin(rotateAngle.z) * d.x + cos(rotateAngle.z) * d.y);
result.z = point.z;
Ich habe einen Punkt irgendwo in einem Koordinatensystem. Dann hab ich noch einen Rotationsmittelpunkt der auch irgendwo im Koordinatensystem ist.
Jetzt will ich den Punkt um den Rotationspunkt drehen, und hab mir überlegt wie das gehn könnte. Ich habe bemerkt das die Formel "neuX = cos(Winkel) * y - sin(Winkel) * x" nur funktioniert wenn x und y der abstand zum Nullpunkt ist.
So hab ich einfach die absolute Position des Rotationspunktes von der absoluten Position des Punktes abgezogen. So bekomm ich das gewollte system un muss schussendlich nur noch die Position des Rotationspunktes dazuzählen...


Die Variablen:

result. -> neue absolute Position des rotierten Punktest
d.x -> der relative Abstand des absoluten Punktes vom absoluten rotations Punktes
rotatePoint. -> die absolute Position des rotations Mittelpunktes
rotateAngle. -> der Winkel von der anfangs Position ( -> d. ) zur neuen Position


//edit

Warum ich nicht die drei Formeln aufgespalten lassen soll? Das ist doch klar :?
Weil ich eine zusammenhängende Rotation will... Es bringt ja nicht viel wenn ich nur eine Achse rotieren kann, ich will ja alle gleichzeitig rotieren...
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8808
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Im 3D-Raum musst du nur 2 Achsen drehen um einen Punkt zu rotieren. Im
2D-Raum brauchst du ja auch nur einen Winkel. Im nD-Raum braucht man
(n-1) Winkel um einen Punkt zu rotieren.
Deinen Kopf bewegst du ja auch nur nach links und rechts und nach oben und
nach unten. Wenn du ihn schief hälst, nennt man das zwar umgangssprachlich die Z-Achse, ist aber in Wirklichkeit nur die Drehung um die Achse, die du vorher mit der X- und Y-Achse positioniert hast.

Sozusagen drehst du deinen Kopf auf der X- und Y-Achse und die Z-Rotation
ist dann die um deine Nase. :D
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Hi,

kannst du die Gleichungen nicht einfach addieren?

Also so:
result.x = point.x rotatePoint.x + (cos(rotateAngle.y) * d.x - sin(rotateAngle.y) * d.z) rotatePoint.x + (cos(rotateAngle.z) * d.x - sin(rotateAngle.z) * d.y)

Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Also in meinem uralten version ein Software 3D-Renderer zu basteln sah das so aus:

Code: Alles auswählen

  xx.f = _Cos(wy) * _cos(wz) * x1 - _cos(wy) * _sin(wz) * y1 + _sin(wy) * z1 
  yy.f = (_cos(wx) * _sin(wz) + _sin(wx) * _sin(wy) * _cos(wz)) * x1 + (_cos(wx) * _cos(wz) - _sin(wx) * _sin(wy) * _sin(wz)) * y1 - _sin(wx) * _cos(wy) * z1 
  zz.f = (_sin(wx) * _sin(wz) - _cos(wx) * _sin(wy) * _cos(wz)) * x1 + (_sin(wx) * _cos(wz) + _cos(wx) * _sin(wy) * _sin(wz)) * y1 + _cos(wx) * _cos(wy) * z1 
Allerdings kann ich mich daran erinnern, das ich die Formeln nicht selber geschrieben hab, sondern irgendwo im Inet gefunden hatte. Kann dir also leider nicht sagen, wie man darauf kommt.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Kannst du noch etwas näher erläutern wofür die einzelnen Variabeln stehen?

Vor allem wieso die Winkelfunktionen einen Unterstrich haben?

Sind die x1, y1, z1 Werte die Ursprungspunkte?

Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Antworten