Visuell korrekte Drehung mit OpenGl und Touchscreen-Funktionen
Ich habe versucht, Cube of Rubik für Android zu tun. Ich habe eine Frage zu Rotationen. Ich möchte eine Figur visuell korrekt drehen. Dies bedeutet, wenn der Benutzer den Touchscreen berührt und nach dem Bewegen des Fingers nach rechts eine Figur von der Seite des Beobachtungspunkts nach rechts dreht. Aber wenn ich ein paar Umdrehungen mache, bewegt sich die Figur nicht in die richtige Richtung. Ich verstehe, dass es auf dieser Achse ankommt, ihre Situation zu ändern. Ich habe versucht, die inverse Modellmatrix zu verwenden, um die erforderlichen Koordinaten zu erhalten, aber ich habe noch kein Ergebnis erzielt. Kann mir jemand ein Beispiel oder einen Link für die visuell korrekte Drehung der 3D-Figur mit Hilfe der Maus oder des Touchscreens geben?
//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;
}