美文网首页
cocos2d源码分析(十一):加载c3t文件

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

作者: 奔向火星005 | 来源:发表于2019-01-21 13:11 被阅读0次

    目前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类中,将在后面文章分析。

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/mwiqjqtx.html