Skocz do zawartości

Pytanie o tranformacjach 3D


PoxiPol

Rekomendowane odpowiedzi

Oki, mam maly problemik, ktory pewno bardzo latwo jest naprawic. Otoz chce by moja pileczka sie obracala wraz z ruchem, i niby mam wszystko ok:

GML
if keyboard_check(vk_up) then {x+=4;rotation-=4;}

else

if keyboard_check(vk_down) then {x-=4;rotation+=4;}

if keyboard_check(vk_left) then {y-=4;xrotation-=4;}

else

if keyboard_check(vk_right) then {y+=4;xrotation+=4;}

w stepie

 

GML
d3d_transform_set_identity();

d3d_transform_add_rotation_x(xrotation);

d3d_transform_add_rotation_y(rotation);

d3d_transform_add_translation(x,y,z+12);

d3d_draw_ellipsoid(-12,-12,-12, 12,12,12,background_get_texture(bac_Ball),4,2,10);

d3d_transform_set_identity();

w draw

Kamerę mam inaczej ustawioną więc sie nie pytajcie czemu x i y sa inaczej, ale mniejsza o to. Otoż czasami, piłka dobrze kręci na osi y, a wierci na osi x, albo na odwrót. Tzn na osi y zawsze, obojetnie od obrotu osi x, obraca sie w dobra stronę, ale za to oś x sie obraca wraz z osia y, co powoduje ze obracanie jest zalezne własnie od tego. Ciężko to wytłumaczyc, sami byście musieli sie pobawić, ale możliwe ze ktoś juz natknąl na ten problem. Dziekuję.

Odnośnik do komentarza
Udostępnij na innych stronach

Nie do końca rozumiem, ale przypuszczam, że to ten sam problem na który ja się natknąłem niecałe 2 lata temu. W sensie, że nie kręci się się według globalnej osi x tylko tej już obróconej względem osi y tak? Poważna sprawa! :P Siedziałem nad tym sporo i sobie wtedy nie poradziłem. Powodzenia! :)

Odnośnik do komentarza
Udostępnij na innych stronach

z uwzglednieniem rotacji to tak jak w symulatorach lotu. w tym przykladzie sprawdz obiekty od symulatora, z tego, co pamietam, to w nim jest kod na poprawne obracanie tego, co masz u siebie, jako rotation i xrotation: https://gmclan.org/up1105_3_XeMatrix_1_2.html

Jesli zas nie ma tam tego, o czym mysle (bo mysle, ze powinno, ale dawno w to nie zagladalem), to wybacz :D

Odnośnik do komentarza
Udostępnij na innych stronach

Zapewne chodzi Ci o gimbal lock. Przy obrocie osi z o 90 stopni nakłada się na x i tracisz jedną a oś swobody. Zapewne gm używa zwykłe euler angles to rotacji. Dobrym rozwiązaniem są kwaterniony ale wątpię czy gm je implementuje. Najbardziej łopatologiczne rozwiązanie to sprawdzanie danego kąta obrotu i jego poprawa w przypadku obrotu kuli nie będzie to miało żadnego wpływu na wygląd więc powinno spasować. Obrót wokół globalnych osi odpada bo to nie układ planetarny. Nie pozwalaj aby osie się na siebie nałożyły i tyle.

Odnośnik do komentarza
Udostępnij na innych stronach

Spróbuj po prostu zamienić kolejność

d3d_transform_add_rotation_y(rotation);

d3d_transform_add_rotation_x(xrotation);

widziałem gdzieś przykład takiego obracania chyba ThatGamesGuy

http://gamesguy.bravehost.com/create.html

 

o jest http://www.thatgamesguy.com/tutorials/tut1...ingball_edi.zip << direct link

 

i druga wersja http://www.thatgamesguy.com/examples/ChromeBall_gm6.zip

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...