Autor Wątek: Obrót obiektu zgodnie z wektorem kierunku  (Przeczytany 585 razy)

Offline MDW

  • Użytkownik
    • www.encore-games.com

# Styczeń 18, 2019, 21:42:56
Mam opory przed zawracaniem Wam głowy podstawami i drobiazgami ale tym razem schowam wstyd do szuflady i zapytam, bo mnie coś zaraz chyba trafi. :) Jeżeli jeszcze dzień nad tym posiedzę to chyba zgłoszę się na prześwietlenie głowy żeby sprawdzili czy pod czaszką jest cokolwiek poza powietrzem. :)

No to problem wygląda następująco…

Obiekt porusza się w przestrzeni po krzywej. W każdej chwili mam jego wektor kierunku. No ale nie potrafię poprawnie obracać obiektu tak żeby zawsze był obrócony zgodnie z kierunkiem ruchu.

Dodam, że dużo wiem o tej krzywej, bo obiekt porusza się po orbicie więc krzywa jest okręgiem. Coś tak jakby w grze pt. "Super Stardust" (https://youtu.be/-UPZ3L_MMJ0?t=171). Oczywiście w tej nowej wersji z PlayStation w której akcja dzieje się na powierzchni sfery, a nie w pierwowzorze z Amigi OCS/AGA gdzie wszystko toczy się na płaszczyźnie. Mam więc promień okręgu, mam wektor normalny do okręgu po którym porusza się obiekt i oczywiście wektor kierunku. Mam też kwaternion obrotu ale tylko takiego cząstkowego w danym kroku aktualizacji pozycji.

No i głupi jestem. Przerzucam linki w Google, próbuję różnych rzeczy i ciągle jest źle. Tak mi chodzi po głowie, że wektor ‘up’ zawsze powinien leżeć na prostej od środka sfery do punktu w którym jest obiekt. Ale i tak nic sensownego z tego nie potrafię sklecić.

Może ktoś poratować i rzucić jakimś pomysłem?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Kyroaku

  • Użytkownik

# Styczeń 19, 2019, 17:31:09
https://stackoverflow.com/questions/349050/calculating-a-lookat-matrix

Oś 'z' to kierunek i interesuje cię z tego tylko część związana z rotacją, a więc macierz 3x3. Powinno styknąć.

Offline MDW

  • Użytkownik
    • www.encore-games.com

# Styczeń 19, 2019, 20:09:59
https://stackoverflow.com/questions/349050/calculating-a-lookat-matrix

Oś 'z' to kierunek i interesuje cię z tego tylko część związana z rotacją, a więc macierz 3x3. Powinno styknąć.
Dzięki. A nie będzie tutaj problemu w którym po połowie drigi obiekt się obróci o 180 stopni w osi wektora kierunku? Chodzi mi o ten klasyczny problem przez który najczęściej ludzie przechodzą z macierzy na kwaterniony. 😃

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Styczeń 19, 2019, 20:12:47
Załóżmy, że obiekt porusza się po okręgu opisanym takim równaniem. Inną trajektorię można sprowadzić do tej przez odpowiednią transformację (translację, skalowanie, obrót).

x = sin(t)
y = cos(t)
z = 0

Aby obiekt również obracał się w kierunku swojego ruchu, można wyznaczyć jego macierz lokalnego obrotu konstruując ją z 3 wzajemnie prostopadłych, jednostkowych wektorów.

- Jeden będzie w kierunku do centrum, wokół którego krążymy (punktu 0, 0, 0), czyli: (-sin(t), -cos(t), 0).
- Drugi będzie prostopadły do pierwszego w płaszczyźnie xy. Wektor prostopadły w 2D wyznacza się przez zamianę miejscami komponentów i zanegowanie jednego z nich. Będzie to więc albo (cos(t), -sin(t), 0), albo (-cos(t), sin(t), 0) - wypróbuj, który zadziała.
Trzeci będzie (0, 0, 1) albo (0, 0, -1) - wypróbuj, który zadziała.

Jak już najdziesz kombinację, która powoduje, że obiekt podczas ruchu faktycznie obraca się w tę stronę, co trzeba, a nie w przeciwną, to zostaje jeszcze rozwiązać prawdopodobny problem złej orientacji początkowej - czyli że np. zawsze jest górą albo lewym bokiem do kierunku ruchu, a nie przodem. Aby to naprawić, trzeba zaaplikować jakąś stałą macierz rotacji o 90 stopni wokół jakiejś osi przed zastosowaniem tej bieżącej. To też można wyprowadzić teoretycznie albo znaleźć właściwą metodą prób i błędów :)

Offline Kyroaku

  • Użytkownik

# Styczeń 19, 2019, 22:13:13
Dzięki. A nie będzie tutaj problemu w którym po połowie drigi obiekt się obróci o 180 stopni w osi wektora kierunku? Chodzi mi o ten klasyczny problem przez który najczęściej ludzie przechodzą z macierzy na kwaterniony. 😃

Też o tym pomyślałem i wydaje mi się, że jak wektor 'up' będzie skierowany tak, jak to opisałeś, czyli od środka sfery do obiektu, to problemu nie będzie.

Offline laggyluk

  • Użytkownik
    • twitter

# Styczeń 20, 2019, 11:41:33
Możesz to rozwiązać w jakiś nieelegancki sposób typu LookAt(previousPosition)

Offline MDW

  • Użytkownik
    • www.encore-games.com

  • +1
# Styczeń 20, 2019, 12:03:51
Możesz to rozwiązać w jakiś nieelegancki sposób typu LookAt(previousPosition)
Jeżeli metodą LookAt to mogę patrzeć na koniec wektora kierunku (który znam) dodanego do aktualnej pozycji. I myślę, że też tego spróbuję. 👍

Offline bartekm

  • Użytkownik
    • Wordpress Blog

# Styczeń 20, 2019, 12:14:26
A nie możesz ustawić po prostu Lookat = Pos + wektor kierunku?

Offline MDW

  • Użytkownik
    • www.encore-games.com

# Styczeń 20, 2019, 13:05:14
A nie możesz ustawić po prostu Lookat = Pos + wektor kierunku?
Tak chyba trzeba będzie zrobić. Myślałem, że jakoś przycwaniakuję i ta orientacja sama mi wyjdzie skoro ruch obiektu jest tak jasno określony. 😃