我想讓我的場景在OpenGL中移動,但是我遇到了麻煩。我查閱了幾篇教程,並瞭解了OpenGL矩陣背後的數學概念。我只是遇到了麻煩。我需要的只是一個例子。如果我能看到一個例子,說明按下按鍵時「相機」如何向一個方向移動,我可以修改代碼以達到我自己的目的。OpenGL和SFML中的3D攝像頭
回答
您可以使用gluLookAt
「移動」您的相機。
gluLookAt(eyex,eyey,eyez, centerx,centery,centerz, upx,upy,upz);
他們的前3個座標是你的虛擬眼睛的座標。接下來的3個是您的眼睛「看上去」的座標。最後3個是指向場景上方的矢量(將其視爲旋轉你的眼睛)。
例如,
gluLookAt(1,1,1, 0,0,0, 0,1,0);
這使得你的眼睛在(1,1,1)和你正在尋找原點。向上矢量的方向是正y軸。
如果您想移動相機,每次從按鍵回撥功能中按下某個鍵時,可以使用更新的參數調用gluLookAt
。
那麼,OpenGL並沒有真正的「相機」。它有一個轉換管道(固定功能或可編程)。另外,OpenGL不會保留一個「場景」,只是一次一個繪製點,線和三角形到幀緩衝區。一旦你圍繞這個事實思考,你基本上不是一個非常不同的東西,比如使用任何其他的繪圖API(goTo(x,y); lineTo(x,y);
或類似的),OpenGL中的很多東西更有意義。
因此,OpenGL中的「相機」僅僅是在頂點轉換管道中的某個點上應用的查看轉換。通常作爲模型視圖矩陣中的最後一次轉換 - 模型轉換之後是視圖轉換,因此是模型視圖。
有很多方法可以指定視圖轉換,並且經常使用的典型幫助函數是gluLookAt
。由於變換以相反的順序應用,所以它們被乘到一個矩陣上(如果使用OpenGL的glMultMatrix或者至少使用了一個內置的矩陣操作函數),在定義模型視圖矩陣時,首先要查看變換。因此,在您的繪圖功能中,代碼通常看起來像
glMatrixMode(GL_MODELVIEW)
glLoadMatrix(view.transformation) # same as glLoadIdentity(); glMultMatrix(view.transformation)
foreach(object o in objects):
glMatrixMode(GL_MODELVIEW)
glPushMatrix()
glMultMatrix(o.transformation)
o.draw()
glMatrixMode(GL_MODELVIEW)
glPopMatrix()
您是否注意到我在每次矩陣操作之前總是確保我處於正確的矩陣模式?這是因爲object :: draw可能會切換到另一個矩陣模式(比如說GL_TEXTURE),而切換矩陣模式的成本只有可以忽略的程度,所以在一系列矩陣操作之前,您應該始終這樣做。
作爲進一步提示:您應始終將您的代碼設置爲視圖和投影矩陣在繪圖代碼的開頭。 請勿將放置在窗口的resize事件處理程序中。
- 1. OpenGL ES中的攝像頭
- 2. WPF 3D攝像頭位置
- 3. Opengl,2D靜止形狀,與移動攝像頭的3D場景
- 4. OpenGL +多個攝像頭
- 5. 轉換攝像頭OpenGL
- 6. 攝像頭控制opengl
- 7. Opengl攝像頭和乘法矩陣
- 8. 在OpenGL中設置攝像頭
- 9. LibGDX 3D攝像頭的實現
- 10. 攝像頭下面的播放器opengl
- 11. 在opengl不工作的攝像頭
- 12. OpenGL的鍵盤攝像頭控制
- 13. Opengl的攝像頭*投影*座標=無
- 14. 3D攝像頭X軸旋轉
- 15. 在XNA上移動3D攝像頭
- 16. 在攝像頭和手機中的攝像頭方向
- 17. glulookat() - 用鍵盤移動攝像頭(OpenGL)
- 18. 翻譯攝像頭矩陣在OpenGL
- 19. OpenCV攝像頭幀OpenGL紋理
- 20. OpenGL應用程序旋轉攝像頭
- 21. 我的3D對象(opengl es)正在消失在iPhone攝像頭視圖後面
- 22. OpenGL和C++的2D平臺遊戲攝像頭
- 23. 立體視覺與Minoru 3d攝像頭處理和OpenCV
- 24. 切換主攝像頭和次攝像頭
- 25. 在後置攝像頭和前置攝像頭之間切換
- 26. 同時打開android前置攝像頭和後置攝像頭
- 27. 切換到前置攝像頭和後置攝像頭Android SurfaceView
- 28. SFML 3D MouseLook
- 29. AndroVM中的攝像頭和GPS位置
- 30. iPhone攝像頭和OpenCV
你現在怎麼設置你的視圖矩陣? – paddy
我正在使用'glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(90.f,8.f/6.f,1.f,100.f);'和'glPushMatrix(); glTranslate(); glPopMatrix();' – tref95
當我谷歌「如何在OpenGL中移動攝像頭」,第一個結果是http://www.opengl.org/archives/resources/faq/technical/viewing.htm - 你讀過那個頁面,仍然沒有得到它? – paddy