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
- Uzyskaj kamery w górę i odpowiednie wektory. Pamiętaj, że powinny zostać znormalizowane.
- Przenieś wektor z punktu ostrości do aparatu (camPosition - Focus). To jest wektor, który będziesz obracać. Nazwijmy to camFocusVector .
- Zdecyduj, ile chcesz obrócić w odchyleniu / skoku względem aparatu
- Utwórz dwie macierze obrotu. Matryca pierwszego obrotu wykorzysta górną część kamery jako kąt osi i odchylenia , który zdecydowałeś. 2. macierz obrotu użyje prawo aparatu jak i osi pitch kątem, że zdecydowałeś.
- Teraz obróć camFocusVector za pomocą nowych matryc obrotu. To jest teraz Twoja nowa pozycja kamery względem początku. Oczywiście chcemy, aby był on względny w stosunku do punktu skupienia ...
- Dodaj pozycję punktu ostrości do camFocusVector . To jest teraz nowa pozycja twojego aparatu. Przetłumacz odpowiednio swój aparat.
- Na koniec poproś kamerę, aby skupiła się na punkcie ostrości, wywołując funkcję lookAt ()
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 ).