1. 程式人生 > >OpenGL繪製教室,帶你親手程式設計淺識高大上的VR技術

OpenGL繪製教室,帶你親手程式設計淺識高大上的VR技術

  之前上過一門選修課叫虛擬現實與資料視覺化,也就是最近大火的VR。很多人覺得VR聽起來很高大上,其實本質上就是用一些計算機圖形學的方法去在計算機中表達重現出真實的三維場景,並加入漫遊,配合VR眼睛和頭盔就能讓人體驗漫遊在一個虛擬的三維空間中的功能,這個應用最廣泛的就屬各種遊戲了。因為有unity3d以及unreal等各種強大的遊戲引擎的出現,讓遊戲中場景重現顯得更加逼真和絢麗。當然萬丈高樓平地起,想要進入VR的大門,最接地氣的工具之一就是OpenGL了。

本文詳細講解了使用OpenGL函式庫,藉助於VS平臺,在計算機中實現虛擬三維場景——一間大學教室的繪製。只要讀者具備基本c++或c語言知識,即可看懂。並在文章結尾處附上原始碼,大家一起學習一起進步~

OpenGL是什麼?具體定義請戳連結OpenGL_百度百科 。這裡有它官網上的一個截圖


下面一行小字兒,從遊戲到虛擬現實,手機到超級計算機。這句簡介強有力的表明了openGL在諸多領域都有著很深的運用。題主自己簡單的理解就是為了在計算機中實現三維影象繪製,渲染,燈光材質紋理貼圖等等功能的一個函式工具包。裡面有各種實現好的函式,對於學者,只要理解它們會用就ok了。當然如果你有興趣也可以去看,或者自己嘗試實現那些底層程式碼,官網上都有資料。OpenGL - The Industry Standard for HighPerformance Graphics

下面我就把自己利用OpenGL在c++平臺上繪製一個三維虛擬教室的過程分享一下,畫的比較粗糙,是當時的一份課程作業。不過基本方法都差不多,有興趣的同學可以做出更多的優化。先上圖~

【投影儀升起】


【投影儀放下】

【朝左】

【朝右】


下面我們開始~

【1】首先第一步是在C++平臺上配置OpenGL:下載請戳有VS2010,2013的童鞋請戳這裡:OpenGL學習入門之VS2010環境配置 [轉];使用VC++6.0的童鞋請戳這裡VC6.0 OpenGL庫配置詳解

【2】我們知道,教室在三維空間中其實可以簡化為一個長方體,具體能看到這個長方體的哪一面,取決於我們眼睛的位置,和我們眼睛所看的位置,如果我們站在教室的正中央,那我們平視前方就應該看到與我們眼睛等高的教室前牆上的點。關於這一點,OpenGL為我們提供了一個函式叫做gluLookAt(x1,y1,z1,x2,y2,z2,0,1,0),這個函式有九個引數,前面三個是眼睛的空間座標,中間三個是你所看的點的空間座標,最後一個是眼睛的朝向,因為你有可能歪著頭看~好了,下面開始正式繪製,教室的六個面均可使用GL_QUADS來實現,只要定下教室的大小以及在空間座標系中的位置,即可定下八個頂點座標。廢話不多說,先上程式碼:



這裡註釋基本上寫的很清楚,openGL的函式基本上都可以根據函式的名字來判斷其功能。這裡我們繪製教室,基本上可以簡單的都用長方形解決。另外還有畫直線glBegin(GL_LINES)等,大家可以自行在教程中找。後面會推薦題主認為好的教程。按照這個方案,我們可以畫好出一個長80,高30,寬60的教室模型。

下面要做的就是在這個教室中新增桌子板凳,投影儀,窗戶,黑板,講臺等。我們一步步來:

【窗戶】窗戶可以和左右牆一起繪製:


我們關鍵是要自己先畫個草圖,具體窗戶分配在牆面上哪個位置,我們可以先在紙上寫出座標,別的物件也是一樣。主要是其在你剛剛繪製出的那個長方體中的位置的確定。

【空調】


下面再詳細講下投影儀的實現。投影儀我們知道上課會開啟,下課會關閉。所以我這裡用按鍵是否按下來開啟或者關閉投影儀。


更多程式碼看原始碼吧~這裡就不再貼了,註釋都在裡面寫了。

最後,場景畫好了,如何實現漫遊功能呢。我們可以想一下,漫遊實際上就是你在一個場景中,你既可以前後左右平移,你的視角也可以隨處的變化,你可以通過兩者結合看到這個場景裡任何一個角落。那麼這裡就要用到前面講的那個函式gluLookAt(x1,y1,z1,x2,y2,z2,0,1,0)

x1,y1,z1,以及x2,y2,z2可以通過w,s,a,d鍵是否按下而增減,從而導致“眼睛”在這個虛擬教室的位置發生平移,角度可以通過pgup和pgdn鍵增減,代表看的角度,仰頭或者低頭。具體程式碼可以用case和break語句實現,執行效率較高。可以看一點:


至此為止,基本上重點都講完了。細節大家可以自行去看,這裡推薦幾個比較好的OenGL教程。

【1】OpenGL入門教程(精)_圖文(沒有下載劵的童鞋可以私信我哦,最近學校買了百度文庫的賬號啥都可以下載啦~)

最後是寶寶的原始碼哦:openGL繪製虛擬教室,這個是我上傳到csdn上要積分的。看關注人數再考慮要不要上傳一份不要積分的吧~~~