在 OpenGL ES 1 for android 中,我有一个由 27 个较小的立方体组成的 Rubic 立方体。我想要导致特定小立方体正好在视点前面的旋转。所以我需要两个向量。一个是从对象的原点到特定立方体的向量。另一个是从原点到视点的向量。然后它们的叉积给我旋转轴,点积给我角度。
我将 (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-in (0,0,1)
然后第一次绕 X 90 度逆时针 (CCW) 旋转产生
- X'-右 (1,0,0)
- Y'-in (0,0,1)
- Z'-向下 (0,-1,0)
和围绕 Z 90 度 CCW 的第二次旋转产生
- X'-in (0,1,0)
- Y'-左 (-1,0,0)
- Z'-向下 (0,-1,0)
但我希望
- X-up (0,1,0)
- Y-in (0,0,1)
- Z-right(1,0,0)
我认为问题在于 resultVector(我使用的从原点到视点的第二个向量)没有正确转换。任何人都知道如何将世界坐标转换为对象坐标?任何人都知道当物体旋转时我们如何确定物体坐标?