Poszukuję prostej implementacji rotacji arcball w modelach 3D z kwaternionami, specjalnie przy użyciu GLKit na iOS. Do tej pory, ja zbadałem następujących źródeł:Rotacja Arcballa z Quaternions (przy użyciu iKlKit iOS)
Ja również stara się zrozumieć kod źródłowy i matematyki z here i here. Mogę obracać mój obiekt, ale wciąż skacze pod pewnymi kątami, więc obawiam się, że blokada kardana jest w grze. Używam rozpoznawania gestów do sterowania obrotami (gesty patrzenia wpływają na przechylenie i odchylenie, gesty obracania wpływają na wysokość tonu). Załączam mój kod do obsługi kwaternionów, a także do transformacji macierzy widoku modelu.
Zmienne:
GLKQuaternion rotationE;
Kwaterniony obchodzenia się:
- (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 macierzy transformacji (Wewnątrz Draw pętla)
// 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);
Każda pomoc jest bardzo doceniana, ale chcę ją maksymalnie ograniczyć i trzymać się GLKit.
Brilliant odpowiedź, to działało idealnie. To moje pierwsze przedsięwzięcie na kwaterach, więc jasne wyjaśnienie jest bardzo doceniane - dziękuję! Zmieniłem moje pytanie, aby wyjaśnić swój punkt poruszony w (1), chociaż gest ten nosi nazwę "pan" (konwencja iOS), faktycznie kontroluje rotację mojego modelu. –