Three.js - wie funktionieren Up-Vektoren mit lookAt ()?

8

Ich versuche zu verstehen, wie up-Vektoren und lookAt () in three.js zusammenarbeiten. Ich setze den Up-Vektor dieses axisHelper, so dass die Y-Achse immer auf das Zielgeo zeigt, welches die Position des Up-Vektors markiert. Es funktioniert wie erwartet für X und Y und rotiert die Achsen um die Z-Achse. und wenn ich versuche, den Z-Wert des Aufwärts-Vektors einzustellen, würde ich erwarten, dass sich die Achsen um die X-Achse drehen, aber nichts passiert.

Ссылка [Bearbeiten: Ich habe Geo hinzugefügt, um die Zielposition anzuzeigen.]

Ich habe eine dat.gui-Schnittstelle, die den up-Vektor manipuliert, um zu demonstrieren, aber das Problem besteht, wenn ich den Vektor auch manuell setze.

Ich vermute, dass das Problem in der Nähe von Zeile 74 liegt:

%Vor%

Wenn ich den up-Vektor aktualisiere, befehle ich dem axisHelper, seine Ausrichtung auf dem Bildschirm zu aktualisieren, indem ich sein lookAt () um seine Z-Achse nach unten korrigiere. Ändern der X und Y funktioniert wie erwartet, warum nicht das Z?

(Dies ist auch der Fall, wenn ich geo anstelle eines axisHelper verwende: Ссылка )

    
meetar 10.12.2013, 22:12
quelle

3 Antworten

7

Wenn Sie Object.lookAt( vector ) aufrufen, wird das Objekt so gedreht, dass seine interne z-Achse auf das Ziel vector zeigt.

Aber das reicht nicht aus, um die Ausrichtung des Objekts anzugeben, da das Objekt selbst immer noch auf seiner z-Achse "gedreht" werden kann.

Also wird das Objekt dann "gedreht", so dass seine interne y-Achse in der Ebene seiner inneren z-Achse und dem up -Vektor liegt.

Der Zielvektor und der Vektor up sind zusammen ausreichend, um die Ausrichtung des Objekts eindeutig anzugeben.

drei.js r.63

Tipp: Eine Achse in threw.js sollte immer eine Einheitslänge haben; Achten Sie darauf, axis.normalize () in Ihrem Code aufzurufen.

    
WestLangley 11.12.2013, 15:55
quelle
2

Ich nehme an, dein Titel bedeutete, dass du auf Z anstatt auf X drehst?

Wie auch immer, der Übeltäter scheint axes.lookAt(new THREE.Vector3(0, 0, 1)); zu sein, wenn Sie das für alle Methoden in axes.lookAt(new THREE.Vector3(0, 1, 0)); ändern, dann dreht sich Y nicht wie erwartet. Sie weisen den Achsenhelfer an, eine bestimmte Achse (in Ihrem Fall Z) nach unten zu sehen. Daher funktioniert der Z-Wert nicht.

Gibt es ein Beispiel dafür, was Ihr zu erreichen versucht, das uns helfen könnte?

Vielleicht kann jemand anders ein bisschen mehr erklären, was passiert. Hoffentlich wird meine Antwort Sie in die richtige Richtung drücken.

    
Grant 10.12.2013 23:47
quelle
0

So habe ich das Problem verstanden:

Die lookAt- und up-Vektoren bestimmen die Ausrichtung eines Objekts wie folgt:

  1. Der lookAt-Vektor wird FIRST angewendet, wodurch die X- und Y-Drehung festgelegt und die Richtung der Z-Achse des Objekts gesperrt wird.
  2. DANN bestimmt der Aufwärtsvektor, wie sich das Objekt um die Z-Achse dreht, um die Richtung festzulegen, in die die Y-Achse des Objekts zeigt - es wirkt sich nicht auf die X- und Y-Drehung aus.

In meinem Beispiel sieht der axisHelper seine blaue Z-Achse in Richtung des LookAt-Vektors, der ein Punkt im Raum bei (0, 0, -1) ist - also haben die X- und Y-Rotationen bereits eingestellt . Jetzt müssen Sie nur noch herausfinden, wie Sie den axisHelper um seine Z-Achse drehen, was bedeutet, dass die X- und Y-Punkte des Aufwärtsvektors gesetzt werden. Wenn Sie den Aufwärtsvektor entlang der Z-Achse vorwärts und rückwärts bewegen, ändert sich nichts.

Hier ist eine Geige mit einer Demo, die diese Beziehung veranschaulicht: der blaue Pfeil ist die LookAt-Achse und der grüne Pfeil ist die obere Achse.

Ссылка

%Vor%     
meetar 12.12.2013 21:28
quelle

Tags und Links