Вращение кватерниона не работает как исключение

В OpenGL ES 1 для Android у меня есть кубик Рубика, состоящий из 27 кубиков меньшего размера. я хочу вращения, которые заставят конкретный маленький куб стать точно перед точкой обзора. поэтому мне нужно два вектора. один - это вектор, который исходит от начала объекта к конкретному кубу. а другой - вектор, идущий от начала координат к точке обзора. затем их перекрестное произведение дает мне ось вращения, а скалярное произведение дает мне угол.

Я конвертирую (0,0,1)-который является вектором, идущим от начала координат к точке обзора в мировых координатах -и координатам объекта. вот код:

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

Я использую два кватерниона для вращения. каждый раз, когда пользователь выбирает действие, должно происходить одно из этих вращений. вот код:

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

теперь проблема в том, что он отлично работает только для первого вращения. какой бы ни была первая ротация.он работает хорошо, но для следующих вращений кажется, что он получает неправильную ось и градус.

Например, если система координат будет

  • X -справа (1,0,0)
  • Y -вверх (0,1,0)
  • Z -в (0,0,1)

затем первый поворот вокруг X на 90 градусов против часовой стрелки (против часовой стрелки )дает

  • X' -правый (1,0,0)
  • Y' -в (0,0,1)
  • Z' -вниз (0, -1,0)

и второе вращение вокруг Z на 90 градусов против часовой стрелки производит

  • X' -в (0,1,0)
  • Y' -левый (-1,0,0)
  • Z' -вниз (0, -1,0)

но я ожидаю

  • X -вверх (0,1,0)
  • Y -в (0,0,1)
  • Z -правая (1,0,0)

Я думаю, проблема в том, что resultVector (второй вектор, который я использовал, который исходит от источника к точке обзора ), не преобразуется должным образом. кто-нибудь знает, как я могу преобразовать мировую координату в координату объекта? кто-нибудь знает, как мы можем определить координаты объекта, когда объект повернулся?

5
задан Ramin Zahedi 27 September 2019 в 20:09
поделиться