Android用のOpenGL ES 1には、27個の小さな立方体で構成されるルービック立方体があります。特定の小さな立方体が視点の真正面になるような回転が必要です。だから私は2つのベクトルが必要です。1 つは、オブジェクトの原点から特定の立方体までのベクトルです。もう 1 つは、原点から視点に向かうベクトルです。次に、それらの外積から回転軸が得られ、内積から角度が得られます。
(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))));
回転には 2 つのクォータニオンを使用します。ユーザーがアクションを選択するたびに、そのローテーションのいずれかが発生する必要があります。コードは次のとおりです。
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 を中心に反時計回り (CCW) に 90 度回転すると、
- X'-右 (1,0,0)
- Y'-in (0,0,1)
- Z'-down (0,-1,0)
Z を中心に 90 度反時計回りに 2 番目の回転を行うと、
- X'-in (0,1,0)
- Y'-左 (-1,0,0)
- Z'-down (0,-1,0)
しかし、私は期待しています
- X-up (0,1,0)
- Y イン (0,0,1)
- Z-right(1,0,0)
問題は、resultVector(原点から視点に向かって使用した2番目のベクトル)が正しく変換されないことだと思います。世界座標をオブジェクト座標に変換する方法を知っている人はいますか? オブジェクトが回転したときにオブジェクト座標を決定する方法を知っている人はいますか?