2011-01-06 12 views
2

私はアンドロイド用のファーストパーソンカメラクラスを作成しました。ファーストパーソン3Dでのカメラの回転

クラスは、カメラオブジェクトは、その三の軸 Xを有し、実際に簡単であり、Y及びZ

とModelView行列(すなわちcalculateModelViewMatrix())を作成する機能があり、 はXに沿ってカメラを回転させますY軸 を選択し、カメラをZ軸に沿って移動します。

私は私のModelViewMatrixのcalulationが正しいと私はまた、Z軸に沿ってカメラを翻訳することができたと思います。

x軸に沿った回転はうまくいくようですが、Y軸に沿って奇妙な結果が得られます。 また、回転に関する別の問題は、カメラを回転させる代わりに、3Dモデルがその軸に沿って回転を開始するように思われることです。

視点に基づいて別の実装を記述し、OpenGL ESのGLU.gluLookAt()関数を使用してModelView行列を取得しましたが、まったく同じ問題を抱えているようです。

EDITお返事のためのすべての感謝の

まず。

あなたが言ったように私は実際にandroid.opengl.Matrixクラスに設けられた回転機能を使用してCameraクラスの第2の実施、この時間を作ってきました。 以下のコードを提供しましたが、これはずっと簡単です。

私の驚いたことに、結果は「まったく同じ」です。 これは、私の回転機能とAndroidの回転機能が同じ結果を生み出していることを意味します。

私は簡単なテストを行い、自分のデータを見ました。 LookAtポイントをY軸を中心に一度に1度回転させ、座標を見ました。私のLookAtポイントが正確な回転角度よりも遅れているようです。 20度では10度から12度にしか変化しません。 そして45度後に逆転が始まります。

答えて

2

浮動小数点[16]に必要なすべてを行う静的メソッドのコレクションであるクラスandroid.opengl.Matrixがあります。使用することを強くお勧めします。それらの機能を自分のものを使うのではなく、おそらく、あなたのコードで行っているように、カメラの角度から計算されたルック・ポイントを使ってsetLookAtMが必要になるでしょう。(あなたがコードで行っているように、sinを使用します。答えは -

(おそらく方法によって、あなたの元の質問を編集している必要があります - あなたの答えを別の質問は少しのために私を混同して)

を[OK]を、ので、ここでそれを行うための一つの方法です。これはコンパイルされておらず、テストされていません。代わりに手動で行列を作成することにしました。おそらくそれは何が起こっているのかについてもう少し情報を与えるでしょう...

class TomCamera { 
    // These are our inputs - eye position, and the orientation of the camera. 
    public float mEyeX, mEyeY, mEyeZ; // position 
    public float mYaw, mPitch, mRoll; // euler angles. 

    // this is the outputted matrix to pass to OpenGL. 
    public float mCameraMatrix[] = new float [16]; 

    // convert inputs to outputs. 
    public void createMatrix() { 
     // create a camera matrix (YXZ order is pretty standard) 
     // you may want to negate some of these constant 1s to match expectations. 
     Matrix.setRotateM(mCameraMatrix, 0, mYaw, 0, 1, 0); 
     Matrix.rotateM(mCameraMatrix, 0, mPitch, 1, 0, 0); 
     Matrix.rotateM(mCameraMatrix, 0, mRoll, 0, 0, 1); 
     Matrix.translateM(mCameraMatrix, 0, -mEyeX, -mEyeY, -mEyeZ); 
    } 
}