Cocos 3D功能初探學習筆記(1)---攝像機

個人原創,歡迎轉載,轉載請註明地址,專欄地址http://blog.csdn.net/bill_man

前言

隨着手機硬件水平的提高,遊戲行業競爭的激烈,玩家對於遊戲畫面的要求已經不再滿足於2D畫面;之前的3D遊戲開發普遍採用unity3D引擎開發製作,從去年開始,cocos引擎逐步加入了3D功能的支持,熟悉cocos2D-X開發的小夥伴們可以更輕鬆的轉換爲3D開發程序員,關於cocos和unity的優劣,也是程序員們經常愛探討的話題,筆者一直有這麼一個觀點,主流技術沒有好壞之分,只有合適不合適,筆者總結了一下兩者的優勢和劣勢,大家可以自行選擇:

unity:優勢:有充分的項目上的積累;完善的工具鏈;開發速度快,由於開發語言相對簡單,學習速度也相對比較快

      劣勢:不開源,不利於程序員深入學習openGL和底層代碼,不利於基於引擎二次開發(由於積累較多,二次開發也許不那麼必要)

cocos:優勢:開源,利於學習和二次開發;api熟悉,有利於cocos2D-X程序員向3D程序

      劣勢:需要時間積累;工具鏈,在3D中其實比2D更需要成熟的工具鏈

由於筆者學習3D其實抱着學習底層代碼的目的,暫時沒有實際開發的需要,所以選擇同時學習,並更傾向於cocos的學習,由於零零散散的學習3D和openGL也有了一段時間,筆者對於3D遊戲的學習有幾點認識,尤其是對於2D工程師轉向3D,需要學習如下內容:

1)3D思想,這是比較重要的,也是個人認爲比較難的,包括對於攝像機光照等這些概念的理解等等,另外就是把自己的思維擴展到三維空間。

2)新api的學習,這點其實cocos2D-X程序員轉到3D其實是比較方便的,總體的程序構建思想並沒有變化

3)新語言,shader的學習在3D中比較重要;另外材質文件的製作也是一個新的內容的學習。

本系列教程將重點講解cocos引擎的3D功能及3D思想,作爲筆者學習cocos引擎3D功能的學習筆記,如果有錯誤歡迎指出,另外從cocos2D-X學習openGL系列將會繼續更新,用於學習底層代碼和openGL原理等等,之前由於項目上線比較緊張影響了更新速度,另外筆者9月份將重新回到學校讀在職研究生,技術博客的更新可能也會受到影響,不過筆者還是會盡量保證這個系列文章的更新速度。

正文

本篇首先介紹攝像機,其實2D時cocos引擎就有攝像機這個概念,每個節點都擁有一個攝像機類,當時的攝像機類的使用實例就是實現節點對象的縮放旋轉,因爲節點本身就自帶這些功能,所以攝像機使用的場合並不多,筆者只在有一次爲了實現一個正面視角向前進效果的時候爲了讓場景有一個“假”3D的效果的時候使用了setEyeXYZ之類的接口,但在3D中,攝像機是個很重要的概念,因爲如果直接在設備上顯示標準幾何模型的座標,可能屏幕上什麼都看不到,因爲模型座標的範圍可能不與設備座標範圍相對應,顯示器本身是個平面固定的二維矩形區域,顯示一個三維模型需要做相應的投影和變化。

需要說明的是在cocos2D-X 2.0時代,攝像機類繼承自,而現在攝像機類是Node節點類的子類,可以作爲子節點加到任何一個節點上

openGL中支持兩種類型的攝像機,分別是透視攝像機(有近大遠小的透視效果)和正交攝像機(一般用於建築設計圖等等)。

                       

透視攝像機類似於我們日常用相機照相的效果,有一個視錐體的概念,它有兩個平面,一個近平面一個遠平面,這兩個平面與視錐體的四個面相交,這六個面構成了一個平截椎體,在這個椎體範圍內的物體會被繪製,如果某個圖元落在組成的椎體的四個平面,那麼它將不會被繪製,如果有一個物體穿過這裏的某個平面,那麼openGL將會對這個物體進行剪切(clip),會繪製這個物體和平面的交集,經過計算後會生成新的幾何體。

創建一個透視攝像機需要調用如下函數

 Camera* cameraExample = Camera::createPerspective(30, (GLfloat)s.width/s.height, 10, 200);

第一個參數是透視相機的可視角度 (角度制,一般是在40-60度之間),它的大小決定了視角的橫向寬度

第二個參數是相機的長寬比(通常會使用視窗的寬度除以視窗的高度),一般是屏幕的寬高比

第三個參數和第四個參數分別是視錐頂點到近截面和遠截面的距離

創建好了之後,你還可以通過getNearPlane和getFarPlane獲得視錐頂點到近截面和遠截面的距離

和投影攝像機相比,正交攝像機就簡單許多,它的主要作用是在投影之後依然保持物體的真實大小以及互相之間的角度。

                                                                    

創建一個正交攝像機需要調用如下函數

Camera* cameraExample = Camera::createOrthographic(100, 100, 10, 200);

第一個參數是x軸的正交投影的縮放因子(正交投影的寬度)。

第二個參數是沿y軸的正交投影的縮放因子(正交投影的高度)。

第三個參數和第四個參數分別是視錐頂點到近截面和遠截面的距離。

創建完攝像機以後,就可以設置攝像機的位置了,代碼如下

cameraExample->setPosition3D(Vec3(-100, 100, -50));

cameraExample->lookAt(Vec3(-100, 0, -50),Vec3(0,1,0));

首先是設置攝像機的位置,然後通過調用lookAt函數設置觀察目標位置和攝像機向上位置,其中攝像機位置和觀察目標位置兩個點共同確定了觀察方向向量,和這條線垂直的平面就確定了觀察平面;攝像機向上方向一般被設置爲y軸的方向,不傳參數默認爲Vec3::UNIT_Y(Y軸方向)

接下來就是設置攝像機標識:

cameraExample->setCameraFlag(CameraFlag::USER1);

這個標識用於指導定物體使用不同的攝像機進行觀察,CameraFlag一共包含一個默認攝像機和八個用戶定義攝像機,默認攝像機是由場景創建的,節點的默認攝像機標識和默認攝像機的標識相同,所以節點的默認攝像機即是場景自動創建的默認相機,節點將自身的標識和攝像機的標識做一個與操作,如果結果大於零,那麼這個攝像機就負責顯示這個節點;

默認攝像機用於繪製ui,它是最後被繪製的;一般來說需要一個另外的攝像機來繪製3d物體而不是默認攝像機,當深度測試未開啓時,可以調整攝像機的繪製順序;所有攝像機的繪製順序都是先繪製2d物體和不透明3d物體,然後繪製透明3d物體。

通過調用setDepth可以設置攝像機的繪製順序,越大的深度越繪製的靠上,所以默認攝像機默認是0,其他攝像機默認是1。

一個物體單位需要經過模型變換,視圖變換和投影變換才能轉換成opengl需要的信息,攝像機類可以通過調用一些函數分別獲得這三個階段的矩陣。

本篇以概念爲主,3D精靈的介紹完成後會拿出一篇講解實例。

 

能力不足,水平有限,如有錯誤,歡迎指出。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章