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 :(