OpenGL Assimp加载各类型模型(.obj、.fbx、.glb、.3ds)

这篇具有很好参考价值的文章主要介绍了OpenGL Assimp加载各类型模型(.obj、.fbx、.glb、.3ds)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.简介

本博客以.glb格式为例,加载glb格式的3d模型,网上找了一圈,基本上都是根据OpenGL官方示例,加载.obj格式的3d模型。

下面以.obj和.glb格式的3D模型简单介绍一下。

常见的.obj格式的3D模型如下所示:纹理都已经被剥离出来了。所以在使用Assimp库加载的时候,加载了指定的路径即可。

OpenGL Assimp加载各类型模型(.obj、.fbx、.glb、.3ds),OpenGL,3d,opengl,Qt,glb

但是.glb格式的3D模型如下所示,就只有一个glb文件,纹理嵌入到模型当中,假如我们使用Assimp库去加载的时候,能够加载出模型,但是加载出来的效果全是黑的,加载不了纹理。

OpenGL Assimp加载各类型模型(.obj、.fbx、.glb、.3ds),OpenGL,3d,opengl,Qt,glb

加载的效果如下图所示,黑的一片。

OpenGL Assimp加载各类型模型(.obj、.fbx、.glb、.3ds),OpenGL,3d,opengl,Qt,glb

原因分析:找不到纹理路径。

2.解决方法

将纹理分离,保存到本地文件,加载本地纹理文件。

首先通过ReadFile,读取本地文件,返回aiScene。

获取纹理数量:scene->mNumTextures。

获取当前的纹理:aiTexture* texture = scene->mTextures[i]。

然后看一下aiTexture官网文档介绍。

    /** Width of the texture, in pixels
     *
     * If mHeight is zero the texture is compressed in a format
     * like JPEG. In this case mWidth specifies the size of the
     * memory area pcData is pointing to, in bytes.
     */
    unsigned int mWidth;

    /** Height of the texture, in pixels
     *
     * If this value is zero, pcData points to an compressed texture
     * in any format (e.g. JPEG).
     */
    unsigned int mHeight;

    /** Data of the texture.
     *
     * Points to an array of mWidth * mHeight aiTexel's.
     * The format of the texture data is always ARGB8888 to
     * make the implementation for user of the library as easy
     * as possible. If mHeight = 0 this is a pointer to a memory
     * buffer of size mWidth containing the compressed texture
     * data. Good luck, have fun!
     */
     C_STRUCT aiTexel* pcData;

     char achFormatHint[ HINTMAXTEXTURELEN ]

mWidth:纹理的像素宽,如果高度为0,mWidth指定pcData指向的内存区域,以字节为单位。

mHeigth:纹理的像素高,像jpeg类型,该值为0。

pcData:纹理数据,数据的rgba值保存到这个数据里面。

achFormatHint:图片的格式,png或者jpg或者别的。

再进去看一下aiTexel结构,结构如下:包含r、g、b、a值,代表每一个像素的r、g、b、a值。

struct aiTexel {
    unsigned char b,g,r,a;

#ifdef __cplusplus
    //! Comparison operator
    bool operator== (const aiTexel& other) const
    {
        return b == other.b && r == other.r &&
               g == other.g && a == other.a;
    }

    //! Inverse comparison operator
    bool operator!= (const aiTexel& other) const
    {
        return b != other.b || r != other.r ||
               g != other.g || a != other.a;
    }

    //! Conversion to a floating-point 4d color
    operator aiColor4D() const
    {
        return aiColor4D(r/255.f,g/255.f,b/255.f,a/255.f);
    }
#endif // __cplusplus

} PACK_STRUCT;

 根据上面的条件,将图片保存到本地。

   const aiScene *scene = import.ReadFile(path, aiProcess_Triangulate | aiProcess_FlipUVs);
    if(!scene || scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode) {
        qDebug() << "ERROR::ASSIMP::" << import.GetErrorString();
        return;
    }
    
    directory = path.substr(0, path.find_last_of('/'));

    for (int i = 0; i < scene->mNumTextures; i++)
    {
        aiTexture* texture = scene->mTextures[i];

        char fileName[100];
        sprintf(fileName, "%s/%s.%s", modelDirectory.c_str(), texture->mFilename.C_Str(), texture->achFormatHint);

        QFile file(fileName);
        if (file.exists())
        {
            m_mapPath.insert(i, QString(fileName));
            continue;
        }

        if (!file.open(QIODevice::WriteOnly))
            break;

        unsigned char* buffer = new unsigned char[texture->mWidth * 4];
        memset(buffer, 0, texture->mWidth * 4);
        for (int x = 0; x < texture->mWidth; ++x)
        {
            //拷贝RGBA数据到缓冲区
            int index = x * 4;

            buffer[index] = texture->pcData[x].b; // Blue
            buffer[index + 1] = texture->pcData[x].g; // Green
            buffer[index + 2] = texture->pcData[x].r;         // Red
            buffer[index + 3] = texture->pcData[x].a; // Alpha

        }

        file.write((char*)buffer, texture->mWidth * 4);
        file.close();
        m_mapPath.insert(i, QString(fileName));
        delete[]buffer;
    }

如下图所示,将glb格式的纹理图片剥离出来保存到了本地。 

OpenGL Assimp加载各类型模型(.obj、.fbx、.glb、.3ds),OpenGL,3d,opengl,Qt,glb

最后加载对应的纹理即可。

3.加载效果图

OpenGL Assimp加载各类型模型(.obj、.fbx、.glb、.3ds),OpenGL,3d,opengl,Qt,glb

4.完整源码

https://download.csdn.net/download/wzz953200463/88746271文章来源地址https://www.toymoban.com/news/detail-805066.html

到了这里,关于OpenGL Assimp加载各类型模型(.obj、.fbx、.glb、.3ds)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • three.js加载3D模型,在网页上展示3D模型(.glb.gltf.fbx格式)

    Three.js是一款开源的主流3D绘图JS引擎,简单点,可以将它理解为three+js就可以了,three表示3D,js表示JavaScript的意思。 结构  .glb.gltf文件最好放在服务器上 放在本地容易报找不到的错 .fbx格式文件可以在本地用3d看图(win10自带)打开另存为.glb格式 index.html代码 js代码 项目案例

    2024年02月11日
    浏览(60)
  • Unity运行时程序动态加载外部.fbx.obj模型文件

    项目中有用到这个需求,为实现Unity程序运行状态下,从程序外部动态加载fbx或obj模型,所以研究了一下,目前TriLib比较靠谱,好用,多平台适用。会提供 下载插件地址。 unity运行时加载fbx 使用的插件 下载插件地址 将Trilib压缩包内容解压到Unity工程Assets文件夹下,返回工程等

    2024年02月16日
    浏览(48)
  • MFC加载3ds模型初步

    网上下一个资源,名为 OpenGL三维场景绘制.rar; 看一下它是用MFC和opengl,自己绘制三维场景; 运行一下,有一个exe可以运行; 有一个较新版本的不能运行;这应是缺少VC++运行库;   下面单独用VC6重新做了看一下; 新建一个单文档工程;       把额外的五个头文件,3个c

    2024年02月11日
    浏览(34)
  • 基于QT使用OpenGL,加载obj模型,进行鼠标交互

    基于QT平台,使用OpenGL进行obj文件加载显示; 使用鼠标对场景进行缩放、移动、旋转交互;   OpenGL是基于C的,学习曲线比较抖,但是总的来说就是下面一幅图,   用语言简单的描述(个人理解,可能不太准确)是把 cpu里内存里的3D数据,传输到显卡的内存里,以及如何

    2024年02月04日
    浏览(51)
  • 如何使用 ThreeJs 以 glTF、FBX 和 OBJ 文件格式加载 3D 模型,使用 ThreeJS 加载和显示带有纹理的 3D 模型

    在本文中,我展示了如何使用 ThreeJS 在 Web 视图中加载 3D 模型。Three.js 是一个跨浏览器的 JavaScript 库和应用程序编程接口,用于使用 WebGL 在 Web 浏览器中创建和显示动画 3D 计算机图形。加载不完整的原因有很多,例如纹理和材质渲染不正确。 创建场景 渲染场景 动画立方体

    2023年04月08日
    浏览(56)
  • .3ds 文件转 glb 或 gltf

            拿到一个3d模型,是.3ds 文件和一堆png的纹理图片。要在cesium中显示,cesium中支持这个格式,需要转化成支持的glb 或 gltf格式。 目录 一、在3dmax中导入,并显示贴图纹理 二、转换成fbx,再转换成obj 三、在Blender 中导入obj,然后转换成 glb 或 gltf         下载3dmax2020 ,

    2024年02月16日
    浏览(50)
  • 推荐:vue-3d-loader支持.dae/.fbx/.gltf/.glb/.obj/.ply/.stl/.json,并支持同一个场景导入多个不同3D模型,支持mtl材质以及jpg/png等图片纹理

    vue-3d-loader是vueJS + threeJS整合的一个3d展示组件。 支持.dae/.fbx/.gltf/.glb/.obj/.ply/.stl/.json,并支持同一个场景导入多个不同3D模型,支持mtl材质以及jpg/png等图片纹理 vue3请安装 2.0.0 及以上版本࿰

    2024年02月10日
    浏览(54)
  • 【我的OpenGL学习进阶之旅】Assimp库支持哪些3D模型格式?

    在通过LearnOpenGL学习 OpenGL 知识的时候,有介绍如何通过Assimp来加载3D模型,并了解了Mesh网格的概念。 Assimp Mesh网格 3D模型 在 https://learnopengl-cn.github.io/03%20Model%20Loading/01%20Assimp/ 中有介绍使用 Assimp 库来加载 3D 模型 .obj 格式。 一个非常流行的模型导入库是Assimp,它是 Open Asse

    2024年02月05日
    浏览(41)
  • 【瑞模网】Cesium 模型转换(obj max fbx转gltf/3dtiles)

    这三种都是3dmax支持的格式,可以统一将.fbx和.max转化为.obj格式,然后通过obj2gltf转为glb或者gltf,其中gltf是比glb的模型要大一点;或者通过ceisumlab等工具将.obj处理成3dtiles,当然3dtiles是用于大场景居多。 .obj .max .fbx类型的模型转换为gltf/glb,使用obj2gltf 以下举例讲述下.max的处

    2024年02月11日
    浏览(66)
  • open3d,读取stl/ply/obj/off/gltf/glb三维模型,并转换成点云,保存

    可以自己用建模软件建立一个模型 本案例使用模型的下载地址 可以从free3d免费下载,无需注册 效果: 效果: 均匀采样会在表面出现采样点聚集的现象,open3d实现了一种基于poisson_disk方法的采样,能实现表面的均匀采样 原理 :参数umber_of_points是最终采样的点数量,实际会先

    2024年02月11日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包