本教程是講Cocos2d-x中相機的使用,在Cocos2d-x 3.2版本中加入了相機這個類,這個類在3D游戲中是必不可少的,因為3D游戲是一個立體的世界,在3D游戲中的攝像機就相當于是我們的睛,通過它我們可以觀察整個的游戲世界。相機相當于人的睛,人在用睛看物體的時
本教程是講Cocos2d-x中相機的使用,在Cocos2d-x 3.2版本中加入了相機這個類,這個類在3D游戲中是必不可少的,因為3D游戲是一個立體的世界,在3D游戲中的攝像機就相當于是我們的眼睛,通過它我們可以觀察整個的游戲世界。相機相當于人的眼睛,人在用眼睛看物體的時候,可以從理論上的任意位置,以任意的角度觀察物體,所以物體的形狀會受到相機的位置、旋轉角度的影響而影響。
上圖就是在3D游戲中使用相機的原理,當然這是一個透視投影的相機,我們在游戲中的相機就是根據圖中的原理實現的。在游戲中一般有兩種類型的相機:一種就是上圖中介紹的透視相機,它在3D游戲中是很常見的。還有一種是正交投影相機,它沒有像透視投影一樣的近大遠小的效果而是在相機內任何位置的物體的大小都是一樣的,通常這種類型的相機都用在角色屬性面板中顯示的角色模型。說完了相機的兩種類型,下面我們來看看在Cocos2d-x中我們是如何來創建相機的:
上面的代碼就是創建了一個透視投影的相機,下面我來說明下參數的意義:第一個參數是FOV,即視場角(field of view),它可以理解為你的視線左右能看多寬(以角度計)第二個就是上述所有的寬高比,最后兩個是相機的近裁面和遠裁面,這個也很好理解,距離相機比近裁面還要近的,比遠裁面還要遠的,都不會被渲染到。
上圖是正交相機的原理。
上面的代碼就是創建了一個正交投影的相機,下面我來說明下參數的意義:第一個參數是相機的寬度,第二個就是相機的高度,最后兩個是相機的近裁面和遠裁面,這個也很好理解,距離相機比近裁面還要近的,比遠裁面還要遠的,都不會被渲染到。這個和透視相機是一樣的。接下來,我們需要對相機設置一個標記位(FLAG),這樣可以讓相機與其他的相機區分開來--在一些游戲的應用中,通常不僅僅只有一個相機,如果有多個相機的話,那么我們要標記一個物體,到底是要被哪一個相機所"看到",這時候,我們就需要設置它的CameraMask來與相機的Flag對應:
如果同時存在多個相機,怎么標記某個物體被那些相機看到呢?
注意到Camera中有個_cameraFlag屬性,為枚舉類型,定義如下
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Node中有個_cameraMask的屬性,當相機的_cameraFlag & _cameraMask為true時,該Node可以被該相機看到。所以在上述相機的創建代碼中,camera的CameraFlag設置為CameraFlag::USER1,并且該layer的CameraMask為2,則表示該layer只能被CameraFlag::USER1相機看到。如果你設置的精靈的cameraMask是3的話,它也是能被cameraFlag為CameraFlag::USER1和CameraFlag::USER2的相機看到的。我們還要注意如果你的精靈是在layer設置cameraMask之后添加的,它是不會被看到的,還需要手動再設置精靈的cameraMask。不要以為這樣就可以了,最后我們還要把相機添加到場景中,不然我們還是看不到效果的,一定要記住呀,下圖就是把相機加到場景中的代碼:
這樣一來我們就算是創建好相機啦,這只還是第一部喲,下面我來說下相機在游戲中是如何使用的。
一般來說在3D游戲中相機有三種使用方式:
第一種就是自由相機
第二種是第一人稱相機
第三種是第三人稱相機
下面我們先來說第一種自由相機,這種類型的相機一般都多用在即時戰略類型的游戲中,比如魔獸爭霸3用的就是自由相機,這類相機可以隨著鼠標的移動而移動,能夠看到游戲場景中的任何位置,下圖就是自由相機在Cocos2d-x中的使用方法:
怎么樣是不是很簡單,我們其實只要在移動函數中把在屏幕移動的距離賦值給相機,讓相機跟隨移動就可以了,需要注意的是我們在屏幕上上下移動相對于相機是前后移動,所以我們要把在屏幕移動的y值賦給相機的z,而且方向是反的因為我們向下滑屏幕相機是向前移動下上滑相機是向后移動。那么大家會問,我們既然是3D相機那么y軸怎么移動吶?下圖就是相機拉近和拉遠的實現:
第一張圖是拉近,第二張圖是拉遠。這樣我們也可以用Cocos2d-x來制作魔獸爭霸3這樣的游戲啦。
接下來我們來看第二種類型的相機,那就是第一人稱的相機,這種相機其實很好理解,它就相當于是我們的眼睛看到的東西,這種相機多用在FPS類型的游戲中,像是使命的召喚就是這類相機,那么它能不能在Cocos2d-x中實現吶?答案是肯定的,我們來看下圖:
其實就是把相機的位置綁在你在游戲中控制的角色上就可以啦,我們使用sprite3d的移動來代替在屏幕上滑動,也就是說我們在屏幕上滑動不是控制相機而是控制sprite3d,再把sprite3d的移動賦給相機,大家可能會問FPS游戲還可以旋轉視角呀?咱們的相機可以實現,下面讓我們來看代碼:
這個是向左旋轉。
這個是向右旋轉。
通過這樣的設置我們就能實現FPS游戲的效果了。
最后再來介紹下第三人稱的相機,這類的相機多應用在MMORPG類型游戲中,這種類型的游戲是我們最最常見的游戲類型,現在大多數的網游都是這樣的相機,它其實就是把第一人稱的相機的位置設定在我們控制的角色身后一定距離的位置上,以便我們能看清自己操控的游戲角色,在Cocos2d-x中的實現和第一人稱相機類似,相同的部分我們就不再說明了就是在得到角色位置賦值給相機后再把相機的位置加上個偏移量就可以了,偏移量我們用offset表示,如下圖:
其他的像移動和旋轉和第一人稱相機是一樣的,我就不在這里贅述了,這樣就可以實現第三人稱的相機了。
好了,今天的教程就先講到這里,通過這篇教程,我們就可以在Cocos2d-x中創建屬于我們自己的相機啦,通過創建相機來制作我們自己的3D游戲,以上講的三種相機的實現以及使用方法都是非常簡單的入門級介紹,可能大家覺得不太完整,沒關系大家可以參考CppTest中的Camera Test這個代碼,我的教程就是基于它寫的,在Camera Test中有詳細的代碼實現供大家參考,希望大家能過制作出比肩大作的游戲,謝謝!
本文主要匯總Cocos引擎中文站以及Cocos2d-x論壇中的關于Cocos2d-x 3D相關的教程,幫助大家更快地了解Cocos2d-x中的3D功能。
Cocos2d-x的3D特性
Earth Warrior 3D 大揭秘
分析《FantasyWarrior3D》結構
Cocos2d-x 3D 模型抗鋸齒方法
Cocos2d-x 3.3 的3D開發功能介紹
Cocos2d-x 3D 建模規范及注意事項
Cocos2d-x 3.x 3D跑酷游戲系列教程
Cocos2d-x 3D《捕魚達人3》系列教程
Cocos2d-x 3D 模型查看器(Mac & Win)
Cocos2d-x 3D fbx-conv 批量轉換腳本
Cocos2d-x 塔防游戲贼來了加入3D特性
Cocos2d-x Sprite3D用法和相關特性詳解
Cocos2d-x 3D FantasyWarrior3D 項目開源
Cocos2d-x 3D戰斗類游戲制作【模塊一】-- 數據庫(1)
Cocos2dx 3D戰斗類游戲制作【模塊一】-- 數據庫(2)
【Cocos2d-x 3.2】總結Grid3DAction 幾種常用3D特效
看了這么多篇的3D教程,是否對Cocos2d-x的3D功能有了更多更好的了解了呢?也把你的開發經驗或者實戰項目分享給大家吧!
http://blog.csdn.net/minsenwu/article/details/17120495聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com