Вращение кватерниона не работает как исключение
В 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-right (1,0,0) Y-up (0,1,0) Z-in (0,0,1)затем первое вращение вокруг X 90 градусов против часовой стрелки (против часовой стрелки) производит
X'-right (1,0,0) Y'-in (0,0,1) Z'-down (0,-1,0)и второе вращение вокруг Z 90 градусов против часовой стрелки производит
X'-in (0,1,0) Y'-left (-1,0,0) Z'-down (0,-1,0)но я ожидаю
X-up (0,1,0) Y-in (0,0,1) Z-right(1,0,0)Я думаю, что проблема в том, что resultVector (второй вектор, который я использовал, который идет от начала координат до точки обзора) не конвертируется должным образом. Кто-нибудь знает, как я могу преобразовать мировую координату в координату объекта? Кто-нибудь знает, как мы можем определить координаты объекта, когда объект вращается?