Odpowiedzi:
Możesz rozłożyć czwartorzęd na zestaw kątów odchylenia / pochylenia / przechyłu, ale zwykle jest to przesada.
Zamiast tworzyć takie czwartorzędy w ten sposób:
cameraOrientation = cameraOrientation * framePitch * frameYaw;
Spróbuj tego:
cameraOrientation = framePitch * cameraOrientation * frameYaw;
Wówczas nigdy nie będzie generować przechylenia / przechyłu i jest to równoważne z przechowywaniem odchylenia i pochylenia osobno
framePitch
i frameYaw
float
rodzaje? Byłbym również wdzięczny za wyjaśnienie pierwszego zdania.
cameraOrientation
, framePitch
i frameYaw
to wszystkie kwaterniony (każdy quaternion wynosi 4 pływaków lub dwuosobowe).
To był problem, który miałem przez jakiś czas i nie mogłem znaleźć żadnych odpowiedzi, więc pomyślałem, że opublikuję go tutaj.
To jest właściwie dość proste. Najprawdopodobniej wykonujesz rotacje w następujący sposób:
currentDirection * newRotation;
Ale robienie tego w ten sposób też nie działa.
newRotation * currentDirection;
Co musisz zrobić, to zrobić to w pierwszej kolejności dla obrotów w górę iw dół, a w drugiej kolejności dla obrotów w bok.
Dla mnie było tak:
if (keyboard.IsKeyDown(Keys.Up))
Direction = Direction * Quaternion.CreateFromAxisAngle(new Vector3(1, 0, 0), TurnSpeed);
if (keyboard.IsKeyDown(Keys.Down))
Direction = Direction * Quaternion.CreateFromAxisAngle(new Vector3(-1, 0, 0), TurnSpeed);
if (keyboard.IsKeyDown(Keys.Left))
Direction = Quaternion.CreateFromAxisAngle(new Vector3(0, 0, 1), TurnSpeed) * Direction;
if (keyboard.IsKeyDown(Keys.Right))
Direction = Quaternion.CreateFromAxisAngle(new Vector3(0, 0, -1), TurnSpeed) * Direction;
Z tego powodu, pierwszy sposób ma obrót w stosunku do bieżącego kierunku na boki, który chcesz w górę i w dół, ale nie chcesz tego dla obrotów na boki, dlatego potrzebna jest druga kolejność.
W przypadku kamery FPS zwykle nie chcesz się przechylać i są ograniczone do skoku +/- 90 stopni, więc po prostu śledzę bieżący stan za pomocą kątów odchylenia i pochylenia. Pełna moc czwartorzędów nie jest w tym naprawdę pomocna.
Nadal możesz przekonwertować kąty odchylenia / skoku na i od czwartorzędów, na wypadek gdybyś chciał przejść między kamerą FPS a kamerami animowanymi przy użyciu interpolacji klatek kluczowych czwartorzędu lub czegoś podobnego.