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

來源:互聯網
上載者:User

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

個人原創,歡迎轉載,轉載請註明地址,專欄地址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中,攝像機是個很重要的概念,因為如果直接在裝置上顯示標準幾何模型的座標,可能螢幕上什麼都看不到,因為模型座標的範圍可能不與裝置座標範圍相對應,顯示器本身是個平面固定的二維矩形地區,顯示一個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精靈的介紹完成後會拿出一篇講解執行個體。

 

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


著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.