2012-04-05 9 views
0

x軸上の回転を1回転させ、次にy軸を前後に回転させる次のコードを書いた。コードは、望ましい結果を生成します。回転のためのOpenGL行列変換

- (void)update 
{ 
if (_x_axis) { 
    if (i >= 6.28) { 
     i = 0; 
     _x_axis = false; 
    } else { 
     float aspect = fabsf(self.view.bounds.size.width/self.view.bounds.size.height); 
     GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 0.1f, 100.0f); 
     self.effect.transform.projectionMatrix = projectionMatrix; 
     GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -3.0f); 
     modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, i, 0.0f, 1.0f, 0.0f); 
     self.effect.transform.modelviewMatrix = modelViewMatrix; 
     i += .01; 
    } 
} else { 
    if (i >= 6.28) { 
     i = 0; 
     _x_axis = true; 
    } else { 
     float aspect = fabsf(self.view.bounds.size.width/self.view.bounds.size.height); 
     GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 0.1f, 100.0f); 
     self.effect.transform.projectionMatrix = projectionMatrix; 
     GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -3.0f); 
     modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, i, 1.0f, 0.0f, 0.0f); 
     self.effect.transform.modelviewMatrix = modelViewMatrix; 
     i += .01; 
    } 
} 

私の質問は、私は、このような0.02または0.2または0.3のように何かに私に増分を変更したときに、なぜキューブがまだ正確に一回転を回転させない、ですか?

iを.2だけインクリメントすると、変換で使用されるiの最後の値は6.2になり、リセットされて回転軸が変更されます。基本的に、キューブレベルを維持するのは何ですか?私は、iを大きくすれば、キューブは軸を切り替える前に完全に回転するとは思わないでしょう。

答えて

1

6.28 = 2*M_PIコードをフルローテーションします。パラメータiは、GLKMatrix4Rotateにまっすぐに与えられます。長さを変えたい場合は、条件内でこの定数を変更するか、をマップしてからGLKMatrix4Rotateを呼び出してください。第二のアプローチについて

、コード変更:

  1. 変更を[0;1]からiの間隔を、ステップ幅が少し小さくします。
  2. GLKMatrix4Rotatei*2*M_PIと呼びます。

アニメーションは一般的に以前のように動作しますが、easing functionsでこれをねじれます。

+0

です。ですから、基本的に、回転軸を変更したときと同じ状態のままでモデルをリセットするのはなぜですか? –

+0

'update'呼び出しのたびにモデル行列をリセットするためです。回転軸が変更されると、モデルを最初の位置にもう一度描画できます。ところで、 '_rotation'の意味は何ですか?未使用と思われる。 –

+0

'_rotation'は実際には' i'とします。私は希望の結果を得るために以前の状態にモデルをリセットします。これを行うためのアドバイスはありますか?ベストプラクティスはありますか?私は更新の終わりにマトリックスを保存し、更新の開始を設定する必要がありますか? –