目前cocos2d支持3中模型文件的解析,分别是obj,c3t和c3b。obj在前面的文章中做了分析,但它不能描述动作。c3t是以json文件格式的文本文件,c3b是二进制文件。本文分析下cocos2d加载c3t文件的一些内容。
以cocos2d的demo中的orc.c3t文件为例进行说明,orc是魔兽的意思,加载出来的效果如下:
因为c3t文件很长,在此就不贴出来了,画了一个简化的结构图,如下:
orc-c3t.png
我们在《加载obj文件》一文中分析过,cocos2d对obj文件解析后会把数据存在NodeDatas,MeshDatas和MaterialDatas三个结构体中,看下Sprite3D的loadFromFile函数:
bool Sprite3D::loadFromFile(const std::string& path, NodeDatas* nodedatas, MeshDatas* meshdatas, MaterialDatas* materialdatas)
{
std::string fullPath = FileUtils::getInstance()->fullPathForFilename(path);
std::string ext = FileUtils::getInstance()->getFileExtension(path);
if (ext == ".obj")
{
return Bundle3D::loadObj(*meshdatas, *materialdatas, *nodedatas, fullPath);
}
else if (ext == ".c3b" || ext == ".c3t")
{
//load from .c3b or .c3t
auto bundle = Bundle3D::createBundle();
if (!bundle->load(fullPath))
{
Bundle3D::destroyBundle(bundle);
return false;
}
//将文件解析后,数据保存在meshdatas,materialdatas和nodedatas中
auto ret = bundle->loadMeshDatas(*meshdatas)
&& bundle->loadMaterials(*materialdatas) && bundle->loadNodes(*nodedatas);
Bundle3D::destroyBundle(bundle);
return ret;
}
return false;
}
具体的解析过程不分析了,下面看下解析完之后在c3t文件数据在这三个结构体中保存的位置先看MeshDatas,如下:
MaterialDatas结构中的数据比较简单,主要还是记录了贴图文件的路径,以便后续加载纹理,如下:
NodeDatas结构中主要保存两种节点数据,一种是模型节点,主要用于蒙皮,另一种是骨骼节点,用于记录骨骼的父子关系,他们在c3t文件中是以"skeleton": false或"skeleton": true,来区分,如下:
c3t文件中还有animations字段,即模型动作信息,记录在Animation3D类中,将在后面文章分析。
网友评论