Cocos 3D功能初探學習筆記(2)---3D精靈

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

在2D階段,最常用的繪製單元毫無疑問是精靈,通過精靈,我們可以將圖片繪製到屏幕上;3d階段,我們需要繪製在屏幕上的變成了美術人員通過3dmax等工具做出來的3d模型,繪製3D精靈是cocos最早的一批功能之一,也是比較重要的功能之一,本節我們就來學習3D精靈的繪製。

3D精靈支持的格式包括obj,c3t,c3b,不同點如下

obj:是3dmax導出的文件格式,但是不支持模型動畫的導出。

c3t:是一種json格式的文件,它是通過模型導出的fbx文件經過cocos自帶的文件轉換工具轉換的,作用是方便用戶查看模型的版本號和模型信息,實際項目中,由於c3t的體積比較大,造成加載速度比較慢,所以不推薦使用。

c3b:c3b的二進制文件版本,適宜在項目中使用

導出的模型需要滿足如下條件

1.只能有一套骨架

2.不能有父節點

3.只能有一個material

導出的過程,windows工具在cocos目錄下的tools\fbx-conv\win目錄(mac工具在tools\fbx-conv\mac目錄下)


fbx-conv -a 同時生成c3b c3t

fbx-conv -b 生成c3b

fbx-conv -t 生成c3t

命令行運行結束後,目錄下就有你要生成的模型的c3b或者c3t文件了。

Sprite3D類的使用:

資源準備好了,後面就是如何使用,Sprite3D的create函數可以傳入obj,c3b或者c3t文件的文件名加目錄就可以創建一個3d精靈了。

auto sprite = Sprite3D::create("Sprite3DTest/boss1.obj");

auto orc = cocos2d::Sprite3D::create("Sprite3DTest/orc.c3b");

3d精靈可以像其他普通節點一樣添加動畫,也可以像其他節點一樣作爲根節點使用,同時近期的版本中海修復了帶透明貼圖時的渲染錯誤。

Sprite3D還提供了createAsync函數,異步創建3D精靈 如果三維模型已經被加載,它會立即創建一個新的3D精靈並且回調會被調用一次。 否則會在一個新的線程加載模型文件,一旦加載完成,它會執行回調函數,並使用新創建的模型和自定義的用戶數據做爲參數。 這個回調將在主線程調用,因此在回調函數中創建任何的cocos2d對象是安全的。

Sprite3D::createAsync(path, CC_CALLBACK_2(Test::callback, this), (void*)index++);

第一個參數是目錄加文件名,第二個參數是加載結束後的回調函數,第三個參數是回調時傳入的參數。加載比較大的模型或者同時加載比較多模型時可以使用異步加載功能,使得你的遊戲沒有卡頓的效果。

setTexture用於設置紋理,如果多重紋理存在,設置第一個

setCullFaceEnabled用於設置是否進行裁剪剔除

setCullFace決定剔除哪個面,包括gl_back,gl_front,gl_front_and_back

getAttachNode通過傳入一個骨骼名獲得該骨骼

removeAttachNode刪除傳入骨骼名的骨骼

通過getMeshByIndex和getMeshByName可以獲得網格,通過讓不同的網格顯示或者隱藏,可以實現換裝效果

Sprite3D是node的子類,也就是說node的函數全部被Sprite3D繼承

動畫功能:

通過Animate3D和Animation3D可以實現播放骨骼動畫功能,前提是你的模型有動畫。

Animate3D靜態的動畫數據,可以被多個Animate3D共享,Animate3D通過指定的Animation3D創建的動作,用以給Sprite3D播放動畫

//傳入模型名稱,創建靜態動畫數據

animation = Animation3D::create(fileName);

//判斷是否存在動畫

if (animation)

{

     //創建動畫

     auto animate = Animate3D::create(animation);

     //動畫一直重複

     auto act = RepeatForever::create(animate);

     act->setTag(0);

     

    //執行動畫

    sprite->runAction(act);

}

Animate3D中的函數:

setSpeed設置動畫播放速度

setQuality設置動畫質量

setOriginInterval設置初始播放間隔

可以通過在create函數中傳入起始時間和持續時間來區分一個Animation3D中的多個動作,也可以通過createWithFrames函數中傳入起始幀,結束幀和幀率獲得多個動作。

Animation3D中可以通過create時在第二個參數中傳入動畫中的動作名來區分同一個模型中的多個動作,比如攻擊,受傷等等。

3d精靈描線:

//創建描線精靈

auto sprite = EffectSprite3D::create(fileName);

//創建描線

Effect3DOutline* effect = Effect3DOutline::create();

//描線顏色

effect->setOutlineColor(Vec3(1,0,0));

//線寬

effect->setOutlineWidth(0.01f);

//加入描線

sprite->addEffect(effect, -1);

EffectSprite3D可以創建精靈邊緣描線效果,它是Sprite3D的子類,具有Sprite3D的一切功能,通過給它加入Effect3DOutline可以實現精靈邊緣描線效果,可以設置顏色和線寬,同時可以進行不止一個描線。

 

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


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