Rotation zum Richtungsvektor

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
DeRaaZuul
Beiträge: 15
Registriert: 19.03.2008, 01:25

Rotation zum Richtungsvektor

Beitrag von DeRaaZuul »

Huhuz ,
ich habe ein kleines aber feines Problem ;) Ich habe einen Pfeil der nach unten zeigt als Modell .Nun möchte ich den Pfeil z.B. auf den Vector(1|0|0) zeigen lassen , sprich so rotieren das er auf diesen Vector zeigt.
Ich habe das Problem so gelöst das ich die D3DXMatrixLookAtLH Funktion nehmen und als pEye die Position des Pfeiles angebe und pAt ist bei mir der Vector wo der Pfeil hinzeigen soll , pUp = (0|1|0).Die Matrix die da rauskommt verrechne ich mit dem Modell bevor es gerendert wird.Das ganze funktioniert aber leider nicht , wenn ich z.B. pAt auf (1|0|0) setze zeigt der Pfeil trotzdem sturr nach unten.Sollte ich staat der D3DXMatrixLookAtLH vllt eine andere Möglichkeit nehmen damit der Pfeil sich entsprechend zum Punkt rotiert?
Bye bye
Benutzeravatar
Zudomon
Establishment
Beiträge: 2139
Registriert: 25.03.2009, 08:20
Kontaktdaten:

Re: Rotation zum Richtungsvektor

Beitrag von Zudomon »

Hi,
ich brauchte diese Funktion die Tage auch mal, um könnte dir eventuell helfen.
Allerdings bin ich mir nicht mehr sicher, wohin der Pfeil am Anfang zeigen müsste, aber ich glaube auf (0, 0, 1) :oops:

Der Funktion wird ein 3D-Vektor übergeben und daraus wird die Rotationsmatrix gebaut:
Übergebener Vektor: v
Vektor u = (0, 1, 0)
Vektor r = (1, 0, 0)

vz = normalize(v) // Vektor v normalisieren
if (abs(dot(vz, u)) < 0.99) { // Einen zweiten Vektor bestimmen
vy = u;
} else {
vy = r;
}
vx = normalize(cross(vy, vz)); // Kreuzprodukt bilden und normalisieren ( eventuell braucht man nicht normalisieren, bin mir aber nicht sicher )
vy = normalize(cross(vz, vx)); // Kreuzprodukt bilden und normalisieren ( eventuell braucht man nicht normalisieren, bin mir aber nicht sicher )


Nun kann man daraus die Matrix bauen:
vx.x vx.y vx.z 0
vy.x vy.y vy.z 0
vz.x vz.y vz.z 0
0 0 0 1

Falls es nicht funktioniert, könnte es sein, dass ich die Zeilen und Spalten der Matrix vertauscht habe. :oops:

Gruß
Zudo
DeRaaZuul
Beiträge: 15
Registriert: 19.03.2008, 01:25

Re: Rotation zum Richtungsvektor

Beitrag von DeRaaZuul »

Vielen dank , werde das gleich auch ausprobieren =)
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 20:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: Rotation zum Richtungsvektor

Beitrag von Aramis »

In einem Paper namens 'Efficiently Building a Matrix to Rotate One Vector to Another' ist ein Verfahren zu finden, mit dem sich extrem schnell eine Matrix finden lässt, die einen beliebigen Richtungsvektor in einen anderen überführt.

Alex
joeydee
Establishment
Beiträge: 724
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: Rotation zum Richtungsvektor

Beitrag von joeydee »

Soviel ich weiß bezieht sich so ziemlich alle LookAt-Funktionen auf die Z-Achse (lokale Sichtachse einer Kamera). Einen Pfeil der nach unten schaut drehst du damit also nur um seine eigene Achse. Lass ihn im Nullpunkt beginnen und in Richtung Z schauen. Oder du musst die Richtungen umdenken: pAt(0/1/0), pUp(-1/0/0) oder so ähnlich könnte klappen.

Mit anderen Worten: pAt ist der lokale Z-Vektor, pUp der lokale Y-Vektor und pRight wäre der lokale X-Vektor deines Modells.
Antworten