2010-05-03 16 views
8

Estoy tratando de mostrar un objeto en la vista que se puede girar de forma natural arrastrando el cursor/pantalla táctil. Por el momento tengo X e Y de rotación de un objeto como ésteGiro en OpenGL relativo a la ventana gráfica

glRotatef(rotateX, 0f, 1f, 0f); // Dragging along X, so spin around Y axis 
glRotatef(rotateY, 1f, 0f, 0f); 

entiendo por qué esto no se haga lo que yo quiero que haga (por ejemplo, si usted lo hace girar derecha 180 grados, arriba y abajo girar se invierte). Simplemente no puedo encontrar la manera de que ambas direcciones permanezcan izquierda-derecha y arriba-abajo en relación con el espectador.

Supongo que la cámara está fija y mirando a lo largo del eje Z. ¿Algunas ideas?

+0

Nick - Me gustaría ver la clase resultante que surgió para esta pregunta: parece que su Pastebin ha expirado. Gracias – Seidr

+0

Extraño, pensé que pondría mi pasta para vivir para siempre. Cuando esté cerca de mi código más tarde lo pondré en una esencia de Github y lo vincularé aquí. – Nick

+0

Genial, gracias Nick! :) – Seidr

Respuesta

7

Su mejor opción es implementar una rotación basada en Quaternion. En el mundo de Quaternion, cada vez que gira, se alineará con el eje que especifique, sin verse afectado por las rotaciones anteriores. Esta es también la razón por la cual no sufre de Gimbal Lock.

he encontrado estas páginas útiles para la implementación de los cuaterniones:

Buena suerte. Estoy seguro de que hay otras soluciones, pero esta es una de las más limpias que puedes tener.

+0

Gracias - Sospeché que el temible mundo de los cuaterniones podría estar involucrado en esto. Informaré con resultados. – Nick

+2

Esperaré tu victoria. –

+0

¡Éxito! Después de algunos intentos diferentes para manipular los cuaterniones, he encontrado que funciona bien para crear un vector que represente la resistencia actual del mouse/dedo, luego calcule el ángulo recto para actuar como el eje de rotación. Luego, usando la magnitud del vector como ángulo de rotación, puede crear un cuaternario de eso. Si alguien está muy interesado en algún código desordenado de Android que hace esto, házmelo saber. Gracias Xavier. – Nick

1

Decidí poner mi clase DragControl para descargar, junto con la clase de soporte de Quaternion. Una vez que tiene un lienzo OpenGL mirando a lo largo del eje Z en algún objeto, no debería ser un gran esfuerzo dejarlo caer. Son los simples archivos .java actualmente, no hay una biblioteca construida.

DragControl maneja casi todo lo que incluye lanzar los dedos, para que pueda enviar su objeto girando con solo un golpe.

http://github.com/halfninja/android-dragcontrol3d

En la configuración de actividad:

dragControl = new DragControl(); 
glView.setOnTouchListener(dragControl); 

Al actualizar rotación de objetos en un bucle:

Quaternion rotation = dragControl.currentRotation(); 

Si realiza modificaciones fresco que me gustaría verlos.

2

¡Solucionado! Agregue xAngle y yAngle a la matriz actual.

Matrix.rotateM(matrix, 0, xAngleADD, matrix[1], matrix[5], matrix[9]); 
Matrix.rotateM(matrix, 0, yAngleADD, matrix[0], matrix[4], matrix[8]); 
gl.glMultMatrixf(matrix, 0); 
Cuestiones relacionadas