Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Gimbal Lock o drifting... ...una solucion quiero!!!

Iniciado por Degiik, 01 de Enero de 1970, 01:00:00 AM

« anterior - próximo »

Degiik

                                He leido un post de hace algunos dias donde se habla del gimbal lock, tambien llamado defecto de gimbal o incluso drifting. Bueno hace tiempo que se lo que es, se que se soluciona con quaternions, pero no encuentro ningun p.to codigo que enseñe a solucionar el gimbal lock. ¿Alguien lo ha implementado quaternions, y quiere compartir sus conocimientos?, o prefiere llevarselos a la tumba ( jur jur ). Eso es todo. ( me he quedado agusto llevo 5 meses ) Seria ya la demasiado si lo sabeis solucionar en OpenGl.

[ Este Mensaje fue editado por: degiik el 2002-05-11 21:59 ]                                
egiik: h-O-5 hoja/ingestión 100mo Vida suspendida ( 1 día )

Ithaqua

                                Se soluciona generalmente con quaternions sí, y es independiente del API que uses (por lo que pides de OpenGL).
Simplemente usa solo quaternions para rotar (componiendo multiplicaciones de quats), y luego ya cuando quieras el resultado pasas eso a matriz.
Dado que el problema del gimbal lock se da cuando compones determinadas rotaciones, el hacerlo usando quaternions soluciona el problema. Recuerda que multiplicar quaternions que representan rotaciones es como obtener un resultado con la suma de todas las rotaciones.

Si por ejemplo quieres actualizar una cámara sencilla sin problema de gimbal lock. Pseudocódigo:

Quat quatX = BuildQuat(incremCamAnguloX);
Quat quatY = BuildQuat(incremCamAnguloY);

quatCamara = quatCamara * quatX * quatY;

Camara.SetMatrix(quatCamara.Matriz());

Información sobre álgebra de quaternions y cómo usarlos para representar rotaciones los tienes a patadas. Busca en google.

                               
thaqua^Stravaganza
http://ithaqua.stravaganza.org

Degiik

                                mmm... ...en mis multiples intentos ya habia realizado algo parcedio, mi algoritmo que estoy utilizando es el siguiente:

Quat kk;
float m[4][4];

//convierte lo angulos euler a tres quats
//y los multiplica entre si, devolviendo
//el Quat del producto de los tres.
kk=glEulerToQuaternions (x,y,z);

//Paso el Quaternion a Matriz
glQuaternionsToMatrix (m,kk);

//Lo multiplico por la matriz actual
//de modelado, que es la Identidad en mi
//codigo
glMultMatrixf (&m[0][0]);

Suponiendo que el codigo que realiza estas operaciones este bien de lo cual no puede estar seguro, pues me encotre distintas formas de multiplicar quats, y de obtener matrices, Del algoritmo que tu me diste me falta una cosa que no se de donde la obtienes...

" quatCamara = quatCamara * quatX * quatY; "


multiplicas el producto de los quats por quatCamara.  Que es quat camara ? de donde lo obtines ?.

( Gracias por contestarme Ithaqua, almenos me doy cuenta que no estaba tan perdido como pensaba )


_________________
Degiik: h-O-5 hoja/ingestión 100mo Vida suspendida ( 1 día )

[ Este Mensaje fue editado por: Degiik el 2002-05-12 12:20 ]                                
egiik: h-O-5 hoja/ingestión 100mo Vida suspendida ( 1 día )

Ithaqua

                                quatCamara es un quaternion donde vas a ir acumulando las rotaciones de la cámara (no solo para ese frame, sino en general).
Tu en el código que tienes calculas el quaternion a partir de los ángulos de Euler, hasta ahí bien, pero el problema viene a la hora del glMultMatrix. Ahí lo que estas haciendo es acumular la transformación y no lo haces con quaternions. Lo que en tu código es glMultMatrix en el mío es quatCamara = quatCamara * quatX * quatY;
A partir de aquí tienes la rotación total (no relativa del frame). Lo que necesitas ahora es simplemente añadir la posición de la cámara y subir esa matriz:

camMatrix = quatCamara.ToMatrix();
camMatrix.Translate(camPos);

glLoadMatrixf(camMatrix);
                               
thaqua^Stravaganza
http://ithaqua.stravaganza.org

Degiik

                                ueeeeeeeee!!!!!!!

adios al gimbal lock!!!!!

gracias Ithaqua :sonriendo:
                               
egiik: h-O-5 hoja/ingestión 100mo Vida suspendida ( 1 día )

Ithaqua

                                Incluso la ropa esta mas blanca y fresca que antes :ojo:

                               
thaqua^Stravaganza
http://ithaqua.stravaganza.org






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.