Die Rotation von Quaternionen funktioniert nicht wie vorgesehen

In OpenGL ES 1 für Android habe ich einen Rubic-Cube, der aus 27 kleineren Cubes besteht. Ich möchte Rotationen, die dazu führen, dass ein bestimmter kleiner Würfel genau vor dem Blickwinkel erscheint. Ich brauche also zwei Vektoren. Einer ist der Vektor, der vom Ursprung des Objekts zu einem bestimmten Würfel kommt. und ein anderer ist der Vektor, der vom Ursprung zum Standpunkt kommt. dann gibt das Kreuzprodukt von ihnen mir die Achse der Rotation und das Punktprodukt gibt mir den Winkel.

Ich konvertiere den (0,0,1) -Vektor, der vom Ursprung zum Ansichtspunkt in Weltkoordinaten kommt, in Objektkoordinaten. Hier ist der Code:

    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))));

Ich benutze zwei Quaternionen für Rotationen. Jedes Mal, wenn der Benutzer eine Aktion auswählt, sollte eine dieser Rotationen stattfinden. Hier ist der Code:

    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);

Jetzt ist das Problem, dass es nur für die erste Umdrehung gut funktioniert. was auch immer die erste Umdrehung sein würde. es funktioniert gut, aber für die nächsten Umdrehungen scheint es, dass es falsche Achse und Grad bekommt.

Zum Beispiel, wenn das Koordinatensystem wäre

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

dann wird zunächst eine Drehung um X 90 Grad gegen den Uhrzeigersinn (CCW) erzeugt

X'-rechts (1,0,0)Y'-in (0,0,1)Z'-down (0, -1,0)

und eine zweite Drehung um Z 90 Grad im Uhrzeigersinn erzeugt

X'-in (0,1,0)Y'-left (-1,0,0)Z'-down (0, -1,0)

aber ich erwarte

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

Ich denke, das Problem ist, dass der resultVector (der zweite Vektor, den ich verwendet habe, der vom Ursprung zum Standpunkt kommt) nicht richtig konvertiert. weiß jemand, wie ich die Weltkoordinate in Objektkoordinate konvertieren kann? weiß jemand, wie wir Objektkoordinaten bestimmen können, wenn sich das Objekt gedreht hat?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage