2012-05-05 51 views
0

最近我開始使用JOGL,我知道如何在畫布上創建和繪製對象,但我找不到關於如何設置和旋轉攝像頭的教程或解釋。 我只找到源代碼,但由於我對此很新,所以沒有太多幫助。Java OpenGL Camera

有誰知道一個好的教程或地方開始?我google搜索,但無法找到任何東西(只適用於JOGL 1.5,我使用2.0)。

+0

,這可能是有幫助的http://www.land-of-kain.de/docs/jogl/ –

+0

謝謝,我看到這個網站,但我認爲它使用JOGL 1.5,因爲大多數的方法是在不同的API我.. –

+0

可能重複:檢查JOGL的pmvMatrix http://stackoverflow.com/a/13485670/398672的東西,有人問6個月後... – olamedia

回答

1

UPDATE

由於datenwolf指出我的解釋是聯繫在一起的OpenGL的2管道,該管道已被取代。這意味着如果你想避開已棄用的方法,你必須從世界空間進入屏幕空間。可悲的是,這個小小的腳註並沒有被附加到OpenGL示例代碼或宇宙中的每一個最後一點的評論。

當然,我不知道爲什麼使用現有的GL2管道必然是一件壞事,然後再選擇一個庫來完成相同的工作或自己構建一個庫。

ORIGINAL


我玩弄JOGL自己,雖然我與OpenGL的一些有限的經驗。 OpenGL使用兩個矩陣將所有通過它的3D點從3D模型空間轉換爲2D屏幕空間,Projection矩陣和ModelView矩陣。

投影矩陣設計用於補償3D世界和2D屏幕之間的平移,投影到較低維的空間上。您可以通過Google搜索gluPerspective獲取更多詳細信息,這是用於設置該矩陣的glut工具包中的一個函數。

另一方面,MatrixView負責將3D座標項從場景空間轉換到視圖(或相機)空間。這是如何完成取決於你如何代表相機。表示照相機的三種常用的方法是

  • 一種用於位置矢量,對於照相機的目標矢量,和用於「向上」方向
  • 一種用於位置矢量加上一四元數的矢量取向(加上規模也許單浮點值,或保留比例設定爲1)
  • 含有位置,方向和比例的單一的4×4矩陣

哪一個使用將要求您編寫代碼來將表示轉換成你可以給的東西到OpenGL方法來設置ModelView矩陣,以及編寫代碼,而不是將用戶操作轉換爲對Camera數據的修改。

有許多JOGL中,演示和JOCL-演示涉及這類操作的演示。例如,this class被設計用作一種原始相機,它可以放大和縮小並圍繞場景的原點旋轉,但不能以其他方式旋轉。因此它僅表示爲3個浮標:X和Y旋轉以及Z距離。它適用其轉化爲模型視圖像這樣:

gl.glMatrixMode(GL2.GL_MODELVIEW); 
gl.glLoadIdentity(); 
gl.glTranslatef(0, 0, z); 
gl.glRotatef(rotx, 1f, 0f, 0f); 
gl.glRotatef(roty, 0f, 1.0f, 0f); 

我目前正在嘗試用四元數+矢量+浮動使用Java Vecmath庫基於攝像頭,和我申請我的相機變換是這樣的:

Quat4d orientation; 
Vector3d position; 
double scale; 
... 
public void applyMatrix(GL2 gl) { 
    Matrix4d matrix = new Matrix4d(orientation, position, scale); 
    double[] glmatrix = new double[] { 
    matrix.m00, matrix.m10, matrix.m20, matrix.m30, 
    matrix.m01, matrix.m11, matrix.m21, matrix.m31, 
    matrix.m02, matrix.m12, matrix.m22, matrix.m32, 
    matrix.m03, matrix.m13, matrix.m23, matrix.m33, 
    }; 
    gl.glMatrixMode(GL2.GL_MODELVIEW); 
    gl.glLoadMatrixd(glmatrix, 0); 
} 

1:這就是所謂的模型視圖,而不僅僅是查看矩陣的原因是因爲你其實可以推及模型視圖棧上彈出矩陣(這是所有的OpenGL變換矩陣我相信如此)。通常情況下,您可以擁有一疊完整的矩陣,這些矩陣表示場景圖中各項目相對於彼此的各種變換,最下面的矩陣表示相機變換,或者您有一個相機變換並將場景圖中的所有內容保存在世界空間座標中(這種類型擊敗了場景,但無論如何)。

2:在實踐中,您不會在代碼中看到gl.glMatrixMode(GL2.GL_MODELVIEW);的調用,因爲除非您主動設置投影矩陣,否則GL狀態機將始終保持MODELVIEW模式。

+0

OpenGL矩陣堆棧已從現代版本的OpenGL中剝離。**您不應該在新編寫的代碼中使用OpenGL內置矩陣堆棧**許多人認爲OpenGL矩陣操作是GPU加速的。 *他們從來沒有!*也是你的建議,GL狀態機在MODELVIEW模式下是錯誤的,實際上導致了很多新手混淆。在任何更高級的程序中,您需要多次更改投影(例如HUD,分屏,多個查看窗格,或者如果要將陰影渲染到陰影緩衝區中,都需要這樣做)。 – datenwolf

+0

如果您想要支持2004年以前的GPU,那麼堅持使用OpenGL固定功能管線(即內置矩陣堆棧)的唯一原因就是這些。這些日子很難實現。 – datenwolf

0

,但我無法找到如何設置教程或解釋和旋轉的攝像頭

因爲是沒有的。 OpenGL不是一個場景圖。它主要是複雜的畫布和簡單的點,線和三角形繪圖工具。放置「物體」實際上意味着應用線性變換來在2D幀緩衝器上放置3維矢量。

所以不是放置「相機」,而是以相反的方式移動整個世界(轉換),以相反的方式移動相機,產生相同的結果。

+0

謝謝您的回答 –

+0

OpenGL不是一個場景圖形,但是指出人們想出如何代表相機(Vector + Quaternion vs Matrix)以及如何翻譯代表調用OpenGL來產生所需的效果(GL_MODELVIEW + glLoadMatrix)將比您相當難以理解的響應更有用。此外,假設矩陣轉換管道是BUILT IN到GL,將其稱爲具有繪圖基元的畫布有點虛僞。 – Jherico

+0

@Jherico:由於OpenGL的OpenGL-3核心矩陣操作已被剝離。事實上,自Ope​​nGL-2以來,移除矩陣堆棧的計劃已經出現。你的答案也表示不好的做法。 – datenwolf