Ostatnie wiadomości

Strony: [1] 2 3 4 5 ... 10
1
Szkółka / Odp: Przeliczanie rotacji w Blenderze na rotacje w OpenGL.
« Ostatnia wiadomość wysłana przez voytech dnia Dzisiaj o 07:27:25 »
Najpierw sprawa z kolejnością rotacji. Próbowałem różnie ale teraz potwierdziłeś mi, że ma być ZYX. Za chwilę to pozmieniam i tego się będę trzymał. Dzięki!

Tak dla potomności, żeby zrozumieć kolejność operacji wektor-macierz w układzie prawoskrętnym:
[vx']   [a b c d]   [vx]
[vy'] = [e f g h] * [vy]
[vz']   [i j k l]   [vz]
[ 1 ]   [m n o p]   [1 ]
albo inaczej tak jak w matematyce z grubymi literkami v'=M*v

1. Przekształcamy wierzchołki macierzą Mx (obrót wokół osi X): v1=Mx*v
2. Następnie to co już żeśmy przekształcili obracamy wokół osi Y: v2=My*v1
3. Na końcu wokół osi Z: v'=Mz*v2

Teraz sobie to podstawimy:
v' = Mz*v2 = Mz * (My * v1) = Mz * (My * (Mx * v))

nawiasy można przemieścić:
v' =  (Mz * My * Mx) * v

widać z tego że macierz złożona jest z mnożeń macierzy w odwrotnej kolejności do poszczególnych operacji:
Mxyz = Mz * My * Mx
v' = Mxyz * v

Druga sprawa to układ współrzędnych Blendera i OpenGL. Po Alt+R faktycznie X jest w prawo i Y do góry. Ale kamera w Blenderze patrzy w kierunku dodatnich Z, a nie ujemnych (jak w OpenGL). Więc tu jest pewna różnica. :(

to co mówisz nie może być prawdą:



jak widać kamera jest na osi OZ na [0,0, +6], ma wyzerowaną rotację i patrzy w kierunku -Z.

Cytuj
A jeszcze mam pytanie o kamerę. Jakiej kolejności transformacji używać dla kamery? Rotacja też ZYX? Pozycję monożę przez -1.

Kamerę zawsze ustawiałem na początku, czyli glLoadIdentity, potem gluLookAt kamery a następnie rysowanie sceny (rotacje, obroty,..., glDrawElements).

Jeżeli chcesz, żeby twoja kamera patrzyła tak samo jak ta w blenderze to może spróbuj wyeksportować matrix_world kamery i na początku renderowania sceny załadować ją komendą glLoadMatrixf(). Z macierzy można odczytać jej pozycję (4ta kolumna) a także prawo(X), góra(Y) i kierunek patrzenia kamery(-Z), są one w pierwszych trzech kolumnach.

Dodawanie do pozycji kamery wektor X kamery (pierwsza kolumna macierzy) spowoduje, że kamera będzie przesuwać się w bok, coś podobnego jak w grach klawisze A/D (strafe). W/S (przód tył) to zmiana pozycji kamery o wartość wektora Z kamery, oczywiście z odpowiednio przeskalowanego.

Przy skręcaniu kamery wokół osi Y, coś jak głową lewo-prawo, trzeba obrócić wektor X i Z kamery o tę oś.

Trzeba pamiętać o tym, że te trzy wektory tworzą bazę ortonormalną, czyli mają długość 1 i są do siebie wzajemnie prostopadłe, gluLookAt zawsze tego pilnuje. Podobnie patrzenie góra-dół, czyli wokół osi X kamery obrócić wektor Y i Z. Po każdej takiej operacji warto znormalizować te wektory i sprawić żeby ponownie były prostopadłe (cross product), bo operacje błędy numeryczne mogą się skumulować i wektory rozjechać.

Wydaje mi się, że to powinno zadziałać, ale nie mam pewności i nie pamiętam jak ja to robiłem dawno temu u siebie


Obiekt w Blenderze jest obrócony:
X = 199 stopni
Y = 123 stopnie
Z = 0 stopni

W Python Console Blendera sprawdzam:

C.selected_objects[0].matrix_world.to_euler()
Euler((0.3316124677658081, 0.9948376417160034, 3.1415927410125732), 'XYZ')

C.selected_objects[0].rotation_euler
Euler((3.473205089569092, 2.1467549800872803, 0.0), 'XYZ')

Wobec tego mi chodzi raczej o ten drugi sposób, bo to są te moje kąty (w radianach), które chcę wyeksportować.

Po skonwertowaniu na stopnie pierwszy kąt to  [199,123,0] a drugi [19, 57, 180]. Zauważ, że oba zestawy dają w efekcie takie samo ustawienie obiektów. Dwa różne zestawy kątów eulera jednocześnie taka sama macierz, <devils laugh mode>bwhahaha</devils laught mode>. Jeżeli oba obiekty animujemy od rotacji [0,0,0] do wcześniej podanych, to w połowie czasu animacji jedno będzie [99.5,61.5,0] a drugie [9.5,28.5,90] a to są całkiem różne orientacje. Tak więc tu też trzeba uważać. Mam nadzieję że nie zwiększyłem tym poziom ześwirowania ;-)

2
Inne ogłoszenia / Odp: Wykład o programowaniu funkcyjnym gier
« Ostatnia wiadomość wysłana przez ekhart dnia Wczoraj o 20:30:32 »
Zapraszam zainteresowanych do obejrzenia nagrania z prezentacji
Live functional game programming in Unity using Arcadia with Clojure
3
Szkółka / Odp: Przeliczanie rotacji w Blenderze na rotacje w OpenGL.
« Ostatnia wiadomość wysłana przez jontek dnia Wczoraj o 18:47:57 »
Obiekt w Blenderze jest obrócony:
X = 199 stopni
Y = 123 stopnie
Z = 0 stopni

W Python Console Blendera sprawdzam:

C.selected_objects[0].matrix_world.to_euler()
Euler((0.3316124677658081, 0.9948376417160034, 3.1415927410125732), 'XYZ')

C.selected_objects[0].rotation_euler
Euler((3.473205089569092, 2.1467549800872803, 0.0), 'XYZ')

Wobec tego mi chodzi raczej o ten drugi sposób, bo to są te moje kąty (w radianach), które chcę wyeksportować.
4
Szkółka / Odp: Przeliczanie rotacji w Blenderze na rotacje w OpenGL.
« Ostatnia wiadomość wysłana przez jontek dnia Wczoraj o 18:40:33 »
To widziałeś? https://blender.stackexchange.com/questions/34975/getting-euler-rotations-for-an-object-and-exporting-them
Dzięki za link. Już na to patrzę. Chociaż nie wiem jaka miałaby być różnica między obj.matrix_world.to_euler(), a obj.rotation_euler (którym wyciągam kąty do eksportu)

A na te kwaterniony to mnie namówiłeś. Teraz jeszcze nie mogę sobie powzwolić na takie przeróbki ale jak tylko ugaszę "pożar w stodole" to na pewno spróbuję, bo przy tych kątach można dostać świra. :)
5
Szkółka / Odp: Przeliczanie rotacji w Blenderze na rotacje w OpenGL.
« Ostatnia wiadomość wysłana przez DezerteR dnia Wczoraj o 18:33:32 »
To widziałeś? https://blender.stackexchange.com/questions/34975/getting-euler-rotations-for-an-object-and-exporting-them
Może masz coś namieszane w samych obiektach? Sprawdź ich rotation mode.
---
A może ja bym sobie wyciągnął te kąty z kwaternionów w czasie eksportu (jeszcze w skrypcie Pythona) i je zapisał w wyeksportowanym pliku. Byłoby to możliwe?

Próbuj, powinno się dać.
6
Szkółka / Odp: Przeliczanie rotacji w Blenderze na rotacje w OpenGL.
« Ostatnia wiadomość wysłana przez jontek dnia Wczoraj o 18:23:56 »
Cytuj
Co ci mogę poradzić i co zadziała najszybciej to wyeksportować kwaternion i odczytać z niego kąty.
A może ja bym sobie wyciągnął te kąty z kwaternionów w czasie eksportu (jeszcze w skrypcie Pythona) i je zapisał w wyeksportowanym pliku. Byłoby to możliwe?
7
Szkółka / Odp: Przeliczanie rotacji w Blenderze na rotacje w OpenGL.
« Ostatnia wiadomość wysłana przez jontek dnia Wczoraj o 18:19:55 »
Czy ja dobrze zaobserwowałem, że kolejność rotacji powinna być inna dla innych kątów? Jeszcze nie udało mi się ustalić jakiejś powtarzalnej zasady ale po "milionie" prób zaczynam w tym widzieć jakąś dziwną prawidłowość. Przy niektórych translacjach dobrze jest gdy kolejność jest XYZ, a przy innych jest dobrze gdy kolejność jest ZYX. Głupieję już. Od czego to zależy? Jakie warunki powinienem tu zastosować?
8
Szkółka / Odp: Przeliczanie rotacji w Blenderze na rotacje w OpenGL.
« Ostatnia wiadomość wysłana przez DezerteR dnia Wczoraj o 18:18:38 »
Pamiętam że też próbowałem eksportować kąty z blendera, ostatecznie mam kwaterniony :D Katy bywają bardzo błędogenne i źle się interpolują.

Co ci mogę poradzić i co zadziała najszybciej to wyeksportować kwaternion i odczytać z niego kąty.
Jeśli jeszcze nie używasz to polecę ci GLM, standard jeśli chodzi o algebrę.
9
Szkółka / Odp: Przeliczanie rotacji w Blenderze na rotacje w OpenGL.
« Ostatnia wiadomość wysłana przez jontek dnia Wczoraj o 18:06:42 »
Do wykonywania i przechowywania orientacji polecę kwaterniony. Obliczenia są dużo prostsze i nie trzeba się męczyć z kolejnością przekształceń. Do tego kwaternion da się jednoznacznie przekształcić na macierz więc możesz używać ich tylko przy eksporcie z blendera.
Trochę nie ogarniam kwaternionów. :| Poza tym wymagałoby to sporych przeróbek, bo mocno się już "przykleiłem" do kątów obrotu w trzech osiach. Kolejność przekształceń to nie jest męczarnia. Raz to sobie ustalę i będzie ok. :) Nie mogę tylko zrozumieć dlaczego nie dostaję tego samego efektu w OpenGL i Blenderze. Mam wrażenie, że nie da się tego zrobić. :(

A kwaterniony w przyszłości faktycznie będę musiał poznać, bo coraz częściej to pojęcie pojawia się w moim życiu. :)
10
Szkółka / Odp: Przeliczanie rotacji w Blenderze na rotacje w OpenGL.
« Ostatnia wiadomość wysłana przez DezerteR dnia Wczoraj o 17:58:05 »
Do wykonywania i przechowywania orientacji polecę kwaterniony. Obliczenia są dużo prostsze i nie trzeba się męczyć z kolejnością przekształceń. Do tego kwaternion da się jednoznacznie przekształcić na macierz więc możesz używać ich tylko przy eksporcie z blendera.
Strony: [1] 2 3 4 5 ... 10