Sto cercando un'implementazione semplice per la rotazione del arcball su modelli 3D con quaternioni, in particolare utilizzando GLKit su iOS. Finora, ho esaminato le seguenti fonti:Rotazione Arcball con Quaternioni (utilizzando GLKit iOS)
Ho anche cercato di capire il codice sorgente e la matematica da here e here. Posso ruotare il mio oggetto ma continua a saltare intorno ad alcuni angoli, quindi temo che il blocco cardanico sia in gioco. Uso i riconoscitori di gesti per controllare le rotazioni (i gesti della panoramica influiscono su rollio e imbardata, ruotare i gesti sull'intonazione). Allego il mio codice per la gestione del quaternario e la trasformazione della matrice modelview.
Variabili:
GLKQuaternion rotationE;
Manipolazione Quaternion:
- (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 (Inside Draw Loop):
// 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);
Qualsiasi aiuto è molto apprezzato, ma voglio mantenerlo il più semplice possibile e rispettare GLKit.
risposta brillante, ha funzionato perfettamente. Questa è la mia prima avventura in quaternioni, quindi la spiegazione chiara è molto apprezzata - grazie! Ho modificato la mia domanda per chiarire il punto sollevato in (1), sebbene il gesto sia denominato "pan" (convenzione iOS), in realtà controlla la rotazione del mio modello. –