Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 26. 10. 2009 09:09

Elfman83
Zelenáč
Příspěvky: 10
Reputace:   
 

Rotace bodu A ve 3D okolo bodu B s vektorem A směřujícim vždy k bodu B

Dobrý den,

potřeboval bych pomoci s jedním problémem ohledně "kroužení kamery okolo bodu v 3D prostoru", ale protože si myslím, že to bude více chyba v matematice než v programování, obracím se sem... Nevím, jestli to je víc otázka matematických výpočtů rotace nebo přepočtu grafiky ze 3D do 2D (řekl bych spíše to první):

Předem se omlouvám za trochu obsáhlý popis..

Má situace je následující.. když pohybuji kamerou nebo ji natáčím, tak vše funguje OK.. Potřeboval bych ale ještě funkci, kdy kamera krouží okolo bodu (o souřadnicích XYZ=0,0,0), tj. zatímco já nastavuji úhel, kamera (souřadnice XYZ=0,0,-32) se pohybuje po kružnici okolo bodu tak, aby se při daném úhlu vždy dívala na daný bod (tj. ten byl ve středu jejího pohledu, resp. po přepočtu na 2D měl vždy X,Y souřadnice 0).

Když rotuji jen podle jedné o z os (ať už X nebo Y), tak kamera krouží správně.. tj. z pohledu kamery rotuje vlastně ten polygon (např. pro úhel Y=90 má kamera souřadnici X=-32,Y=0,Z=0 a tím se stále dívá do 0,0,0). Jenže když chci rotovat podle obou úhlů současně, začne polygon kamsi ujíždět.

Veškeré další info je v obrázcích:

http://img200.imageshack.us/gal.php?g=rotacecam1.gif

Rotaci okolo bodu provádím tak, že nejprve odečtu souřadnice kamery od bodu, pak provedu rotaci, a pak je zpět přičtu.

Zkoušel jsem i vzoreček s opačným znaménkem:

_Z := Trunc(Z*Cos(urX)+Y*Sin(urX));
_Y := Trunc(Y*Cos(urX)-Z*Sin(urX));
_X := Trunc(X*Cos(urY)+_Z*Sin(urY));
Zv := Trunc(_Z*Cos(urY)-X*Sin(urY));
Xv := Trunc(_X*Cos(urZ)-_Y*Sin(urZ));
Yv := Trunc(_Y*Cos(urZ)+_X*Sin(urZ));

ale výsledek se lišil jen v tom znaménku a ne v prohozené souřadnici Xv a Yv. A je mi proti logice prohodit jen Xv a Yv na levé straně, protože pak to začne házet nesmysly např. pro rotaci okolo osy X jen po 90 stupních (vyjde mi X souřadnice <> 0 místo Y <> 0).

Pokud otočím polygon o 180 stupňů v ose X a pak začnu rotovat podle Y, tak polygon jede úplně na opačný směr, než by měl (mám dojem, že to souvisí s tím, že i když je kamera vlastně vzhůru nohama, stále např. v ose Y rotuje, jako kdyby nebyla, a přitom ale krouží v opačném směru)..

Doufám, že někdo odhalí případnou (snad trapně malou) chybičku a předem mu děkuji, že ji pro mne opraví.. nebo pokud je problém v něčem jako je "transformace natočení kamery do world space", vysvětlí.. (i když možná bude stačit jen vzoreček)

Martin Lux

Offline

 

#2 02. 11. 2009 08:49

Elfman83
Zelenáč
Příspěvky: 10
Reputace:   
 

Re: Rotace bodu A ve 3D okolo bodu B s vektorem A směřujícim vždy k bodu B

↑ Elfman83:
Problém vyřešen.. Ručním nastavením jsem zjistil, že správně má být kamera pro dané úhly opravdu na X=22,Y=15,Z=-15. Když jsem s pomocí vzorců vypočítal nejprve jen úhel Y a pak teprve X, už mi vyšly správné souřadnice. Děkuji všem alespoň za pročtení :-)

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson