个人原创,欢迎转载,转载请注明地址,专栏地址http://blog.csdn.net/bill_man
在2D阶段,最常用的绘制单元毫无疑问是精灵,通过精灵,我们可以将图片绘制到屏幕上;3d阶段,我们需要绘制在屏幕上的变成了美术人员通过3dmax等工具做出来的3d模型,绘制3D精灵是cocos最早的一批功能之一,也是比较重要的功能之一,本节我们就来学习3D精灵的绘制。
obj:是3dmax导出的文件格式,但是不支持模型动画的导出。
c3t:是一种json格式的文件,它是通过模型导出的fbx文件经过cocos自带的文件转换工具转换的,作用是方便用户查看模型的版本号和模型信息,实际项目中,由于c3t的体积比较大,造成加载速度比较慢,所以不推荐使用。
c3b:c3b的二进制文件版本,适宜在项目中使用
导出的模型需要满足如下条件
1.只能有一套骨架
2.不能有父节点
3.只能有一个material
导出的过程,windows工具在cocos目录下的tools\fbx-conv\win目录(mac工具在tools\fbx-conv\mac目录下)
@H_502_45@
@H_502_45@
fbx-conv-a同时生成c3bc3t
fbx-conv-b生成c3b
fbx-conv-t生成c3t
命令行运行结束后,目录下就有你要生成的模型的c3b或者c3t文件了。
Sprite3D类的使用:
资源准备好了,后面就是如何使用,Sprite3D的create函数可以传入obj,c3b或者c3t文件的文件名加目录就可以创建一个3d精灵了。
autosprite=Sprite3D::create("Sprite3DTest/boss1.obj");
autoorc=cocos2d::"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)
{
//@H_502_45@创建动画
autoanimate=Animate3D::create(animation);
//@H_502_45@动画一直重复
autoact=RepeatForever::create(animate);
act->setTag(0);
//@H_502_45@执行动画
sprite->runAction(act);
}
Animate3D中的函数:
setSpeed设置动画播放速度
setQuality设置动画质量
setOriginInterval设置初始播放间隔
可以通过在create函数中传入起始时间和持续时间来区分一个Animation3D中的多个动作,也可以通过createWithFrames函数中传入起始帧,结束帧和帧率获得多个动作。
Animation3D中可以通过create时在第二个参数中传入动画中的动作名来区分同一个模型中的多个动作,比如攻击,受伤等等。
3d精灵描线:
//创建描线精灵
autosprite=EffectSprite3D::create(fileName);
//创建描线
Effect3DOutline*effect=Effect3DOutline::create();
//描线颜色
effect->setOutlineColor(Vec3(1,0));
//线宽
effect->setOutlineWidth(0.01f);
//加入描线
sprite->addEffect(effect,-1);
EffectSprite3D可以创建精灵边缘描线效果,它是Sprite3D的子类,具有Sprite3D的一切功能,通过给它加入Effect3DOutline可以实现精灵边缘描线效果,可以设置颜色和线宽,同时可以进行不止一个描线。
能力不足,水平有限,如有错误,欢迎指出。