Визуально правильное вращение с возможностями OpenGl и сенсорного экрана

Я пытался сделать Cube of Rubik для Android. У меня есть один вопрос о вращениях. Я хочу повернуть фигуру визуально правильно. Это означает, что если сенсорный экран пользователя и после перемещения его пальца вправо, фигура поворачивается вправо от точки наблюдения. Но когда я делаю некоторые повороты, фигура начинает двигаться в неправильном направлении. Я понимаю, что это зависит от того, какие оси изменить их положение. Но я пытался использовать матрицу обратной модели, чтобы получить необходимые координаты, но я уже не получил результат. Кто-нибудь может привести пример или ссылку на визуально правильное вращение трехмерной фигуры с помощью мыши или сенсорного экрана?

   //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;
        }

Ответы на вопрос(2)

То, что вы ищете, называетсяarcball вращение. Вы найдете множество ресурсов в java по всему Интернету на эту тему.

 Michael Katkov26 июн. 2012 г., 23:31
Спасибо большое. Я уже нашел некоторые ресурсы))

Вы, вероятно, храните свое вращение как три угла. Вместо этого используйте матрицу. Создайте отдельную матрицу преобразования только для этого вращения. Каждый раз, когда пользователь поворачивает объект, применяйте вращение к этой матрице. Таким образом, движение всегда будет относительно текущей ориентации.

 26 июн. 2012 г., 19:35
Сделайте это, или если вы испытываете приключения, узнайте о Quaternions и сохраните ваши вращения таким образом. Это только 4 числа с плавающей запятой вместо 16, и накопление вращений намного дешевле, чем умножение матриц. Опять же, это не звучит как особенно интенсивная игра, поэтому нет необходимости оптимизировать ...
 Michael Katkov26 июн. 2012 г., 22:24
Это моя "идеальная кодировка". Может быть, вы можете сказать мне, в чем проблема, но все ваши советы я попробовал. Возможно, это не зависит от подхода! Дальше возможно у меня есть некоторые логические проблемы)))

Ваш ответ на вопрос