Poprawna wizualnie rotacja dzięki możliwościom OpenGl i ekranu dotykowego
Próbowałem zrobić Cube of Rubik dla Androida. Mam jedno pytanie dotyczące rotacji. Chcę obrócić figurę poprawną wizualnie. Oznacza to, że jeśli ekran dotykowy użytkownika i po przesunięciu palca w prawo, cyfra obraca się w prawo od strony punktu obserwacyjnego. Ale kiedy wykonuję kilka obrotów, figura zaczyna się poruszać w niewłaściwym kierunku. Rozumiem, że od tej osi zależy zmiana ich sytuacji. Ale starałem się użyć odwrotnej macierzy modelu, aby uzyskać potrzebne współrzędne, ale jeszcze tego nie zrobiłem. Czy ktoś mógłby mi podać przykład lub link wizualnie poprawnej rotacji figury 3D za pomocą myszy lub ekranu dotykowego?
//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;
}