クォータニオンの3Dモデルでアークボールローテーションの簡単な実装を探しています()。具体的には、iOSのGLKitを使用しています。これまでのところ、私は、次のソースを検討している:私もhereとhereからソースコードと数学を理解しようとしてきたクォータニオンによるアークボールの回転(iOS GLKitを使用)
。オブジェクトを回転させることはできますが、特定の角度でジャンプし続けるので、ジンバルロックが作動していることを恐れています。私はジェスチャー認識機能を使って回転をコントロールしています(パンジェスチャーはロールとヨーに、回転ジェスチャーはピッチに影響を与えます)。私は四元数処理とモデルビュー行列変換のための私のコードを添付しています。
変数:
GLKQuaternion rotationE;
クォータニオン処理:
- (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));
}
モデルビュー行列変換(インサイドはループを描く):
// 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);
どんな助力も大歓迎ですが、できるだけシンプルにしてGLKitに固執したいと思います。
ブリリアント答え、それは完全に働きました。これはクォータニオンへの私の最初のベンチャーなので、明確な説明が大変ありがとう - ありがとう!ジェスチャーは「パン」(iOSコンベンション)と名付けられていますが、実際にはモデルの回転を制御していますが、(1)で挙げた点を明確にするために質問を編集しました。 –