2013-04-15 28 views
2

所以我努力學習的OpenGL 2.0,在Android上我確實發揮了不少與iOS上的OpenGL 1,真的很喜歡它。安卓2.0的OpenGL第一人稱視角

我簡單的問題是有關攝像機和製作3D環境中,你可以四處走動(第一人稱)

我應該使用

Matrix.setLookAtM(mViewMatrix, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ, upX, upY, upZ); 

來控制相機在那裏我在世界(更新onDrawFrame),或設置上的onSurfaceCreated(一次),並使用

Matrix.setIdentityM(mViewMatrix, 0); 
Matrix.translateM(mViewMatrix, 0, mMoveY, 0.0f, mMoveX); 
Matrix.rotateM(mViewMatrix, 0, mDeltaY, 1.0f, 0.0f, 0.0f); 
Matrix.rotateM(mViewMatrix, 0, mDeltaX, 0.0f, 1.0f, 0.0f); 

,而不是感覺就像我在我的周圍旋轉的世界。

我所看到的例子,他們要麼做,OpenGL的1我用GLLookAt

+1

顯然,使用產生正確結果的那個。兩者都可以使用,因爲'setLookAt'只是對翻譯和旋轉的更高抽象。 –

+0

使用最適合您和用例的那個。在OpenGL中,你所做的只是旋轉你周圍的世界,沒有實際的攝像頭(ES 2中更是如此,無論如何你都可以完全控制着色器中的變換)。最後''setLookAt'除了計算*「world」*的旋轉和平移之外沒有什麼別的,就像一堆'translate'和'rotate'調用一樣,它只是一個更好的(或者更高級別)接口用於某些用例。如果你已經有了'mMove'和'mDelta'值,第二種方法似乎更容易。 –

+0

請向我解釋如何看起來像調用一堆翻譯和旋轉方法調用一樣?轉換部分實際上並不是一個很大的工作,但旋轉必須執行sin/cos操作來創建旋轉矩陣,然後乘2個矩陣。另一方面,直接將3個基本向量和翻譯插入到矩陣中。基矢量是:X軸交叉(向前,向上),Y軸向上,Z軸向前=眼睛。它們中的每一個分別由一列表示。儘管如果結果相同,我確實同意,但最好使用最適合您的方法。 –

回答

1

任何兩種方法是好的,因爲你可以得到相同的結果。一般的區別在於你想如何存儲你的對象狀態。對於3D環境,我總是使用3個矢量來確定對象狀態(位置,向前,向上),並使用可以使用與lookAt相同的參數放置對象的lookAt和modelMatrix的修改版本。這種方法的好處在於,您可以直接根據其他物體放置參數,例如:導彈正在跟隨您,並且始終朝向您,無論您身處何方或您如何移動。那麼它的正向矢量就是taregetPosition-missilePosition(通常是標準化的)。在另一方面,如果你要計算你有相當一些工作,直接asinacos角度和一些if語句爲每個2角。接下來例如簡單的在房間裏移動,向前走:如果你使用基本向量,然後position = position+forward*speedFactor而角度,你再次必須計算你面對的是什麼方式,然後做同樣的事情......(有很多情況下,是有用的)

但也有缺點。你需要有你自己的系統來移動和旋轉這些向量。舉例來說,如果你想說輪到你的左邊45度,它會是這個樣子:

forward = (forward+cross(up,forward)*tan(45)).normalized 

,這僅針對角度間隔作品(-90,90)。它在啓動時變得相當一樣,但你也需要修正向上的向量。

所以把它包起來,如果你創建了所有基向量的工作方法(轉,看,模型矩陣...)他們是真正的節省勞力的方法。但這取決於你正在編寫的項目來決定使用什麼。

+0

我想我明白你說的話,用第二種方法,我有我的旋轉程度的開箱即用,但是,我需要在空間中的位置(X,Y,Z)。你有什麼想法我會怎麼做? – Burf2000

+0

你究竟是什麼意思? –

+0

所以,如果你使用rotateM,那麼你知道玩家的旋轉,但是你不知道在空間中的位置,因爲你一起使用了translateM和rotateM。例如,旋轉45度,然後向前移動1步,然後你會如何知道你的x,y,z pos – Burf2000