GlRotatef() – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

GlRotatef() – C / C++ – Fórum – Programujte.comGlRotatef() – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
vollf820
Stálý člen
7. 11. 2008   #1
-
0
-

Zdravím lidi,

primitivní problém, s kterym uz se zas trápim 2 hodiny a ani to nemůžu nikde najít.

mám krychli a při zmačknutí šipek rotuje bud kolem osy X nebo osy Y. Kdyz ale zarotuje kolem osy x, a poté zmačknu rotaci kolem osy Y, nerotuje kolem Y ale kolem Z.

Problém je v tom , že v kódu to mam napsaný takto:

glRotatef(n++, 0.0f, 1.0f, 0.0f);

glRotatef(m++, 1.0f, 0.0f, 0.0f);


Takže ta první rotace vlastně převrátí (jakoby) osy pro tu druhou. A já hledám způsob, jak to po tý první rotaci jakoby vyresetovat na původní stav. Ve výsledku by to mělo vypadat tak, že krychle bude rotovat šikmo jedním směrem, a nebude sebou házet ze strany na stranu tak jak je to ted.

Zkoušel sem funkce glPushMatrix() a glPopMatrix() ale bezvýsledně. Existuje na to nějaká funkce nebo vychytávka?? Případně řešil to už někdy někdo?? Řek bych, že tenhle problém musí bejt docela častej.

Díky za odpovědi ....

Nahlásit jako SPAM
IP: 91.195.106.–
Reklama
Reklama
vollf820
Stálý člen
7. 11. 2008   #2
-
0
-

V nejakym tutoriálu psali, že glRotateF() vlastně točí jakoby kamerou, takže při otočení o 90° do strany se jakoby z osy Z vlastně stane osa X (cože je ten můj problém).

Bude nutné dělat v tomto případě výpočty pro rotaci krychle ručně? (jako že bych si nastavil vlastní matice pro posun a rotaci) nebo to jde nějak šetrně ošetřit nějakými funkcemi Open GL (nějakej reset těch os po natočení ale aby objekt zůstal otočený).

Nahlásit jako SPAM
IP: 91.195.106.–
vollf820
Stálý člen
7. 11. 2008   #3
-
0
-

Tak jsem to nakonec vyřešil takhle:

glRotatef(g, 1.0f, 0.0f, 0.0f);

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


Funguje to ale připadá mi to dost nešikovný ... opravdu to nejde jinak??

Nahlásit jako SPAM
IP: 91.195.106.–
o-lox0
Super člen
7. 11. 2008   #4
-
0
-

Lekce 48 tvýho tutorialu nebo pochopení co to zn. (příp. že neni nad..)
týmová spolupráce(i) :)ú (..nebo prosík v sekci Matematika)

Nahlásit jako SPAM
IP: 85.71.152.–
vollf820
Stálý člen
11. 11. 2008   #5
-
0
-

Ahoj :)

Díky za nápovědu ... tak nějak sem to zas procházel (a nejen to ale i spousta jinejch článků) a ejhle, už sem myslel že mam vyhráno, jelikož sem našel transformační matici pro rotaci (http://nehe.ceske-hry.cz/cl_gl_matice.php) takže sem myslel, že jí jen použiju funkcí glMultMatrix(matice). Točí se to točí, ale ne o 90°:(

Rotace na ose x:


[ 1, 0, 0, 0]

[ 0, cos(xrot),-sin(xrot), 0]

[ 0, sin(xrot), cos(xrot), 0]

[ 0, 0, 0, 1]



Tam místo toho xrot asi nejde dát jen 90 co ? Jeste se zeptám ... není to úplně to samý co dělá glRotatef(a, 1.0f, 0.0f, 0.0f) ?? Abych se s tim nepáral zas dva dny a pak nezjistil, že je mi to k ničemu.

Nahlásit jako SPAM
IP: 91.195.106.–
o-lox0
Super člen
11. 11. 2008   #6
-
0
-

Uveď rozumný důvod zabraňující ti v pokračování na důležitějších věcech v Projektu, když si nebudeš operacema s transformačníma Maticema, kterým
nerozumíš, obracet projekci os. Mně taková rotace kostky nijak zmatená nepřijde, naopak přirozená, můj dojem je,
že v tvém případě by to i profesionální firma překopávánim maticema neřešila.

Ta matice je opsaná, takře špatně ji nejspíš využíváš, např. místo radiánů stupně, atd..

...posílej také raději průběžně update kódu :)

Nahlásit jako SPAM
IP: 85.71.152.–
vollf820
Stálý člen
11. 11. 2008   #7
-
0
-

Dobrá dobrá, podrobně tady popíšu, co zrovna řeším a v čem spočívá ten můj problém. Celý kód je dlouhý na to ho sem dávat. Pokud chceš, pošlu ti ho mejlem (nechci spamovat tak se ptám).

Dělám 3D tetris (pro nezasvěcené). Kostku bude moci hráč rotovat do 3 směrů (x, y, z) podle os (používám tedy glRotatef() ). Jenže ta funkce nerotuje objektem, ale kamerou, takže po rotaci o 90° kolem osy X, uz osa Z prochází od shora dolů a osa Y prochází odzadu dopředu (takže se jakoby prohodí), což činí problémy při následné rotaci kolem další osy.

V kódu mam toto:

glRotatef(f, 1.0f, 0.0f, 0.0f);

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


Uživatel šipkou vždy přidá 90 k proměnné f, g nebo h takže se to při každém průchodu protočí. Ale zkus si zarotovat o 180° kolem nějaké osy. Následné rotace kolem zbývajících os budou zrcadlově převrácené (takže šipka doprava rotuje doleva) a následnýma rotacema se tento kolotoč ještě více zamotává. Pokud je někdo zkušenější v OpenGL, neříkejte mi, že ste se s tímhle nesetkali. Podstata problému, tak jak já to vidím je, že funkce glRotatef nedělá to, že se točí objekt, ale že obíhá kamera kolem objektu, takže to prohazuje ty osy. Já už to řeším vážně dlouho a bezvýsledně a napadlo mě i 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); }

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

if((f==90 || f==-270) && (g==0)) { glRotatef(h, 1.0f, 0.0f, 0.0f); }
if((f==90 || f==-270) && (g==90 || g==-270)) { glRotatef(-h, 0.0f, 0.0f, 1.0f); }
if((f==90 || f==-270) && (g==180 || g==-180)) { glRotatef(-h, 1.0f, 0.0f, 0.0f); }
if((f==90 || f==-270) && (g==-90 || g==270)) { glRotatef(h, 0.0f, 0.0f, 1.0f); }

if((f==180 || f==-180) && (g==0)) { glRotatef(h, 0.0f, 1.0f, 0.0f); }
if((f==180 || f==-180) && (g==90 || g==-270)) { glRotatef(-h, 0.0f, 0.0f, 1.0f); }
if((f==180 || f==-180) && (g==180 || g==-180)) { glRotatef(-h, 0.0f, 1.0f, 0.0f); }
if((f==180 || f==-180) && (g==-90 || g==270)) { glRotatef(h, 0.0f, 0.0f, 1.0f); }


Čili ručně upravuju v závislosti na natočení, kolem které osy bude další rotace, ale to při 3 osách ve 3D prostoru je dost náročný a únavný na myšlení a dost náchylný na dělání chyb takže se mi to stejně ani nepovede. Ve 2D by to ještě šlo.

Už chápeš o co mi jde ? :)

Jinak fakt oceňuju tvojí pomoc protože sám s tim asi už nehnu :(

Nahlásit jako SPAM
IP: 91.195.106.–
vollf820
Stálý člen
11. 11. 2008   #8
-
0
-

Jeste pripojuji teda zdrojáky at si to můžeš vyzkoušet. Chvíli rotuj a uvidíš že po pár rotacích jsou ty další už do nesmyslnejch směrů. Rotuje se šipkama a do třetího směru klávesami Q a E.

Nahlásit jako SPAM
IP: 91.195.106.–
o-lox0
Super člen
11. 11. 2008   #9
-
0
-

No jo ale co tu chceš od nás/mne slyšet, viděls jak jim to v Lekci 48 krásně šlape?
Tak to vem jako základ, přetvoř vstup z myši do klávesnice. Nechtěls aby se s tebou na tom někdo
podílel, tak konec otázek, nebo si dej jednu do Matematiky - Kdo mě naučí správně od základu pracovat s projekcí a Maticema v 3D? (no formulace nic moc :)
Neboť GlRotate ti rotuje s objektem ne s kamerou, ale ty potřebuješ zohlednit projekci, toť vše.

Nahlásit jako SPAM
IP: 85.71.152.–
vollf820
Stálý člen
11. 11. 2008   #10
-
0
-

No chtěl sem slyšet nějakej záchytnej bod, popsat jak se to dá vyřešit nebo aspon odkaz někam, kde se zabývaj přímo tímhle problémem (článek apod.). No vidíš aspon si mi řek, že to souvisí s projekcí a maticema, další slovíčka do googlu :smile18: Ještě jednou díky moc. :smile2:

Ještě si teda projdu tu 48. lekci toho tutoriálu. Už sem na to koukal ale právě sem to tam vůbec nenašel jak to funguje. Ale tak když říkáš že to tam je, tak to tam najdu :smile8:

Nahlásit jako SPAM
IP: 85.132.191.–
vollf820
Stálý člen
12. 11. 2008   #11
-
0
-

Tákže, pro ty co by měli stejný problém ... tento jev, který sem popsal se jmenuje gimbal lock (asi oficiální název). A zde je pár odkazů, z kterých se dá (snad) vyčíst řešení (něco je anglicky).

Dotaz s odpovědí na fóru builderu.cz - http://forum.builder.cz/read.php?124,2140623
Podrobný popis a řešení (ENG) - http://www.edharriss.com/tutorials/tutorial_xsi_gimbal/xsi_gimbal.html
Vysvětlení quaternionů (ENG) - http://www.gamedev.net/reference/articles/article1095.asp
Český NeHe tutoriál ohledně gimbal locku - http://nehe.ceske-hry.cz/cl_gl_kamera.php

Snad to někomu pomůže.

Nahlásit jako SPAM
IP: 91.195.106.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 57 hostů

Podobná vlákna

SDL, OGL a glRotatef — založil entity

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý