2011-01-06 117 views
2

我已經爲android編寫了第一人稱相機類。第一人稱3D相機旋轉

類非常簡單,相機對象具有其三個軸 X,Y和Z

和有功能來創建模型視圖矩陣(即calculateModelViewMatrix()), 旋轉沿其X相機和Y軸 並沿Z軸轉換攝像機。

我認爲我的ModelViewMatrix算法是正確的,我也可以沿着Z軸平移相機。

沿x軸旋轉似乎工作,但沿着Y軸它給出了奇怪的結果。 另外旋轉的另一個問題似乎是,而不是相機被旋轉,我的3D模型開始旋轉,而不是沿着它的軸。

我已經寫了另一個實現基於看點,並使用openGL ES的GLU.gluLookAt()函數來獲得ModelView矩陣,但也似乎遭受完全相同的問題。

編輯

首先感謝您的回覆。

我實際上已經做了Camera類的第二次實現,這次使用android.opengl.Matrix類中提供的旋轉函數。 我已經提供了下面的代碼,這非常簡單。

令我驚訝的是,結果是「完全一樣」。 這意味着我的旋轉函數和Android的旋轉函數產生了相同的結果。

我做了一個簡單的測試並查看了我的數據。 我只是圍繞Y軸旋轉LookAt點1-dgree並查看座標。看起來,我的LookAt點落後於確切的旋轉角度,例如在20度時,它只有10到12度。 並在45度後開始倒車

回答

2

有一個類android.opengl.Matrix是靜態方法的集合,它可以在你傳遞的float [16]上做所有你需要的東西。我強烈建議你使用這些功能,而不是滾動你自己的。你可能想要setLookAtM和從相機角度計算出的lookat點(使用sin,cos,就像你在代碼中做的那樣 - 我假設你知道如何做到這一點)。

- 編輯以響應新的回答 -

(你應該已經編輯你原來的問題,順便說一句 - 你的答案是另外一個問題困惑我要位)

好了,所以這裏的做這件事的一種方式。這是未編譯和未經測試的。我決定手動構建矩陣,也許這會給出更多關於發生了什麼的信息...

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); 
    } 
}