La rotación del cuaternión no funciona como excepción.

En OpenGL ES 1 para Android, tengo un cubo Rubic que consta de 27 cubos más pequeños. Quiero rotaciones que causan que un cubo pequeño en particular se convierta exactamente delante del punto de vista. Así que necesito dos vectores. uno es el vector que proviene del origen del objeto a un cubo en particular. y otro es el vector que viene del origen al punto de vista. entonces el producto cruzado de ellos me da el eje de la rotación y el producto de puntos me da el ángulo.

Convierto el (0,0,1), que es el vector que viene del origen al punto de vista en coordenadas mundiales, a coordenadas del objeto. Aquí está el código:

    matrixGrabber.getCurrentModelView(gl);
    temporaryMatrix.set(matrixGrabber.mModelView);

    inputVector[0] = 0f; 
    inputVector[1] = 0f;
    inputVector[2] = 1f;
    inputVector[3] = 1f;
    Matrix.multiplyMV(resultVector, 0, temporaryMatrix.InvertMatrix(), 0, inputVector,0);
    resultVector[0]/=resultVector[3];
    resultVector[1]/=resultVector[3];
    resultVector[2]/=resultVector[3];

    inputVector = ..... // appropriate vector due to user-selection 

    axis = Vector.normalized(Vector.crossProduct(Vector.normalized(inputVector), Vector.normalized(resultVector)));
    degree = (float)Math.toDegrees(Math.acos(Vector.dot(Vector.normalized(inputVector), Vector.normalized(resultVector))));

Yo uso dos cuaterniones para rotaciones. cada vez que el usuario elija una acción, una de esas rotaciones debería ocurrir. Aquí está el código:

    Quaternion currentRotation = new Quaternion();
    Quaternion temporaryRotation = new Quaternion();
    .
    .
    .
     currentRotation = (currentRotation).mulLeft(temporaryRotation.set(axis, degree));
     currentRotation.toMatrix(matrix);
     gl.glMatrixMode(GL10.GL_MODELVIEW);
     gl.glMultMatrixf(matrix, 0);

Ahora el problema es que simplemente funciona bien para la primera rotación. Cualquiera que sea la primera rotación sería. Funciona bien, pero para las siguientes rotaciones parece que obtiene un grado y un eje incorrectos.

Por ejemplo, si el sistema de coordenadas sería

Derecha X (1,0,0)Y-up (0,1,0)Z-in (0,0,1)

luego la primera rotación alrededor de X 90 grados en sentido contrario a las agujas del reloj (CCW) produce

X'-derecha (1,0,0)Y'-in (0,0,1)Z'-abajo (0, -1,0)

y la segunda rotación alrededor de Z 90 grados produce CCW

X'-in (0,1,0)Y'-izquierda (-1,0,0)Z'-abajo (0, -1,0)

pero espero

X-up (0,1,0)Y-en (0,0,1)Z-derecha (1,0,0)

Creo que el problema es que el resultVector (el segundo vector que utilicé que proviene del origen hacia el punto de vista) no se convierte correctamente. ¿Alguien sabe cómo puedo convertir la coordenada mundial en coordenada de objeto? ¿Alguien sabe cómo podemos determinar las coordenadas del objeto cuando el objeto ha girado?

Respuestas a la pregunta(2)

Su respuesta a la pregunta