專案簡介:使用 C++實作 OpenGL GLUT 實作一個簡單的太陽系行星系統,將涉及一些三維圖形技術的數學基礎、OpenGL 里的三維坐標系、OpenGL 里的光照模型、GLUT 的鍵盤事件處理,
OpenGL 包含了很多渲染函式,但是他們的設計目的是獨立于任何視窗系統或作業系統的,因此,它自身并沒有包含創建打開視窗或者從鍵盤或滑鼠讀取時間的函式,甚至連最基本的顯示視窗的功能都沒有,所以單純只使用 OpenGL 是完全不可能創建一個完整的圖形程式的,并且絕大多數程式都需要與用戶進行互動(回應鍵盤滑鼠等操作),GLUT 則提供了這一便利,

GLUT 其實是 OpenGL Utility Toolkit 的縮寫,它是一個處理 OpenGL 程式的工具庫,主要負責處理與底層作業系統的呼叫及 I/O操作,使用 GLUT 可以屏蔽掉底層作業系統 GUI 實作上的一些細節,僅使用 GLUT 的 API 即可跨平臺的創建應用程式視窗、處理滑鼠鍵盤事件等等,
整個天體系統中,他們都是一顆星球(Star),區別行星和恒星只需要通過它們是否具有父節點即可;其次,對于不同的星球而言,它們通常具有自身的材質,并且不同的材質會表現出自身是否發光,由此我們有了初步的物件模型,故我們將星球分為:普通能夠自轉并繞某個點公轉的星球(Star), 具有特殊材質的星球(Planet), 能夠發光的星球(LightPlanet),

一、編程模型假設:
星球的運行軌道為圓形;
自轉速度保持相同;
每次重繪繪制的時候假設時間經過了一天,
二、整體思路:
初始化星球物件;
初始化 OpenGL 引擎, 實作 onDraw 和 onUpdate;
星球應該自己負責處理自己的屬性、繞行關系、變換相關繪制,因此在設計星球的類時應該提供一個繪制 draw() 方法;
星球也應該自己處理自己自轉公轉等更新顯示的繪制,因此在設計星球類時候也應該提供一個更新方法 update();
在 onDraw() 中應調 用星球的 draw() 方法;
如果你在學習C/C++的程序中遇到了問題,可以來加入小編的企鵝圈問小編哦~小編很熱情的(●’?’●),還有更多資料免費領取哦
每晚有直播課程,滿滿的干貨等你來!

在 onUpdate() 中呼叫星球的 update() 方法;
在 onKeyboard() 鍵盤調整整個太陽系的顯示.
三、 每個星球而言,都具有如下的屬性:
顏色 color
公轉半徑 radius
自轉速度 selfSpeed
公轉速度 speed
距離太陽中心的距離 distance
繞行的星球 parentStar
當前的自轉的角度 alphaSelf
當前的公轉角度 alpha
因此有如下的類:

在太陽系中,太陽系顯然是由各個行星組成的;并且,對于太陽系而言,太陽系中行星運動后的視圖重繪應該由太陽系來完成,據此太陽系成員變數應為包含行星的變數,成員函式應作為處理太陽系內的視圖重繪及鍵盤回應等事件,所以,我們可以設計 SolarSystem 類:

程式的基本框架:main.cpp

運行的效果如下圖所示:

提示
單緩沖,是將所有的繪圖指令在視窗上執行,就是直接在視窗上繪圖,這樣的繪圖效率是比較慢的,如果使用單緩沖,而電腦處理性能不夠,螢屏會出現閃爍狀,
雙緩沖,會將繪圖指令是在一個緩沖區完成,這里的繪圖非常的快,在繪圖指令完成之后,再通過交換指令把完成的圖形立即顯示在螢屏上,進而避免出現繪圖的不完整,效率很高,
雙緩沖則主要分為前臺緩沖和后臺緩沖,前臺緩沖即我們說看到的螢屏,后臺緩沖則維護記憶體中,對用戶不可見,使用雙緩沖時所有繪圖操作都會在后臺進行,當完成繪制后,才會將結果復制到螢屏上,
這么做的好處是,如果我們讓繪制操作實時與顯卡進行操作,當繪制任務復雜時,IO 操作同樣會變得復雜,造成性能較低;而雙緩沖只會在交換緩沖區時將繪制完成后的結果直接發送給顯卡進行渲染,IO 顯著降低,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/202425.html
標籤:其他
上一篇:pycharm進行代碼更新比較
