Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Anonymous

unregistriert

1

19.05.2004, 14:46

Transf. Matrix berechnen für "Ausrichtung" eines O

Hallo,

ich habe eine Frage bezüglich der Berechnung einer Transformationsmatrix. Ich habe ein Objekt im 3D Raum. z.B. irgendein Mesh, welches eine "Ausrichtung" besitzt. Das ist nichts weiter als ein Richtungsvektor, der z.B. die lokale Z Achse des Objektes beschreiben soll - also quasi angibt, in welche Richtung das Objekt blickt.

Nun benötige ich ja die korrekte Transformationsmatrix für die DirectX Transformationspipline, damit das Objekt in die Blickrichtig (z.B. vektor(0,1,1) ) "sieht", also gedreht wird.

Wie berechne ich solch eine Matrix, die mein Objekt in irgendeine durch einen Vektor angegebene Richtung dreht?


Vielen Dank für Eure Hilfe!


Ben

Till

Alter Hase

Beiträge: 378

Wohnort: Lincoln College, Oxford

Beruf: Student

  • Private Nachricht senden

2

19.05.2004, 15:16

Was meinst du mit "eine Matrix, die mein Objekt in irgendeine durch einen Vektor angegebene Richtung dreht"?
Die Drehsache kannst du machen, wie du willst, wenn du alle deine drei Achsen deines relativen Koordinatensystems hast (des Meshs), kannst du die sog. Achsenmatrix benutzen (in die erste Zeile kommt die x-Achse, in die zweite die y-Achse und die dritte die z-Achse). Diese Matrix beschreibt nun sozusagen die "Ausrichtung" des Meshs im abs. Koordinatensystem! Multupliziert mit der Translationsmatrix erhälst du dann eine frische Transformationsmatrix!
DOMINVS ILLVMINATIO MEA
---
Es lebe unmanaged Code!
---
>> Meine Uni <<

Till

Alter Hase

Beiträge: 378

Wohnort: Lincoln College, Oxford

Beruf: Student

  • Private Nachricht senden

3

19.05.2004, 15:18

Ähh, noch 'ne Frage: hast du TriBase?
Dort kannst du das wunderbar an tbObject abgucken!
DOMINVS ILLVMINATIO MEA
---
Es lebe unmanaged Code!
---
>> Meine Uni <<

Anonymous

unregistriert

4

19.05.2004, 21:50

Till, ja Du hast mich genau richtig verstanden, und Deine Antwort hat mich auch schon weiter gebracht.

Würde mich freuen, wenn Du mir noch einige Sachen kurz erleutern könntest:

- Wenn ein Objekt sein eigenes relatives Koordinatensystem hat, wodurch wird dieses Repräsentiert? Wie in tbObject eben die drei Vektoren, die die Achsen angeben, ist das richtig?

- In der tbObject steht folgendes:

Quellcode

1
2
3
4
5
// Inverse Matrix berechnen, die zum Beispiel gebraucht wird, um
// eine absolute in eine zum Objekt relative Position oder Richtung
// umzurechnen

m_mInvMatrix = tbMatrixInvert(m_mMatrix);


Das verstehe ich irgendwie überhaupt nicht. Warum braucht man die inverse Matrix? Und was meint er damit, eine absolute Position zu einer dem Objekt relativen Pos. umrechnen, wozu könnte soetwas gebraucht werden?

- in tbObject gibt es zwei Methoden zum Rotieren, einmal absolut und relativ - wie kann ich mir den Unterschied zwischen diesen beiden Rotationen vorstellen?

- Ich verstehe die Funktion "tbVector3TransformNormal" nicht - welchen Unterschied gibt es zwischen der Transformation mit "tbVector3TransformCoords" und "tbVector3TransformNormal", bzw. wieso benötigt man bei der Transformation eines Normalvektors eine solch anderes Verfahren?


Ich weiß, das sind viele Fragen, und ich verlange natürlich nicht, dass alle beantwortet wreden (ich hoffe es natürlich ; ), Ihr habt sicher besseres zu tun, als mir hier alles beizupulen. Allerdings sind die Punkte oben Dinge, bei denen ich momentan wirklich nicht weiter komme, ich habe es natürlich schon versucht.
Deshalb würde ich mich sehr über Hilfe freuen!


Vielen Dank nochmals

Ben

5

20.05.2004, 00:29

Zitat

- Wenn ein Objekt sein eigenes relatives Koordinatensystem hat, wodurch wird dieses Repräsentiert? Wie in tbObject eben die drei Vektoren, die die Achsen angeben, ist das richtig?

Ein Koordinatensystem mit n Dimensionen wird immer durch n Vektoren mit n Werten beschrieben. (Das ist mla ne Aussage 8) ). Also ein 3D Koordsystem wird mit 3 3D Vektoren beschrieben. Wobei jeder Vektor eine Achse des Systems beschreibt.

Zitat

Das verstehe ich irgendwie überhaupt nicht. Warum braucht man die inverse Matrix? Und was meint er damit, eine absolute Position zu einer dem Objekt relativen Pos. umrechnen, wozu könnte soetwas gebraucht werden?
Bestes Beispiel. Du willst ein Punkt auf Kollision mit einem Komplexeren Modell prüfen. Das beste ist wenn du den Punkte in das Koordinatensystem des Modells Transformierst. Das ist schneller und einfacher. Durch die Inverse Worldmatrix des Modells kannst du den Punkt dann in das Koordsystem des Modells Transformieren.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Anonymous

unregistriert

6

20.05.2004, 20:14

Also so machts Die TriBase

Also Du hast ja die Tribase...

Du suchts glaube ich nach der methode "Align();"
und wenn man die aus tbObject "rauskapselt" siehts dann so aus

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
////////////////////////////////////////////////////////////////////
// Richtet das Objekt entlang einer Z-Achse aus
// gibt die entsprechende World-Matrix zurück
// m_vScaling und m_vPosition müssen deklariert sein
////////////////////////////////////////////////////////////////////
tbMatrix Align(const tbVector3& vZAxis, const tbVector3& vUp = tbVector3(0.0f, 1.0f, 0.0f))
{
    // z-Achse normalisieren und kopieren
    tbVector3 vZAxis = tbVector3NormalizeEx(vZAxis);

    // Die x-Achse ist das Kreuzprodukt aus y- und z-Achse
    tbVector3 vXAxis = tbVector3NormalizeEx(tbVector3Cross(vUp, m_vZAxis));

    // y-Achse berechnen
tbVector3 vYAxis = tbVector3NormalizeEx(tbVector3Cross(m_vZAxis, m_vXAxis));

    // Matrix = Skalierung * Rotation * Translation
    return(tbMatrixScaling(m_vScaling)
                              * tbMatrixAxes(vXAxis, vYAxis, vZAxis)
                              * tbMatrixTranslation(m_vPosition));
}

Anonymous

unregistriert

7

23.05.2004, 01:02

Zitat


Bestes Beispiel. Du willst ein Punkt auf Kollision mit einem Komplexeren Modell prüfen. Das beste ist wenn du den Punkte in das Koordinatensystem des Modells Transformierst. Das ist schneller und einfacher. Durch die Inverse Worldmatrix des Modells kannst du den Punkt dann in das Koordsystem des Modells Transformieren.


Das heisst, die Koordinaten meines Punktes werden dahingehend verändert, sodass es nun relativ zu dem größeren Objekt ist. Der mittelpunkt ist ja genau in der Mitte des großen Objektes, und somit ist der Welt-Ursprung für meinen Punkt auch genau dort. Ausserdem wird die Ausrichtung des Objektes auf den Punkt übertragen, sodass für den Punkt nun quasi das Koordinatensystem des großen Objektes die "Welt" Koordinaten sind.
Habe ich das so richtig verstanden?


Zitat


Also Du hast ja die Tribase...

Du suchts glaube ich nach der methode "Align();"


Ja genau, diese Methode habe ich gesucht. Wahrscheinlich verstehe ich das mathematische dahinter noch nicht so richtig. Ich frage mich z.B., warum man die inverse Matrix benötigt (bezüglich des Code Stückes, welches ich ganz oben gepostet habe)?

8

23.05.2004, 03:27

Zitat

Das heisst, die Koordinaten meines Punktes werden dahingehend verändert, sodass es nun relativ zu dem größeren Objekt ist. Der mittelpunkt ist ja genau in der Mitte des großen Objektes, und somit ist der Welt-Ursprung für meinen Punkt auch genau dort. Ausserdem wird die Ausrichtung des Objektes auf den Punkt übertragen, sodass für den Punkt nun quasi das Koordinatensystem des großen Objektes die "Welt" Koordinaten sind.
Habe ich das so richtig verstanden?
Genau so sieht es aus. Und jetzt kann man mit relativ einfachen Mittel auf Kollision prüfen :)
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Werbeanzeige