Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Rotace objektu

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: Rotace objektu

Autor: Eosie

19:36:18 28.11.2008

Fakt je, že kdybys tady quaternion nahradil 3x3 maticí, dopadlo by to úplně stejně.

Citovat příspěvek

 

Re: Rotace objektu

Autor: Vollf

7:45:54 28.11.2008

Jo taky se mi zdál nějakej zběsilej. Ta třída na quateriony funguje perfektně, jen sem jí ze začátku špatně používal :)

ToKOMIK - zkus jí a uvidíš - http://glprogramming.com/codedump/godecho/quaternion.html

Uděláš si objekty A, B, C, D.

Potom místo glRotatef použij:

A.CreateFromAxisAngle(1.0, 0.0, 0.0, uhel)
B.CreateFromAxisAngle(0.0, 1.0, 0.0, uhel)
C.CreateFromAxisAngle(0.0, 0.0, 1.0, uhel)

Potom D = D * A

Z D si pak vytvoř tu matici tou funkcí a pomocí glMultMatrixf() jí vynásob se stávající maticí pro rotaci :)

Citovat příspěvek

 

Re: Rotace objektu

Autor: Eosie

19:38:44 26.11.2008

Ten NeHe tutoriál je docela k ničemu. Popisuje použití nějakého 3rd-party kódu, ale nevysvětluje princip.

Citovat příspěvek

 

Re: Rotace objektu

Autor: michalferko

17:40:56 26.11.2008

pri dostatocnych skusenostiach nezalezi na jazyku. Predsa len C++ a delphi nie su az tak odlisne. Staci si prelistovat par C++ tutorialov a je to. A dokonca niektore NEHE tutorialy su aj prelozene do delphi.

Citovat příspěvek

 

Re: Rotace objektu

Autor: komik

16:12:53 26.11.2008

no právě ... o to hůře, že já to programuju v delphi :(

Citovat příspěvek

 

Re: Rotace objektu

Autor: Vollf

8:46:38 26.11.2008

rotace objektu myší bez gimbal locku je uvedena v tomto tutoriálu - http://nehe.ceske-hry.cz/tut_48.php

ale nic jednoduchýho na prozkoumání ten kód není :) Ale dá se to ...

Citovat příspěvek

 

Re: Rotace objektu

Autor: komik

20:52:45 25.11.2008

Potřeboval bych taky řešit otáčení tak jako Vollf.

Vůbec jsem ale nepochopil toto:
" Udělej to tak, jak jsem říkal - máš uloženou rotaci a vždycky přinásobíš jen lokální změny podle stisknutých kláves třeba."

Rotuju myší objekt a potřebuju aby se to chovalo jako v každém normálním 3D programu.

Prosím o názorný příklad, jsem začátečník, díky.

Citovat příspěvek

 

Re: Rotace objektu

Autor: Vollf

12:50:30 25.11.2008

Mohli byste mi pomoct krátkým popsáním názorné ukázky, kterou tady uvedu. Udělám si svislou stěnu, která bude procházet na Xové souřadnici bodem -2.

Mám krychli napravo od stěny a šipkou jí posouvám o vzdálenost 1 po Xové souřadnici doleva. U tý je to jednoduchý, jelikož rotací se velikost krychle nemění, takže jen budu testovat u glTranslatef(X, 0, -2) jestli není proměnná X -2. Jestli je, krychle je naplácnutá na stěnu a dál už nejde posouvat. Ale ted si vezměte utvar ve tvaru L známý z tetrisu. 3 krychličky vodorovně + 1 nahoru. Ale je to jedno těleso. Taky bych to mohl porovonávat výše uvedeným způsobem, ale při rotaci do jakékoli strany významně mění svojí šířku, víšku a tak ne?? Takže když bude u stěny natočená těma 3 krychlema směrem do -z, bude mít šířku 1 krychle. Když jí zarotuju aby 3 krychle měla ve směru po Xové souřadnici, bude mít šířku 3 krychlí. A pokud rotace dělám pomocí transformačních matic, které mi vyhazujou ty quateriony, jak zjistím jak je zrovna natočená. Nějak si to neumím v hlavě srovnat a představit.

Snad ste mě pochopili :) Omlouvám se ale stále se ještě mam co učit a mam dost nedostatků, tak díky za váš čas :)

Citovat příspěvek

 

Re: Rotace objektu

Autor: judovana

8:51:03 25.11.2008

KOlize na necem co se skalda pouze z krychli je ten nejednodusi pripad. V tvem priapde muzes klidne zkusit porovnat vsechny krychle se vsema kdychlema. Pro kazdy mozny prusecik je to 6jendoduchych porovnani.
POkud sis telesa definoval vic geometricky, budes to mit trosku tesi ale ne zas tak o moc;) (a nejeednodusi mas asi si to prevest na ty krychle:DD )

Citovat příspěvek

 

Re: Rotace objektu

Autor: asdfasdfasdf

0:14:15 25.11.2008

ad kolize:
"Třeba kdyz je kostka naplácnutá na jedné stěně a ted s ní zarotuju tak, že mi jeden konec vyleze za stěnu."

Tak si to spocitej predem, zda ti kus kostky leze za stenu a kdyz jo, tak skutecnou
rotaci nedovol.

Citovat příspěvek

 

Re: Rotace objektu

Autor: Vollf

14:08:28 24.11.2008

funguje to díky moc :) ale stejně ten 3D tetris asi neudělám. Zjistil sem, že detekce kolizí je nad moje síly :( Třeba kdyz je kostka naplácnutá na jedné stěně a ted s ní zarotuju tak, že mi jeden konec vyleze za stěnu. Nevím jak to ošetřit a dělá se to asi nějakou složitou matematikou na což já nemam hlavu. Vzorečky ble :P

Citovat příspěvek

 

Re: Rotace objektu

Autor: Eosie

0:07:08 22.11.2008

Špatná úvaha. Quaterniony ti tady nepomůžou, pomohou jen trochu regulovat malé numerické nepřesnosti.

Gimbal Lock není omezení matic, ale způsob, jakým je používáš. Quaterniony taky mají Gimbal Lock. Udělej to tak, jak jsem říkal - máš uloženou rotaci a vždycky přinásobíš jen lokální změny podle stisknutých kláves třeba. Když se žádná změna neděje, neděláš s tou maticí NIC.

Citovat příspěvek

 

Re: Rotace objektu

Autor: Vollf

9:16:39 21.11.2008

Ahoj,

no právě o to mi jde. Použít quateriony. Ta třída pod kterou spadaj ty objekty A, B, C přeci pracuje s quaterionama a na základě těch pak vzdy vyhodí rotační matici (funkce CreateMatrix(matice);) ne?? Proto jsem myslel právě že takhle se pracuje s těma quaterionama.

Jak to mam tedy udělat? Prosíím ... potřebuju se zbavit gimbal locku a uz jsem fakt f koncích. O quaterionech sem čet už víc jak 10 stránek viděl kvantum vzorečků a teorie ale nikde sem neviděl názornej příklad, jak rotovat samostatným objektem bez gimbal locku (nanejvýš sem objevil jak se dělá kamera a pohyb s ní ale neuměl sem to z toho převést na můj příklad).

Písni mi kdyz tak na mejl.

Citovat příspěvek

 

Re: Rotace objektu

Autor: Eosie

19:53:59 20.11.2008

Gimbal lock je normální jev, když používáš Eulerovy úhly právě takhle. Místo konstrukce matic každej frame si ulož aktuální rotační matici toho objektu (C). Na začátku to bude identita. Pak, když se stiskne klávesa, vytvoříš novou rotační matici (A), která rotuje o konstantní úhel (např). pak provedeš C=C*A; Tohle děláš pořád dokola.

Pozn.: Tento přístup může způsobovat nepřesnosti v tom smyslu, že se ti tam bude měnit scale. Pokud na tento problém narazíš, použij místo matic quaterniony. Ty neumí obsáhnout nic jinýho než rotaci a na matici jdou snadno převést.

Citovat příspěvek

 

Re: Rotace objektu

Autor: Vollf

13:30:14 20.11.2008

ahoj,

díky za reakci ale nepochopil si správně o co mi šlo. Můj problém se jmenuje gimbal lock a už asi 10 dní řeším co s tím.

Našel sem třídu quaterionů který by to měly vyřešit ale nějak nechápu jak jí správně použít.

Třída je tady: http://glprogramming.com/codedump/godecho/quaternion.html

A toto mam v mém kódu :

Quaternion A, B, C;
float matice[16];
...

int DrawGLScene(GLvoid)
{
A.CreateFromAxisAngle(1.0, 0.0, 0.0, f);
B.CreateFromAxisAngle(0.0, 1.0, 0.0, g);

C = A * B;
C.CreateMatrix(matice);
glMultMatrix(matice);

... // kód na vykreslení krychle

}

Šipky nahoru a dolů měněj proměnnou "f" a šipky doleva doprava proměnnou "g". Jenže gimbal lock se projevuje pořád :( poradí mi někdo jak správně tu třídu použít?? Díky

Citovat příspěvek

 

Re: Rotace objektu

Autor: frca

15:04:05 12.11.2008

Pokud se to na tom 3D tetris míníš učit, tak to není nejlepší cesta k pochopení dané problematiky. Daleko lepší je udělat demíčko pohybu planet kolem Slunce, měsíců kolem planet a ještě třeba nějakých krychlí (družic ;) ) kolem měsíců (všechno dohromady). To je učebnicový příklad na transformace v OpenGL a je to pomocí něj přímočaře řešitelné. K pochopení ještě přispěje, pokud nebudou planety úplně kulaté (tzn. když to budou krychle nebo gluSphere s malým počtem slices/stacks).

frca

Citovat příspěvek

 

Re: Rotace objektu

Autor: frca

14:48:54 12.11.2008

Žádné osy se neprohodí, to je špatné pochopení matic v OpenGL. Nejspíš pomůže volat funkci glRotatef, pokud ji voláš vícekrát, v opačném pořadí, než bys čekal. A v každém snímku všechno transformovat přísně od nuly. Ne, že by to nešlo jinak, ale takto je to nejpřehlednější.

Edit: Když si tak čtu podrobněji, o co ti vlastně jde, tak musím říct, že to tak jednoduše nejde. Když skládáš rotace, tak každou z nich ber zvlášť jako rotaci o 90 stupňů. A místo tří hodnot používej celou rotační matici (odděleně od translační), ke které aktuální rotaci přinásobuj zleva.

Citovat příspěvek

 

Rotace objektu

Autor: Vollf

9:59:12 12.11.2008

Zdravím,

již 2 dny řeším pro mě neřešitelný problém. Budu se to snažit vysvětlit polopaticky. Když funkcí glRotatef() otočí objekt o 90° kolem osy Y, zbylé osy X a Z se prohodí (krásně je to popsané zde - http://nehe.ceske-hry.cz/cl_gl_matice2.php ). Mě jde o to tento efekt anulovat. Pro upřesnění dělám 3D tetris a jde mi o rotaci kostek. To znamená, že chci, aby mi šipky doleva a doprava rotovali objekt kolem osy Z ať je jakkoli natočený z předešlých rotací (vše bráno z mého pohledu, hýbe se jen objekt).

Logiky když dám za sebe toto:

glRoatef(f, 1.0f, 0.0f, 0.0f);
glRoatef(g, 0.0f, 1.0f, 0.0f);
glRoatef(h, 0.0f, 0.0f, 1.0f);

Proměnné F, G a H se zvětšují o 90 pomocí šipek, tak první rotace kolem osy X již prohází následné rotace kolem zbylých os. Už jsem prošel kvantum článků a tutoriálů a zkusil vše možné ale nepřišel na to co s tím.

Mohl by mi někdo poradit, nebo má někdo nějaký nápad jak by se to dalo řešit? Případně rozvést na toto téma diskuzy a vyřešit to společně. Mě napadlo něco takového:

glRotatef(f, 0.0f, 0.0f, 1.0f);
if(f==360 || f==-360) { f=0; }
if(f==0) { glRotatef(g, 1.0f, 0.0f, 0.0f); }
if(f==-270 || f==90) { glRotatef(-g, 0.0f, 1.0f, 0.0f); }
if(f==-180 || f==180) { glRotatef(-g, 1.0f, 0.0f, 0.0f); }
if(f==270 || f==-90) { glRotatef(g, 0.0f, 1.0f, 0.0f); }
... atd.

ale to je fakt divočina a ve 3D by to snad ani nešlo zkloubit dohromady.

Mnohokrát díky.

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: