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

Aktuelle Zeit: Di Jul 22, 2025 11:47

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Jan 05, 2011 17:56 
Offline
DGL Member

Registriert: Mi Jan 05, 2011 03:05
Beiträge: 5
Hallo erstmal,

ich bin neu hier im Forum also stell ich mich mal in 1-2 Sätzen vor. Ich bin 18 Jahre alt und hab vor etwa 3 Monaten mit OpenGL und auch WebGL angefangen. Zur Zeit will ich ein kleines 3D-Spiel mit WebGL entwickeln. Ich bin zur Zeit bei der Kollisionserkennung angelangt. Das funktioniert bisher auch ziehmlich gut. Jedoch bleiben die boundingboxes unrotiert weil ich keine Ahnung habe wie ich dann die Eckkoordinaten berechnen kann.

Wenn mir jemand eine Formel geben könnte die etwa so aussieht wär ich sehr dankbar:

x_coord = alle winkel (x_rotation, y_rotation, z_rotation) verechnen + old_x

dass für x, y, z

Und noch ne kleine Frage nebenbei, Gibt es irgendwo eine Übersicht, bei der die wichtigsten Formeln zusammengestellt sind?

mfg

Yanko


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jan 05, 2011 19:03 
Offline
DGL Member

Registriert: Di Okt 13, 2009 17:25
Beiträge: 365
Programmiersprache: C++
Hey,
zum Vorstellen der eigenen Person gibt es das Member-Forum.

Zum Problem:
Yanko hat geschrieben:
x_coord = alle winkel (x_rotation, y_rotation, z_rotation) verechnen + old_x
Alleine diese Zeile ist schon problematisch, da die drei Winkel alleine keine eindeutige Rotation beschreiben. Es kommt nämlich immer darauf an, in welcher Reihenfolge du die Rotationen ausführst. Nimm dir mal einen Würfel und rotiere ihn erst um die X-, dann um die Y- und dann um die Z-Achse. Dann wiederholst du das ganze, aber diesmal fängst du mit der Y-Achse an. Du wirst sehen, dass das Endergebnis nicht das gleiche ist.

Deshalb gibt es in der Mathematik und in OpenGL sogenannte Matrizen, mit denen sich eine Rotation eindeutig beschreiben lässt. Die lassen sich aber nicht "mal eben" erklären, ich verweise deshalb mal auf das Tutorial_Matrix2 und Tutorial_Lektion_3.

Die Eckpunkte deiner BoundingBox kannst du mit der Rotationsmatrix transformieren und bekommst als Ergebnis den "gedrehten" Vektor.


Zuletzt geändert von mrtrain am Mi Aug 31, 2011 21:17, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jan 05, 2011 19:24 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Da du WebGL benutzt wirst du diese Rotations-Matrix sowieso schon irgendwo haben. Letztlich musst du diese also nur auf die 8 Vertices der BoundingBox anwenden. Achtung: Für den Fall das deine BoundingBox an den Koordinatenachsen ausgerichtet ist....nach der Rotation ist das natürlich nicht mehr der Fall. Für den Fall das du wieder eine Ausrichtung an den Achsen brauchst kannst du eine neue BoundingBox von den 8 Vertices der rotierten Box berechnen. Alternativ kannst du auch die Matrix auf die Vertices deines Meshes anwenden und davon die Box berechnen. Letzteres liefert natürlich eine genauere Box, aber die Berechnung dauert auch viel länger.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jan 05, 2011 19:35 
Offline
DGL Member

Registriert: Mi Jan 05, 2011 03:05
Beiträge: 5
Also bei mir wird zuerst verschoben, dann um die x-Achse und danach um die y-Achse rotiert.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jan 05, 2011 20:13 
Offline
DGL Member

Registriert: Di Okt 13, 2009 17:25
Beiträge: 365
Programmiersprache: C++
Das Einfachste ist es dann, eine Matrix für die Verschiebung (Translation), und für jede Rotation jeweils eine Matrix zu bauen, die dann so aussehen:
Code:
  1. Translation   Rotation X         Rotation Y         Rotation Z
  2. | 1 0 0 0 |   | 1 0    0   0 |   | cos 0 -sin 0 |   | cos  sin 0 0 |
  3. | 0 1 0 0 |   | 0 cos  sin 0 |   | 0   1 0    0 |   | -sin cos 0 0 |
  4. | 0 0 1 0 |   | 0 -sin cos 0 |   | sin 0 cos  0 |   | 0    0   1 0 |
  5. | x y z 1 |   | 0 0    0   1 |   | 0   0 0    1 |   | 0    0   0 1 |

Dann multiplizierst du die Matrizen miteinander und erhälst die resultierende Matrix, mit der du deine Vektoren transformieren kannst. Und wie oben erläutert, ist es dabei wichtig, in welcher Reihenfolge du die Matrizen multiplizierst. :)


Zuletzt geändert von mrtrain am Mi Aug 31, 2011 21:18, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jan 05, 2011 22:51 
Offline
DGL Member

Registriert: Mi Jan 05, 2011 03:05
Beiträge: 5
Eine Frage hab ich jetzt noch.

Ich habe die Matrizen miteinander in der Reihenfolge multipliziert, in der sie bei mir angewandt werden. Jetzt hab ich mehrere Punkte mit x, y und z. Wie soll ich diesen 3dimensionalen Vektor mit der 4x4 Matrix multiplizieren? Soll ich es so:

Code:
X
Y
Z
0


oder so:

Code:
X X X X
Y Y Y Y
Z Z Z Z
0 0 0 0


machen oder doch ganz anders?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jan 05, 2011 23:11 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 29, 2003 00:11
Beiträge: 436
Erste Variante.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jan 06, 2011 00:05 
Offline
DGL Member

Registriert: Mi Jan 05, 2011 03:05
Beiträge: 5
Habe jetzt einen Vektor mit Termen erhalten.

Ist es jetzt so das der 1. Term die neue X-Koordinate, der 2. die Y-Koordinate und der 3. die Z-Koordinate ist?

Wenn ja dann kann ich ja so alles berechnen und ich wäre damit erstmal fertig.

Danke an alle die geholfen haben.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jan 06, 2011 09:05 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Erste Variante.

Nicht ganz. Die letzte Stelle muss mit 1 ergänzt werden, sonst wird die Translation nicht korrekt berücksichtigt.

Zitat:
Ist es jetzt so das der 1. Term die neue X-Koordinate, der 2. die Y-Koordinate und der 3. die Z-Koordinate ist?

Jup, zumindest in diesem Fall. Bei einer Projektion ("nach hinten kleiner werden") brauchst du auch die 4. Zeile der Matrix.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jan 06, 2011 10:48 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Zitat:
Ich habe die Matrizen miteinander in der Reihenfolge multipliziert, in der sie bei mir angewandt werden.
abhängig davon, wie die Matrixmultiplikation implementiert ist, kann es auch sein, dass man sie in genau der anderen Reihenfolge multiplizieren muss (findet man auch recht häufig). Also wenn nicht das richtige rauskommen sollte, mal andersherum ausprobieren.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jan 06, 2011 17:17 
Offline
DGL Member

Registriert: Mi Jan 05, 2011 03:05
Beiträge: 5
Bin jetzt mit der Kollision fertig, funktioniert wie gewünscht.


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.008s | 15 Queries | GZIP : On ]