¿es posible girar un modelo 3d sobre sus ejes locales?

Después de haber conseguido exportar el modelo 3d + las texturas, no sin problemas, a la DS; ahora me encuentro con el problema de que querría girar el modelo sobre sus ejes locales y no sobre los globales qué es como, por lo que sé hasta ahora, hace opengl.

¿habría alguna forma de hacerlo?

Espero haberme explicado mínimamente bien, gracias
estas utilizando nitroengine??
¿Pero tú te has molestado en buscar algo? ¬_¬

void glRotateX(int angle)
void glRotatef32i(int angle, int32 x, int32 y, int32 z) para este se usa floattof32() para pasar de float a int
etc...
A ver, claro que he utilizado glRotateX y también usé glRotateF. Pero estas instrucciones giran, por decirlo de alguna forma, respecto a la cámara y así no me vale. Mi intención es girar el modelo según sus ejes.
mikethunder escribió:A ver, claro que he utilizado glRotateX y también usé glRotateF. Pero estas instrucciones giran, por decirlo de alguna forma, respecto a la cámara y así no me vale. Mi intención es girar el modelo según sus ejes.

¿Cómo dibujas el modelo? ¿Sumando a las coordenadas de los vértices la posición o con glTranslate?
mikethunder escribió:con glTranslate

Pues justo antes de dibujar el modelo y despúes de usar glTranslate, usas glRotate...
Nada y lo curioso es que el giro lo hace bien sobre el eje y (locales), pero sobre el x lo sigue haciendo respecto a la cámara.
mikethunder escribió:Nada y lo curioso es que el giro lo hace bien sobre el eje y (locales), pero sobre el x lo sigue haciendo respecto a la cámara.

¿Pero qué orden sigues?

El orden para dibujar algo es:

push matrix
translate(posicion)
rotate
draw
pop matrix
aquí va el bucle:

while(1)
{
glPushMatrix();
scanKeys();
u16 keys = keysHeld();
if(!(keys & KEY_UP)) rotateX += 3;
if(!(keys & KEY_DOWN)) rotateX -= 3;
if(!(keys & KEY_LEFT)) rotateY -= 3;
if(!(keys & KEY_RIGHT)) rotateY += 3;
if(!(keys & KEY_A)) moverX -=0.1;
if(!(keys & KEY_B)) moverX +=0.1;
// glTranslatef(moverX,0,0); si lo pongo aquí la figura sigue la ruta por el eje x respecto a la cámara, que no me vale
glRotateX(rotateX); //rota figura en eje X (esta rotación la hace sobre eje x respecto a la cámara, así no me vale)
glRotateY(rotateY); //rota figura en eje Y (esta rotación la hace bien)
glRotateZ(rotateZ);
glTranslatef(moverX,0,0); //si lo pongo aquí la figura sigue la ruta por su eje x, que es lo que quiero
glBindTexture(0, textureID[1]);
glCallList((u32*)figura_md2); //Carga la figura
glPopMatrix(1);
glFlush(0); //Limpia el buffer de la pantalla
PA_WaitForVBL();
}
Es que la multiplicación de matrices no es conmutativa. Dependiendo de si haces el translate antes o después, afectará de un modo o de otro. Si haces el translate a partir de la matriz identidad, te estás moviendo respecto al origen de coordenadas, y "cambias" el origen de coordenadas a la posición en la que te has movido, así que todas las siguientes transformaciones serán respecto de ese nuevo centro. Si haces un giro, lo que estás haciendo es girar los ejes, así que cualquier movimiento que hagas después se verá afectado.

La verdad, no se muy bien lo que pretendes hacer... Si no consigues hacer lo de los giros con esas 3 funciones, usa la de glRotatef32(angle,floattof32(x),floattof32(y),floattof32(z)) para decir tu mismo los ejes...
Mi intención es mover un avión, lo cual puede ser bastante complicado; sobre todo, si quiero controlar el avión respecto a los 3 ejes (alabeo, guiñada, cabeceo).
glRotatef32 me hace exactamente lo mismo.
Entonces lo suyo es que seas tu mismo el que se encarga de calcular los ejes... Porque si además vas a tener que hacer cosas con la inclinación y tal, y le mandes girar en torno a los ejes que tu has calculado...
(mensaje borrado)
13 respuestas