深入理解加载FBX模型文件

本文详细介绍了FBX模型文件的内部结构,包括版本号、节点属性、对象类型等,并展示了如何使用C++实现加载FBX模型的代码,涵盖了模型的几何信息、材质、纹理、骨骼动画等关键内容。通过实例代码,帮助读者理解并实现FBX模型的加载,适用于自研引擎或SDK。
摘要由CSDN通过智能技术生成

每个模型文件都有自己的格式,有自研引擎的模型格式,有AutoDesk提供的模型文件格式,比如FBX模型文件,因为Unity与UE4引擎的使用而备受关注,FBX文件是AutoDesk提供的SDK,已经封装好了,我们并不能查看到其内部结构。网上也有很多关于这方面的文章,但是都没有真正解释FBX文件的内部结构,以及自己如何封装程序加载FBX模型文件。本篇博客就教给读者这两方面的知识,这样更有助于读者理解FBX文件,从而可以将FBX的加载代码移植到自己的引擎中或者自己的SDK中,当然也有助于理解Unity和UE4引擎中使用的FBX模型文件,下面我们先介绍FBX文件内部结构。

  • FBX文件内部结构

    我们要加载模型文件,必须要清楚模型文件的内部结构,否则我们无法写程序加载模型文件,FBX模型文件是一种二进制文件,我们打开只能看到一些局部信息,无法知道它真正的内部结构,也有的文件提供了模型文件的内部结构比如OBJ文件,OBJ文件是无法导出骨骼动画的,只能是静态的,但是它文件的内部结构是可以参考的,所有模型格式的文件内部结构有自己的共性,比如模型信息:模型面数,三角形数,顶点坐标,骨骼动画信息,模型版本号信息等等,这些信息每个模型文件都会有的。
    接下来我们分析FBX文件的内部结构,我们先打开FBX模型的二进制文件:
    这里写图片描述
    这个是我们的FBX文件模型,虽然它是二进制的,但是我们从二进制模型文件信息中还是可以看到一点端倪的,比如FBXVersion 版本号,NodeAttributeL结点属性,ObjectTypeS 对象类型,RotationPivotS旋转信息,ScalingOffsetS缩放偏移等等,相信读者看起来还是比较费劲的。
    下面先看看我们已经实现的FBX文件内部结构,如下图所示:
    这里写图片描述
    上图显示的是我们带有动作的FBX模型文件内部结构,node attribute, animation curve node,body,skin等等,这些我们需要通过代码实现,我们使用的是C++语言,下面我们把FBX模型文件中的重要内容给读者展示如下:
    这里写图片描述
    上图是FBX文件的核心内容的标识,在具体实现时,我们可通过枚举表示,代码定义如下所示:

    enum class Type
    {
   
        ROOT,
        GEOMETRY,
        MATERIAL,
        MESH,
        TEXTURE,
        LIMB_NODE,
        NULL_NODE,
        NODE_ATTRIBUTE,
        CLUSTER,
        SKIN,
        ANIMATION_STACK,
        ANIMATION_LAYER,
        ANIMATION_CURVE,
        ANIMATION_CURVE_NODE
    };

下面我们告诉读者如何加载FBX模型文件,该模块也可以移植到自己的引擎或者SDK中,作者自己写的引擎使用的也是FBX SDK,用的也是本博客实现的接口模块。

  • 加载FBX模型文件

    我们先从加载FBX模型文件开始,加载模型文件的实现内容如下所示:

    FILE* fp = fopen("c.fbx", "rb");
    if (!fp) return false;

    fseek(fp, 0, SEEK_END);
    long file_size = ftell(fp);
    fseek(fp, 0, SEEK_SET);
    auto* content = new ofbx::u8[file_size];
    fread(content, 1, file_size, fp);
    g_scene = ofbx::load((ofbx::u8*)content, file_size);

看着是不是眼熟,上面的代码我们经常用于读取二进制文件,在这段代码中最为关键的函数是load加载FBX模型文件,下面实现load函数,如下所示:

IScene* load(const u8* data, int size)
{
    std::unique_ptr<Scene> scene = std::make_unique<Scene>();
    scene->m_data.resize(size);
    memcpy(&scene->m_data[0], data, size);
    OptionalError<Element*> root = tokenize(&scene->m_data[0], size);
    if (root.isError())
    {
        Error::s_message = "";
        root = tokenizeText(&scene->m_data[0], size);
        if (root.isError()) return nullptr;
    }

    scene->m_root_element = root.getValue();
    assert(scene->m_root_element);

    if(!parseConnections(*root.getValue(), scene.get())) return nullptr;
    if(!parseTakes(scene.get())) return nullptr;
    if(!parseObjects(*root.getValue(), scene.get())) return nullptr;
    parseGlobalSettings(*root.getValue(), scene.get());

    return scene.release();
}

在load函数中,首先判断加

  • 67
    点赞
  • 202
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 29
    评论
### 回答1: Qt3D是一个用于创建3D应用程序的Qt模块,支持加载和展示各种3D模型格式,包括FBX模型。 要加载FBX模型,首先需要在Qt项目中引入Qt3D模块,并在代码中创建一个Qt3D场景和一个Qt3D实体(Entity)。然后,可以通过Qt3D提供的加载器(如QSceneLoader)来加载FBX模型文件加载FBX模型的步骤如下: 1. 创建一个Qt3D场景和一个实体: Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity(); Qt3DRender::QCamera *cameraEntity = view.camera(); 2. 创建一个Qt3D加载器,并设置加载器的模型文件路径: Qt3DRender::QSceneLoader *loader = new Qt3DRender::QSceneLoader(); loader->setSource(QUrl::fromLocalFile("path/to/your/fbx/file.fbx")); 3. 将加载器添加到实体中: rootEntity->addComponent(loader); 4. 将根实体添加到场景中,并将相机与场景关联: Qt3DExtras::Qt3DWindow view; view.setRootEntity(rootEntity); view.show(); 以上步骤将加载并展示FBX模型。你可以通过进一步的Qt3D组件和功能来实现模型的自定义渲染、动画控制和交互等。 需要注意的是,FBX是一种二进制文件格式,需要先将其转换为Qt3D可读取的格式。可以使用FBX SDK或其他相关工具来进行模型转换和预处理。 总结,通过引入Qt3D模块和使用Qt3D加载器,我们可以在Qt应用程序中加载和展示FBX模型。灵活的Qt3D框架还提供了许多功能来处理和渲染3D模型,使我们能够在应用程序中创建丰富的3D体验。 ### 回答2: Qt3D 是一个用于创建3D图形应用程序的Qt模块。它支持加载多种3D模型格式,其中包括FBXFBX是一种广泛使用的3D模型格式,由Autodesk开发并支持。 要加载一个FBX模型,我们需要进行以下步骤: 1. 首先,我们需要在我们的Qt应用程序中包含Qt3D模块。在.pro文件中添加如下行: ``` QT += 3dcore 3drender 3dinput ``` 2. 然后,我们需要创建一个Qt3D渲染窗口来显示我们的3D场景。我们可以使用QQuickView或QWindow派生的自定义窗口,具体使用哪个取决于我们的应用程序需求。 3. 接下来,我们需要创建一个QEntity对象作为场景的根节点。这个对象可以包含其他实体和组件。 4. 然后,我们可以使用QSceneLoader组件来加载FBX模型文件。我们需要将这个组件添加到场景中,并指定FBX文件的路径。 ```cpp QSceneLoader *sceneLoader = new QSceneLoader(); sceneLoader->setSource(QUrl::fromLocalFile("path/to/fbx/file.fbx")); QEntity *modelEntity = new QEntity(); modelEntity->addComponent(sceneLoader); ``` 5. 最后,我们可以将模型实体添加到场景的根节点中,并在渲染窗口中显示场景。 ```cpp rootEntity->addEntity(modelEntity); view->setRootEntity(rootEntity); view->show(); ``` 这样,我们就成功加载FBX模型并在Qt3D应用程序中显示出来了。我们可以通过添加其他组件和实体来对模型进行进一步的修改和控制。 在加载FBX模型之前,我们需要确保我们的应用程序已经安装了Qt3D模块。可以使用Qt的在线安装程序或源码编译安装Qt以获取Qt3D模块。 以上是一个简单的示例,演示了如何使用Qt3D加载FBX模型。根据我们的需求,我们可以在加载模型之后进行更多高级操作和修改。 ### 回答3: Qt3D是Qt框架中的一个模块,用于实现3D图形的渲染和交互。而FBX是一种用于存储和传输3D模型和动画数据的文件格式。 要在Qt3D中加载并显示FBX模型,首先需要导入Qt3D相关的头文件,并创建一个Qt3D的场景。 然后,需要创建一个Qt3D中的实体(Entity)来表示我们要加载FBX模型。可以使用Qt3D提供的QEntity类来创建实体,并将其添加到场景中。 接下来,需要创建一个Qt3D中的组件(Component),将FBX模型加载到实体中。Qt3D提供了QSceneLoader组件,可以用来加载FBX模型文件。通过调用QSceneLoader的setSource函数,可以指定要加载FBX文件路径。然后,将该组件添加到实体中。 最后,将实体添加到场景中,并启动Qt3D的渲染循环,即可在窗口中显示加载FBX模型。 除了加载FBX模型,Qt3D还提供了许多其他功能,如光照、材质、相机等,可以通过设置相应的组件和属性来实现。在加载后,可以通过操作相应的组件来对模型进行旋转、平移、缩放等操作,实现交互效果。 需要注意的是,加载FBX模型时需要保证FBX文件的路径正确,并且需要安装对应的FBX导入插件,以便Qt3D能够正常解析和加载FBX文件
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海洋_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值