3D精灵是cocos的3D模块加入的,要使用,需要在C++部分把宏定义打开 CC_ENABLE_BULLET_INTEGRATION
3D精灵支持的格式包括obj,c3t,c3b
obj和FBX是美术用3dmax或者maya之类的工具打出的,需要导成c3b或者c3t给cocos使用。工具位置在cocos目录下的tools\fbx-conv\win目录
拖动需要的obj或者FBX到fbx-conv.exe上,或者在目录下打开cmd,输入fbx-conv -a XXX
这样就生成好了c3b和c3t了,最好还是使用c3b,二进制流的文件会快一点吧
cocos在3D中引入了sprite3D,Sprite3D是继承自Node的,所以基本2d sprite有的接口基本都有,使用方法也基本一致,在lua中,3D坐标是cc.vet3(x,y,z)
sprite3D有两种创建方法,同步和异步创建
同步:
self._sprite3D1 =cc.Sprite3D:create("filename")
self._sprite3D1:setTexture("加载的3d纹理图片")
self._sprite3D1:setScale(0.5)
self._sprite3D1:setRotation3D(cc.vec3(0,180,0))
self._sprite3D1:setPosition3D(cc.vec3(0,0,0))
self:addChild(self._sprite3D1)
异步:
local function callback(sprite, index)
local node = self:getChildByTag(101)
local s = cc.Director:getInstance():getWinSize()
local width = s.width / (#paths)
local point = cc.p(width * (0.5 + index), s.height / 2.0)
sprite:setPosition(point)
node:addChild(sprite)
end
cc.Sprite3D:createAsync("fileName", function(sprite)
callback(sprite, 0)
end)
创建成功会回调给callback,在大模型或者大骨架的创建可以使用异步加载,平时还是同步吧!
sprite3D有很多的api,可以去查看源代码使用:
setTexture用于设置纹理,如果多重纹理存在,设置第一个
setCullFaceEnabled用于设置是否进行裁剪剔除
setCullFace决定剔除哪个面,包括gl_back,gl_front,gl_front_and_back
getAttachNode通过传入一个骨骼名获得该骨骼
removeAttachNode删除传入骨骼名的骨骼
通过getMeshByIndex和getMeshByName可以获得网格,通过让不同的网格显示或者隐藏,可以实现换装效果
Sprite3D是node的子类,也就是说node的函数全部被Sprite3D继承
动画功能:
这里也提一下3d animation吧
local animation = cc.Animation3D:create("fileName","ActionName")
if nil ~= animation then
local animate = cc.Animate3D:create(animation)
self._player:runAction(cc.RepeatForever:create(animate))
end
Animate3D中的函数:
setSpeed设置动画播放速度
setQuality设置动画质量
setOriginInterval设置初始播放间隔
可以通过在create函数中传入起始时间和持续时间来区分一个Animation3D中的多个动作,也可以通过createWithFrames函数中传入起始帧,结束帧和帧率获得多个动作。
Animation3D中可以通过create时在第二个参数中传入动画中的动作名来区分同一个模型中的多个动作,比如攻击,受伤等等。