• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Obracanie trówymiarowej kostki, jak dodać poprawkę ze względu na kamere

Object Storage Arubacloud
0 głosów
422 wizyt
pytanie zadane 21 stycznia 2017 w Matematyka, fizyka, logika przez Dash Nałogowiec (29,650 p.)
Witam,

mam matematyczny problem. Napisałem na podstawie kilku wzorów algorytm który tworzy kostkę. Mam jednak problem z obracaniem, mianowicie działa obracanie na osiach x,y,z, aczkolwiek chciałbym ją obrócić w nietypowy sposób. Kostka ma obracać się w kółko wokół własnej osi (na osi Y), a jednocześnie być delikatnie pochylona, żeby widać było jej górną ścianę. Niestety potrzeba tutaj zgrania obracania na wzsystkich trzech osiach, mam wrażenie że osi X i Z powinny przyjmować wartości funckji tryg. wyliczanych z obrotu na Y, jednak zupełnie nie wiem jak to policzyć. Potrzebuję czegoś w stylu kamery, ustawionej ponad kostką, gdy ta kręci się wokół własnej osi, jednak nie mogę znaleźć w internecie niczego z odpowiednimi wzorami.

1 odpowiedź

+1 głos
odpowiedź 21 stycznia 2017 przez Patrycjerz Mędrzec (192,320 p.)
wybrane 22 stycznia 2017 przez Dash
 
Najlepsza
Wystarczy wykonać dwa obroty, pierwszy z pochyleniem kostki do kamery, drugi wokół osi Y. Nie wiem, z jakiej technologii korzystasz, jeśli OpenGL lub DirectX, to zrobienie tego to raptem dwie macierze.
komentarz 21 stycznia 2017 przez Dash Nałogowiec (29,650 p.)
Nie, nie, jak obracam w taki sposób to kostka się obraca dosyć kosmicznie. Oś obrotu jest niezależna do kostki, znaczy że jak ją pochylę i obrócę, to będzie pochylona w kierunku przeciwnym. Ja potrzebuję czegoś na wzór obracania się względnego, żeby oś obrotu zawsze przechodziła przez środek kostki, równolegle ze ścianami. Robię bez biblioteki,  tylko kod a potem łączenie rogów liniami w SFML/Coronie.
komentarz 21 stycznia 2017 przez Patrycjerz Mędrzec (192,320 p.)
Używasz może macierzy? Jeśli nie, to zacznij, gdyż w dużym stopniu automatyzują całą robotę.

Znajdź materiały na temat macierzy obrotu, jak i współrzędnych jednorodnych (umożliwiają łączenie wszystkich przekształceń za pomocą iloczynu macierzy) i zaimplementuj to w swoim algorytmie.

Warto wspomnieć, że mnożenie macierzy (czyli łączenie przekształceń) nie jest naprzemienne, tzn. macierze mnożymy w kolejności odwrotnej do kolejności wykonania transformacji. Na przykład obrót jest zazwyczaj pierwszym przekształceniem, więc występuje na końcu iloczynu.
komentarz 21 stycznia 2017 przez Patrycjerz Mędrzec (192,320 p.)
Nie wiem, w jaki sposób obliczasz współrzędne po obrocie, ale nie jest to istotne. Jeśli nie chcesz używać macierzy, to mogę powiedzieć jedynie tyle, że każdy obrót, wokół jakiejkolwiek osi, możesz przedstawić za pomocą połączenia kilku przekształceń.

Jak wcześniej mówiłem, obrót, który cię interesuje, możesz wykonać obracając kostkę wokół osi Y, a potem pochylając ją do kamery (czyli obrót wokół osi X lub Z).
komentarz 21 stycznia 2017 przez Dash Nałogowiec (29,650 p.)

Wybacz że długo odpisuję, ale jestem w tym temacie laikiem i się na bieżąco edukuje.

 

Kostka sama w sobie obraca mi się dobrze, ja chciałbym tak jakby przechylić oś wokół której obrót się dokonuje. Kod z którego korzystam : 

local focalLength = cube.focalLength


	local TransformedPointsArray = {};

	local sx = math.sin(axisRotations.x);
	local cx = math.cos(axisRotations.x);

	local sy = math.sin(axisRotations.y);
	local cy = math.cos(axisRotations.y);

	local sz = math.sin(axisRotations.z);
	local cz = math.cos(axisRotations.z);

	local x,y,z, xy,xz, yx,yz, zx,zy, scaleFactor;

	local i = #points;

	while (i>0) do
		x = points[i].x;
				y = points[i].y;
				z = points[i].z;

				-- rotation around x
				xy = cx*y - sx*z
				xz = sx*y + cx*z
				-- rotation around y
				yz = cy*xz - sy*x
				yx = sy*xz + cy*x
				-- rotation around z
				zx = cz*yx - sz*xy;
				zy = sz*yx + cz*xy;

				scaleFactor = focalLength/(focalLength + yz);
				x = zx*scaleFactor;
				y = zy*scaleFactor ;
				z = yz;

				TransformedPointsArray[i] = make2DPoint(x, y, -z, scaleFactor);
				i=i-1
	end

komentarz 21 stycznia 2017 przez Patrycjerz Mędrzec (192,320 p.)

Ale ja już zaprezentowałem ci rozwiązanie problemu, tzn. obrócenie kostki wokół osi pionowej, a następnie obrócenie tak obróconej bryły jeszcze raz, ale względem osi poziomej.

Narysuję ci poglądową ilustrację:

Jeśli chcesz, możesz dodać przesunięcie, aby przenieść kostkę w odpowiedni obszar sceny.

Czy takie rozwiązanie cię satysfakcjonuje?

komentarz 21 stycznia 2017 przez Dash Nałogowiec (29,650 p.)

No do tego momentu nie ma problemu, tutaj jeszcze pojmuje. Ale teraz ta kostka na ostatnim rysunku, chciałbym żeby zaczęła się obracać wokół "skośnej| os", jednocześnie żeby góra cały czas był po naszej stronie. To co pokazałeś i to co robię, to obracanie kostki zawsze wokół niebieskich osi na grafice poniżej. Po zrobieniu180 stopni jest skierowana górą w drugą stronę. Mi zależy żeby kostka obracała się jak ta kula, zawsze względem swojej pozycji, nie absolutnych współrzędnych. 

komentarz 21 stycznia 2017 przez Patrycjerz Mędrzec (192,320 p.)

Istnieją wzory na obrót wokół zdefiniowanej osi, przykład tutaj.

Myślałem, że mój sposób u ciebie nie działa, a wyszło na to, że chciałeś koniecznie obracać wokół osi pochylonej, bez łączenia transformacji… przynajmniej wszystko wytłumaczone smiley

komentarz 22 stycznia 2017 przez Dash Nałogowiec (29,650 p.)
Dzięki, o taki wzór mi chodziło, znalazłem nawet implementację:

http://gamedev.stackexchange.com/questions/14780/3d-rotation-math-code-for-plane

Jednak po przestudiowaniu tych hieroglifów i dodaniu że musiałbym potem punkty przeliczać na 2d i tego że wzór podany w linku powyżej powodował że kostka się z każdym obrotem powiększała, oficjalnie stwierdzam że jest to niewarte zachodu. Może przyszłym pokoleniom się będzie chciało.

Podobne pytania

0 głosów
2 odpowiedzi 1,528 wizyt
pytanie zadane 21 lutego 2020 w Grafika i multimedia przez Mavimix Dyskutant (8,390 p.)
0 głosów
0 odpowiedzi 570 wizyt
0 głosów
0 odpowiedzi 84 wizyt
pytanie zadane 31 sierpnia 2017 w Systemy operacyjne, programy przez radzio31 Nowicjusz (240 p.)

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...