与OpenGL和触摸屏功能在视觉上正确的旋转(Visually correct rotation w

2019-07-30 03:09发布

我一直在试图为Android做魔方的立方体。 我有一个旋转的问题。 我想旋转一个数字视觉上是正确的。 这意味着,如果用户的触摸屏和他的举动后手指向右一个身影从观察点的一侧旋转到正确的。 但是,当我做一些旋转的身影在不正确的方向开始移动。 据我所知,这取决于该轴是改变自己的处境。 但是我试图用逆模型矩阵以获取必要的坐标,但是我还没有结果。 可能有人给我举例或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;
        }

Answer 1:

您要查找的被命名为轨迹球旋转。 你会发现很多的资源在Java周围的上网本。



Answer 2:

你可能会存储你的旋转作为三个角度。 使用矩阵来代替。 只是这种旋转创建单独的变换矩阵。 每当用户旋转对象应用旋转到这个矩阵。 这样,运动永远是相对于当前方向。



文章来源: Visually correct rotation with OpenGl and touch screen capabilities