Mój aparat obraca się wokół punktu, gdy próbuję zmienić orientację. Jeśli obrócę aparat, powiedzmy, 30 stopni w osi Y, zamiast kamery patrząc 30 stopni w prawo, kamera obraca się wokół punktu, na który patrzy.Dlaczego mój aparat obraca się wokół punktu za pomocą tej matematyki?
o is the camera, A and B are 3D models. The lines show line-of-sight.
This is what I expect:
A B
| >/
|/
|/
|/
o
This is what actually happens:
A B
|\
| \
| \
| > \
o
Teraz, z mojego zrozumienia, aby poruszyć kamerą, muszę przenieść świat przez odwrotność tej wartości. Więc jeśli chcę przesunąć +1 w osi Z, przetłumaczyć świat -1 w osi Z. Ponieważ używam kwaternionów do reprezentowania orientacji, używam odwrotności kwaternionu kamery (ponieważ orientacje są zawsze jednostkowymi kwaterunkami, optymalizuję się za pomocą sprzężenia zamiast obliczać odwrotność), aby obrócić świat o odpowiednią wielkość.
Oto jak przekonwertować kwaternion do matrycy, gdzie Q jest odwrócony quaternion:
[1 - 2 * (q.y * q.y + q.z * q.z) 2 * (q.x * q.y - q.w * q.z) 2 * (q.x * q.z + q.w * q.y) 0]
|2 * (q.x * q.y + q.w * q.z) 1 - 2 * (q.x * q.x + q.z * q.z) 2 * (q.y * q.z - q.w * q.x) 0|
|2 * (q.x * q.z - q.w * q.y) 2 * (q.y * q.z + q.w * q.z) 1 - 2 * (q.x * q.x + q.y * q.y) 0|
[0 0 0 1]
Następnie ustawić element translacji matrycy:
[... ... ... -x]
|... ... ... -y|
|... ... ... -z|
[0 0 0 1]
i wreszcie Powielam to na stos matrycy widoku modelu, a następnie renderuję wszystkie moje obiekty. Jestem prawie pewien, że ta matematyka jest poprawna, ale nie daje wyników, których oczekiwałem. Najwyraźniej problemem są naprzód i prawe wektory, więc jedyne pytanie brzmi: dlaczego się mylą i jak należy je ustawić, jeśli chcę uzyskać oczekiwane rezultaty. Dzięki.
EDYTOWANIE: Znalazłem rozwiązanie z this guy's quaternion camera class. Najpierw skonstruowałem macierz rotacyjną, tak jak robiłem to wcześniej, ale potem pobieram wektory kolumnowe macierzy z pierwszej, drugiej i trzeciej kolumny (odpowiednio xa, ya i za). Potem zestaw składowej translacyjnej matrycy, jak poniżej:
[... ... ... -xa.dotProduct(cameraPos)]
|... ... ... -ya.dotProduct(cameraPos)|
|... ... ... -za.dotProduct(cameraPos)|
[... ... ... ... ]
następnie otrzymana osnowa może być pomnożona na stos ModelView matrycy i działa doskonale.
Dokonaj edycji rozwiązania i zaakceptuj je. W ten sposób oznaczamy tutaj rozwiązywane pytania. Myślę też, że zasługujesz na wyjaśnienie, co się dzieje. Napiszę na to odpowiedź. – datenwolf