Obroty w 3d

0

Próbuje zaimplementować obracanie prostego obiektu 3d. Stosuję standardowe macierze obrotów:

np. dla obrotu wokół OX
cos(arc) sin(arc) 0 0
-sin(arc) cos(arc) 0 0
0 0 1 0
0 0 0 1

Wszystko niby ładnie, ale w momencie kiedy kąty się zwiększają następuje spłaszczenie obrazy, tzn zamiast obiektu pojawia mi się linia. Gdy przejdę już do 360 stopni to z powrotem mam poprawny obiekt. Czym to jest spowodowane?

0

Jaki obiekt obracasz i wokol ktorej osi? Jezeli jednym z rzutow bryly jest odcinek, to nic dziwnego, ze pojawi sie przy obrocie.

//edit
A moze chodzi Ci o to, ze obracasz szescian, a na ekranie widzisz kwadrat, prostokat, odcinek, prostokat, kwadrat? Tak jest poprawnie, bo takie sa rzuty szescianu jesli nie ma perspektywy i 'os' rzutu jest prostopadla do jednej ze scian i przechodzi przez jej srodek (wiem, dziwnie wyjasnilem ;) )

0
  1. twoja macierz to obrot wokol OZ i cos mi ten minus nie tu sie widzi :S
  2. uzyj kwaternionow do obrotow :P
0

Kiedyś miałem coś podobnego. Mianowicie za każdym krokiem obracałem bryły i zapisywałem ich nowe współrzędne. Po prostu każdy kolejny krok był obarczony jakimś błędem i po obrocie 360 otrzymywało się już nie dokładnie tą samą bryłę. Może to jest to? Zamiast zapisywać za każdym krokiem z powrotem współrzędne, trzeba zapisywać tylko kąt i za każdym razem obracać bryłę z początkowej pozycji od razu do kąta, który ma być wyświetlony. Bez zapisywania z powrotem do danych, tylko do wyświetlenia.

To tak btw.

0
TomaszSmykowski napisał(a)

Kiedyś miałem coś podobnego. Mianowicie za każdym krokiem obracałem bryły i zapisywałem ich nowe współrzędne. Po prostu każdy kolejny krok był obarczony jakimś błędem i po obrocie 360 otrzymywało się już nie dokładnie tą samą bryłę. Może to jest to? Zamiast zapisywać za każdym krokiem z powrotem współrzędne, trzeba zapisywać tylko kąt i za każdym razem obracać bryłę z początkowej pozycji od razu do kąta, który ma być wyświetlony. Bez zapisywania z powrotem do danych, tylko do wyświetlenia.

To tak btw.

Wlasnie w ten sposob robilo sie to w demkach na Amige :D

0

O, nie wiedziałem ;) Ja to 'odkryłem' jak pisałem engine 3D w Pascalu. Nie tak dawno temu, ale to były czasy ;). Jak wydali sławnego Tomb Raidera 2 to hitem tej edycji była korekcja ścian w perspektywie. Zastanawiałem się wtedy, po co tyle szumu, przecież to mogli już zrobić wcześniej [???] No i wtedy właśnie jak pisałem ten engine, to się okazało ... hehe ... to rzeczywiście był hit ta korekcja ścian. [wstyd]

0

Taaaa, ja tez tak kiedys zrobilem i przy obrocie takim jak opisalem wczesniej (czyli jedna sciana zwrocona do kamery) widac kwadrat, pozniej prostokat, pozniej linie i znowu linie :P Bo trudno z lini przejsc znowu do szescianu majac zapisany ostatni obiekt. I to zdecydowanie nie wygladalo na obrot w przestrzeni ;)

0

moze troche za pozno to pisze. nie znam sie na grafice 3d, ale podchodzac matematycznie chcialbym zauwazyc, ze jezeli jakobian przeksztalcenia nie wszedzie jest rozny od zera, to przeksztalcenie odwrotne moze nie istniec - plaszczyzna moze przejsc w linie, linia w punkt i w druga otrone tak samo.

0

obr na osi X robilem w ten spsoob:

glTranslatef(px, py, pz); //- punkt wokół ktorego nastepuje obrot
glRotatef(X, 1, 0, 0); //- obr os. X
glRotatef(Y, 0, 1, 0); //- os. Y

0

:-D własnie miałem ten sam problem :-D
Po kolejnych obrotach bryła tragicznie się zsuwała do środka pkt. obrotu tragedia:-/ i okropna deformacja!!

robiłem tak:

                char b[20];

              	sprintf(b,"%.3f",rad);
                sscanf(b,"%f",&rad);

               	float CosAngle = cos(rad);
               	sprintf(b,"%.1f",CosAngle);
                sscanf(b,"%f",&CosAngle);


	            float SinAngle = sin(rad);
              	sprintf(b,"%.1f",SinAngle);
                sscanf(b,"%f",&SinAngle);

potem nawet tak: (troche lepiej)

               	float CosAngle = ceil(cos(rad)*20)/20;
	            float SinAngle = ceil(sin(rad)*20)/20;

ale to na co wpadł TomaszSmykowski jest najlepsze;P i tak zostało [rotfl]

1 użytkowników online, w tym zalogowanych: 0, gości: 1