cocos2d源码分析(十一):加载c3t文件

目前cocos2d支持3中模型文件的解析,分别是obj,c3t和c3b。obj在前面的文章中做了分析,但它不能描述动作。c3t是以json文件格式的文本文件,c3b是二进制文件。本文分析下cocos2d加载c3t文件的一些内容。

以cocos2d的demo中的orc.c3t文件为例进行说明,orc是魔兽的意思,加载出来的效果如下:


5994163-39199dcf83f31cc4.PNG

因为c3t文件很长,在此就不贴出来了,画了一个简化的结构图,如下:


5994163-26ada89da621e6b7.png
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文件数据在这三个结构体中保存的位置先看MaterialDatas,如下:


5994163-b099db0c1d394f1e.png

MaterialDatas结构中的数据比较简单,主要还是记录了贴图文件的路径,以便后续加载纹理,如下:


5994163-35b252407566ea8a.png

NodeDatas结构中主要保存两种节点数据,一种是模型节点,主要用于蒙皮,另一种是骨骼节点,用于记录骨骼的父子关系,他们在c3t文件中是以"skeleton": false或"skeleton": true,来区分,如下:


5994163-fb35a5fc00c5d951.png

c3t文件中还有animations字段,即模型动作信息,记录在Animation3D类中,将在后面文章分析。

猜你喜欢

转载自blog.csdn.net/weixin_34266504/article/details/87427935