1

Android用のルービックキューブをやろうとしています。ローテーションについて1つ質問があります。視覚的に正しい図形を回転させたい。これは、ユーザーが画面にタッチして指を右に動かした後、図形が観測点の横から右に回転することを意味します。しかし、いくつかの回転を行うと、フィギュアが正しい方向に動き始めません。その軸次第で状況が変わるのは理解しています。しかし、逆モデル行列を使用して必要な座標を取得しようとしましたが、まだ結果が得られていません。マウスまたはタッチスクリーンを使用して 3D フィギュアを視覚的に正しく回転させる例またはリンクを教えてもらえますか?

   //get vector 3D of touch
   Vector3f touchVector = getRubikSystemCoordinates(mTouchX,mTouchY,square.rubikRotationMatrix);
   //Get vector 3D of move     
   Vector3f moveVector = getRubikSystemCoordinates(mMoveX,mMoveY,square.rubikRotationMatrix);
        //get direction of motion
        float direction = touchVector.substractFrom(moveVector); 
        //get axis for rotation
        Vector3f axis = touchVector.vectorProductTo(moveVector);
        //normalize axis
        axis.normalize();
        //get angle of rotation
        float angle = direction.length;
        //make identity Quad
        Quaternion quad = new Quaternion();
        //make rotation quad
        quad.makeRotationKvaternion(angle,axis);
        //from quad recieve matrix
        Matrix4f matrix = quad.toMatrix();
        //multiply to current modelview matrix
        gl.glMultMatrixf(matrix.returnArray(),0);
        //save rotation matrix
        square.rotationMatrix = square.rotationMatrix.multiply(matrix);
        //save modelView matrix
        square.saveModelView(square.initMatrix.returnArray()); 


      // touch coords to current modelView coords
      private Vector3f getRubikSystemCoordinates(float x, float y, Matrix4f matrix){
       // touch coords to normal coords of screen 
       Vector2f normalCoords = (new Vector2f(x,y)).toNormalScreenCoordinates(Settings.viewPort[2],Settings.viewPort[3]);
        // to sphere coords in 3D
        Vector3f sphereVector = new Vector3f(normalCoords.x,normalCoords.y, FloatMath.sqrt(2-normalCoords.x*normalCoords.x-normalCoords.y*normalCoords.y));
        //Get inverse matrix from ModelView Matrix
        Matrix4f m = matrix.inverseMatrix();
        //Get vector for current modelView 3D coords
        Vector3f vector = m.multiplyToVector(vector);
        // make normalize vector
        vector.normalize();
        return vector;
        }
4

2 に答える 2

1

あなたが探しているのは、アークボールの回転という名前です。これについては、インターネット上で Java に関するリソースがたくさん見つかります。

于 2012-06-26T20:51:57.003 に答える
0

回転を 3 つの角度として保存している可能性があります。代わりにマトリックスを使用してください。この回転のためだけに別の変換行列を作成します。ユーザーがオブジェクトを回転するたびに、このマトリックスに回転が適用されます。この方法では、移動は常に現在の方向に相対的になります。

于 2012-06-26T17:07:37.467 に答える