В 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 на 90 градусов против часовой стрелки (против часовой стрелки )дает
и второе вращение вокруг Z на 90 градусов против часовой стрелки производит
но я ожидаю
Я думаю, проблема в том, что resultVector (второй вектор, который я использовал, который исходит от источника к точке обзора ), не преобразуется должным образом. кто-нибудь знает, как я могу преобразовать мировую координату в координату объекта? кто-нибудь знает, как мы можем определить координаты объекта, когда объект повернулся?