[C++][OpenGL] Kąt patrzenia

bajos
Użytkownik
Użytkownik
Posty: 7
Rejestracja: 24 lut 2014, o 17:40
Płeć: Mężczyzna
Lokalizacja: Częstochowa
Podziękował: 4 razy

[C++][OpenGL] Kąt patrzenia

Post autor: bajos »

Witam

Piszę silnik do gry i chcę zrobić kamerę do poruszania po świecie taką, żeby dało się obracać do okoła za pomocą myszy. Jak mogę obliczyć kąt patrzenia względem poziomu znając pozycję obserwatora (x, y, z) i pozycję obiektu, na który obserwator patrzy (x, y, z)? Załączam obrazek, w którym przedstawiłem m/w o co mi chodzi.
Ostatnio zmieniony 24 lut 2014, o 19:33 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
luka52
Użytkownik
Użytkownik
Posty: 8601
Rejestracja: 1 maja 2006, o 20:54
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 47 razy
Pomógł: 1816 razy

[C++][OpenGL] Kąt patrzenia

Post autor: luka52 »

Bierzesz dwa wektory - jeden referencyjny, a drugi wskazujący obserwowany punkt.
Korzystając z iloczynu skalarnego:
\(\displaystyle{ \vec a \circ \vec b = |\vec a| \cdot | \vec b | \cos \theta = a_x b_x + a_y b_y + a_z b_z}\), można wyliczyć \(\displaystyle{ \cos \theta}\) a następnie \(\displaystyle{ \theta}\) (znamy wspołrzędne wektorów a i b oraz ich długości).
bajos
Użytkownik
Użytkownik
Posty: 7
Rejestracja: 24 lut 2014, o 17:40
Płeć: Mężczyzna
Lokalizacja: Częstochowa
Podziękował: 4 razy

[C++][OpenGL] Kąt patrzenia

Post autor: bajos »

Mógłbyś to prościej wytłumaczyć bo ja z tego zapisu nic nie rozumiem, niestety?
luka52
Użytkownik
Użytkownik
Posty: 8601
Rejestracja: 1 maja 2006, o 20:54
Płeć: Mężczyzna
Lokalizacja: Kraków
Podziękował: 47 razy
Pomógł: 1816 razy

[C++][OpenGL] Kąt patrzenia

Post autor: luka52 »

->
Załóżmy, że \(\displaystyle{ \vec a = (a_x, a_y, a_z) = (1, 0, 0)}\) oraz \(\displaystyle{ \vec b = (b_x, b_y, b_z) = (16, 18, 0)}\), to z jednej strony:
\(\displaystyle{ \vec a \circ \vec b = |\vec a| |\vec b| \cos \theta = \sqrt{1^2 + 0^2 + 0^2} \cdot \sqrt{16^2 + 18^2 + 0^2} \cos \theta = 2 \sqrt{145} \cos \theta}\)
Z drugiej:
\(\displaystyle{ \vec a \circ \vec b = a_x b_x + a_y b_y + a_z b_z = 1 \cdot 16 + 0 \cdot 18 + 0 \cdot 0 = 16}\)
Porównując mamy:
\(\displaystyle{ \cos \theta = \frac{8}{\sqrt{145}}}\)
Taka wartość kosinusa odpowiada kątowi między wektorami a i b (oznaczonemu tu jako \(\displaystyle{ \theta}\)) równemu ok. \(\displaystyle{ 48^\circ}\).
bajos
Użytkownik
Użytkownik
Posty: 7
Rejestracja: 24 lut 2014, o 17:40
Płeć: Mężczyzna
Lokalizacja: Częstochowa
Podziękował: 4 razy

[C++][OpenGL] Kąt patrzenia

Post autor: bajos »

Dzięki za pomoc . Jutro (właściwie dzisiaj) spróbuję to jakoś zrozumieć bo będzie mi to potrzebne w silniku gry.
Fibik
Użytkownik
Użytkownik
Posty: 971
Rejestracja: 27 wrz 2005, o 22:56
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 11 razy
Pomógł: 75 razy

[C++][OpenGL] Kąt patrzenia

Post autor: Fibik »

Tu akurat będzie kąt do płaszczyzny XY.

Wektor obserwator - obiekt: v,
i teraz kąt do poziomu, czyli normalizujesz v i z-etowa to cosinus do zeta, zatem sinus do poziomu.

albo od razu:
\(\displaystyle{ \phi = \arcsin(\frac{v.z}{|v|}) = \arcsin(\frac{v.z}{\sqrt{v.x^2+v.y^2+v.z^2}})}\)
ODPOWIEDZ