Rysuję scenę, w której kamera swobodnie porusza się po wszechświecie. Klasa kamery śledzi punkt widzenia (lub spojrzenie na ), pozycję kamery i wektor w górę. Te wektory / punkty są następnie przekazywane do gluLookAt.
Przesuwanie i powiększanie są prawie banalne do wdrożenia. Jednak widzę, że obrót o spojrzenie na punkcie być znacznie większy problem. Chcę napisać funkcję Camera.rotate, która ma 2 kąty, jeden, który obraca się w górę / w dół i jeden, który obraca się w lewo / prawo wzdłuż wyimaginowanej sfery, która jest wyśrodkowana wokół spojrzenia w punkcie.
Czy jest na to łatwy sposób?
Przeczytałem (krótko) o czwartorzędach, ale chciałem sprawdzić, czy istnieje łatwiejsze rozwiązanie, biorąc pod uwagę stosunkowo prostą konstrukcję mojej sceny.
Odpowiedzi:
To, o co prosisz, nazywa się rotacją Arcball. Czwartorzędy są łatwym rozwiązaniem tylko wtedy, gdy zrozumiesz, jak działają. Możesz to samo osiągnąć bez czwartorzędów.
Warunki wstępne
Czy wiesz jak ogólnie obracać obiekty? Powiedzmy, że masz obiekt u źródła. Czy wiesz, jak go obracać (wskazówka: pomnóż przez jakąś macierz obrotu)? Jeśli tak, to zakładam, że wiesz, co się stanie, jeśli najpierw przetłumaczysz obiekt, a następnie go obrócisz?
Musisz wiedzieć, jak obliczyć macierz obrotu z osi kąta (proste jak ciasto, spójrz na mnóstwo równań online, wiele z nich daje również kod)
Rozwiązanie
Ostrzeżenia
Będziesz musiał uważać na pewne przypadki lub osobliwości, w których aparat przestanie działać. Na przykład patrząc prosto w dół / w górę. Pozwolę ci dowiedzieć się, jak sobie z tym poradzić.
EDYCJA 1: Jak ponownie obliczyć wektory ortonormalne kamery
Znasz już kierunek kamery ((cameraPos - focusPoint) .normalize ()). Załóżmy teraz, że kamera jest skierowana w górę o + Y (lub w / e aktualna oś skierowana w górę na świecie to ... to zależy od ciebie). Teraz wystarczy przekroczyć kierunek z góry , aby uzyskać prawo . Gotowy? Nie! Twój wektor do góry nie jest już prostopadły do pozostałych dwóch. Aby to naprawić, krzyż prawo z kierunku i masz swój nowy up .
Zauważ, że Gram-Schmidt jest naprawdę tym, co powinno być używane do ortonormalizacji wektorów.
Ponownie zwróć uwagę na zastrzeżenia, ponieważ w niektórych przypadkach to nie zadziała ( kierunek jest na przykład równoległy do góry ).
źródło
normalize(up ^ camFocusVector)
(lub przeciwnie, jeśli leworęczny).Potrzebna jest typowa kamera ArcBall, która jest zasadniczo kamerą, która utrzymuje lokalizację docelową i pozwala przesuwać kamerę w „sferyczny” sposób wokół tego celu.
Jest w XNA, ale IIRC korzystałem już z tej implementacji i działał całkiem dobrze:
http://roy-t.nl/index.php/2010/02/21/xna-simple-arcballcamera/
źródło
Oto mój kod do obracania się wokół punktu, bardzo często go wykorzystuję.
źródło
Ten bardzo prosty algorytm do osiągnięcia tego jest niesamowity:
Będąc P centralnym punktem, który chcesz obrócić (punkt „patrz” lub „cel”):
Użyłem go i jest fajny.
Źródło znalezione na stronie siostrzanej Stackoverflow: /programming/287655/opengl-rotating-a-camera-around-a-point
źródło