Rotacja kwaternionów nie działa w sposób wyłączony

W OpenGL ES 1 dla Androida mam kostkę Rubic, która składa się z 27 mniejszych kostek. Chcę, aby obroty powodujące, że konkretny mały sześcian staje się dokładnie przed punktem widzenia. więc potrzebuję dwóch wektorów. jeden jest wektorem pochodzącym od początku obiektu do określonego sześcianu. a inny to wektor pochodzący z punktu widzenia do punktu widzenia. następnie produkt krzyżowy daje mi oś obrotu, a produkt kropkowy daje mi kąt.

Przekształcam (0,0,1) - który jest wektorem pochodzącym od początku do punktu widzenia we współrzędnych współrzędnych obiektu. oto kod:

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

Do rotacji używam dwóch czwartorzędów. za każdym razem, gdy użytkownik wybierze akcję, jeden z tych obrotów powinien się wydarzyć. oto kod:

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

teraz problem polega na tym, że działa dobrze po pierwszym obrocie. jakikolwiek byłby pierwszy obrót. działa dobrze, ale przy kolejnych obrotach wydaje się, że uzyskuje niewłaściwą oś i stopień.

Na przykład, jeśli układ współrzędnych byłby

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

następnie następuje pierwszy obrót wokół X 90 stopni w lewo (CCW)

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

i drugi obrót wokół Z 90 stopni CCW wytwarza

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

ale oczekuję

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

Myślę, że problem polega na tym, że wektor wynikowy (drugi wektor, którego użyłem, pochodzący z punktu początkowego w kierunku punktu widzenia) nie konwertuje poprawnie. każdy wie, jak mogę przekonwertować współrzędną świata na współrzędną obiektu? każdy wie, jak możemy określić współrzędne obiektu, gdy obiekt się obrócił?

questionAnswers(2)

yourAnswerToTheQuestion