Ich bin auf der Suche nach einer einfachen Implementierung für Arcball Rotation auf 3D-Modellen mit Quaternionen, speziell mit GLKit auf iOS. Bisher habe ich die folgenden Quellen untersucht:Arcball Rotation mit Quaternions (mit iOS GLKit)
Ich habe auch zu verstehen, Quellcode und Mathematik von here und here versucht. Ich kann mein Objekt drehen, aber es springt in bestimmten Winkeln herum, so dass ich befürchte, dass die kardanische Verriegelung im Spiel ist. Ich benutze Gestenerkenner, um die Rotationen zu steuern (Schwenkgesten beeinflussen Rollen und Gieren, Drehen von Gesten beeinflussen die Tonhöhe). Ich füge meinen Code für die Quaternion-Behandlung sowie die Modelview-Matrix-Transformation an.
Variablen:
GLKQuaternion rotationE;
Quaternion Handhabung:
- (void)rotateWithXY:(float)x and:(float)y
{
const float rate = M_PI/360.0f;
GLKVector3 up = GLKVector3Make(0.0f, 1.0f, 0.0f);
GLKVector3 right = GLKVector3Make(1.0f, 0.0f, 0.0f);
up = GLKQuaternionRotateVector3(GLKQuaternionInvert(self.rotationE), up);
self.rotationE = GLKQuaternionMultiply(self.rotationE, GLKQuaternionMakeWithAngleAndVector3Axis(x*rate, up));
right = GLKQuaternionRotateVector3(GLKQuaternionInvert(self.rotationE), right);
self.rotationE = GLKQuaternionMultiply(self.rotationE, GLKQuaternionMakeWithAngleAndVector3Axis(y*rate, right));
}
- (void)rotateWithZ:(float)z
{
GLKVector3 front = GLKVector3Make(0.0f, 0.0f, -1.0f);
front = GLKQuaternionRotateVector3(GLKQuaternionInvert(self.rotationE), front);
self.rotationE = GLKQuaternionMultiply(self.rotationE, GLKQuaternionMakeWithAngleAndVector3Axis(z, front));
}
Modelview Matrix-Transformation (Looping Unentschieden):
// Get Quaternion Rotation
GLKVector3 rAxis = GLKQuaternionAxis(self.transformations.rotationE);
float rAngle = GLKQuaternionAngle(self.transformations.rotationE);
// Set Modelview Matrix
GLKMatrix4 modelviewMatrix = GLKMatrix4Identity;
modelviewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -0.55f);
modelviewMatrix = GLKMatrix4Rotate(modelviewMatrix, rAngle, rAxis.x, rAxis.y, rAxis.z);
modelviewMatrix = GLKMatrix4Scale(modelviewMatrix, 0.5f, 0.5f, 0.5f);
glUniformMatrix4fv(self.sunShader.uModelviewMatrix, 1, 0, modelviewMatrix.m);
Jede Hilfe wird sehr geschätzt, aber ich möchte es so einfach wie möglich halten und bei GLKit bleiben.
Brilliant Antwort, es funktionierte perfekt. Dies ist meine erste Unternehmung in Quaternionen, daher wird die klare Erklärung sehr geschätzt - danke! Ich habe meine Frage bearbeitet, um Ihren in (1) angesprochenen Punkt zu verdeutlichen, obwohl die Geste "Pfanne" heißt (iOS-Konvention), sie steuert tatsächlich die Drehung meines Modells. –