国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

OpenGL Assimp加載各類型模型(.obj、.fbx、.glb、.3ds)

這篇具有很好參考價(jià)值的文章主要介紹了OpenGL Assimp加載各類型模型(.obj、.fbx、.glb、.3ds)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1.簡(jiǎn)介

本博客以.glb格式為例,加載glb格式的3d模型,網(wǎng)上找了一圈,基本上都是根據(jù)OpenGL官方示例,加載.obj格式的3d模型。

下面以.obj和.glb格式的3D模型簡(jiǎn)單介紹一下。

常見的.obj格式的3D模型如下所示:紋理都已經(jīng)被剝離出來了。所以在使用Assimp庫加載的時(shí)候,加載了指定的路徑即可。

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

但是.glb格式的3D模型如下所示,就只有一個(gè)glb文件,紋理嵌入到模型當(dāng)中,假如我們使用Assimp庫去加載的時(shí)候,能夠加載出模型,但是加載出來的效果全是黑的,加載不了紋理。

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。

獲取紋理數(shù)量:scene->mNumTextures。

獲取當(dāng)前的紋理:aiTexture* texture = scene->mTextures[i]。

然后看一下aiTexture官網(wǎng)文檔介紹。

    /** 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指向的內(nèi)存區(qū)域,以字節(jié)為單位。

mHeigth:紋理的像素高,像jpeg類型,該值為0。

pcData:紋理數(shù)據(jù),數(shù)據(jù)的rgba值保存到這個(gè)數(shù)據(jù)里面。

achFormatHint:圖片的格式,png或者jpg或者別的。

再進(jìn)去看一下aiTexel結(jié)構(gòu),結(jié)構(gòu)如下:包含r、g、b、a值,代表每一個(gè)像素的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;

?根據(jù)上面的條件,將圖片保存到本地。

   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數(shù)據(jù)到緩沖區(qū)
            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

最后加載對(duì)應(yīng)的紋理即可。

3.加載效果圖

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

4.完整源碼

https://download.csdn.net/download/wzz953200463/88746271文章來源地址http://www.zghlxwxcb.cn/news/detail-805066.html

到了這里,關(guān)于OpenGL Assimp加載各類型模型(.obj、.fbx、.glb、.3ds)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • three.js加載3D模型,在網(wǎng)頁上展示3D模型(.glb.gltf.fbx格式)

    three.js加載3D模型,在網(wǎng)頁上展示3D模型(.glb.gltf.fbx格式)

    Three.js是一款開源的主流3D繪圖JS引擎,簡(jiǎn)單點(diǎn),可以將它理解為three+js就可以了,three表示3D,js表示JavaScript的意思。 結(jié)構(gòu) ?.glb.gltf文件最好放在服務(wù)器上 放在本地容易報(bào)找不到的錯(cuò)?.fbx格式文件可以在本地用3d看圖(win10自帶)打開另存為.glb格式 index.html代碼 js代碼 項(xiàng)目案例

    2024年02月11日
    瀏覽(102)
  • Unity運(yùn)行時(shí)程序動(dòng)態(tài)加載外部.fbx.obj模型文件

    Unity運(yùn)行時(shí)程序動(dòng)態(tài)加載外部.fbx.obj模型文件

    項(xiàng)目中有用到這個(gè)需求,為實(shí)現(xiàn)Unity程序運(yùn)行狀態(tài)下,從程序外部動(dòng)態(tài)加載fbx或obj模型,所以研究了一下,目前TriLib比較靠譜,好用,多平臺(tái)適用。會(huì)提供 下載插件地址。 unity運(yùn)行時(shí)加載fbx 使用的插件 下載插件地址 將Trilib壓縮包內(nèi)容解壓到Unity工程Assets文件夾下,返回工程等

    2024年02月16日
    瀏覽(28)
  • MFC加載3ds模型初步

    MFC加載3ds模型初步

    網(wǎng)上下一個(gè)資源,名為?OpenGL三維場(chǎng)景繪制.rar; 看一下它是用MFC和opengl,自己繪制三維場(chǎng)景; 運(yùn)行一下,有一個(gè)exe可以運(yùn)行; 有一個(gè)較新版本的不能運(yùn)行;這應(yīng)是缺少VC++運(yùn)行庫; ? 下面單獨(dú)用VC6重新做了看一下; 新建一個(gè)單文檔工程; ? ? ? 把額外的五個(gè)頭文件,3個(gè)c

    2024年02月11日
    瀏覽(15)
  • 基于QT使用OpenGL,加載obj模型,進(jìn)行鼠標(biāo)交互

    基于QT使用OpenGL,加載obj模型,進(jìn)行鼠標(biāo)交互

    基于QT平臺(tái),使用OpenGL進(jìn)行obj文件加載顯示; 使用鼠標(biāo)對(duì)場(chǎng)景進(jìn)行縮放、移動(dòng)、旋轉(zhuǎn)交互; ??OpenGL是基于C的,學(xué)習(xí)曲線比較抖,但是總的來說就是下面一幅圖, ??用語言簡(jiǎn)單的描述(個(gè)人理解,可能不太準(zhǔn)確)是把 cpu里內(nèi)存里的3D數(shù)據(jù),傳輸?shù)斤@卡的內(nèi)存里,以及如何

    2024年02月04日
    瀏覽(25)
  • 如何使用 ThreeJs 以 glTF、FBX 和 OBJ 文件格式加載 3D 模型,使用 ThreeJS 加載和顯示帶有紋理的 3D 模型

    在本文中,我展示了如何使用 ThreeJS 在 Web 視圖中加載 3D 模型。Three.js 是一個(gè)跨瀏覽器的 JavaScript 庫和應(yīng)用程序編程接口,用于使用 WebGL 在 Web 瀏覽器中創(chuàng)建和顯示動(dòng)畫 3D 計(jì)算機(jī)圖形。加載不完整的原因有很多,例如紋理和材質(zhì)渲染不正確。 創(chuàng)建場(chǎng)景 渲染場(chǎng)景 動(dòng)畫立方體

    2023年04月08日
    瀏覽(32)
  • .3ds 文件轉(zhuǎn) glb 或 gltf

    .3ds 文件轉(zhuǎn) glb 或 gltf

    ? ? ? ? 拿到一個(gè)3d模型,是.3ds 文件和一堆png的紋理圖片。要在cesium中顯示,cesium中支持這個(gè)格式,需要轉(zhuǎn)化成支持的glb 或 gltf格式。 目錄 一、在3dmax中導(dǎo)入,并顯示貼圖紋理 二、轉(zhuǎn)換成fbx,再轉(zhuǎn)換成obj 三、在Blender 中導(dǎo)入obj,然后轉(zhuǎn)換成 glb 或 gltf ? ? ? ? 下載3dmax2020?,

    2024年02月16日
    瀏覽(23)
  • 推薦:vue-3d-loader支持.dae/.fbx/.gltf/.glb/.obj/.ply/.stl/.json,并支持同一個(gè)場(chǎng)景導(dǎo)入多個(gè)不同3D模型,支持mtl材質(zhì)以及jpg/png等圖片紋理

    推薦:vue-3d-loader支持.dae/.fbx/.gltf/.glb/.obj/.ply/.stl/.json,并支持同一個(gè)場(chǎng)景導(dǎo)入多個(gè)不同3D模型,支持mtl材質(zhì)以及jpg/png等圖片紋理

    vue-3d-loader是vueJS + threeJS整合的一個(gè)3d展示組件。 支持.dae/.fbx/.gltf/.glb/.obj/.ply/.stl/.json,并支持同一個(gè)場(chǎng)景導(dǎo)入多個(gè)不同3D模型,支持mtl材質(zhì)以及jpg/png等圖片紋理 vue3請(qǐng)安裝 2.0.0 及以上版本?

    2024年02月10日
    瀏覽(33)
  • 【我的OpenGL學(xué)習(xí)進(jìn)階之旅】Assimp庫支持哪些3D模型格式?

    【我的OpenGL學(xué)習(xí)進(jìn)階之旅】Assimp庫支持哪些3D模型格式?

    在通過LearnOpenGL學(xué)習(xí) OpenGL 知識(shí)的時(shí)候,有介紹如何通過Assimp來加載3D模型,并了解了Mesh網(wǎng)格的概念。 Assimp Mesh網(wǎng)格 3D模型 在 https://learnopengl-cn.github.io/03%20Model%20Loading/01%20Assimp/ 中有介紹使用 Assimp 庫來加載 3D 模型 .obj 格式。 一個(gè)非常流行的模型導(dǎo)入庫是Assimp,它是 Open Asse

    2024年02月05日
    瀏覽(22)
  • 【瑞模網(wǎng)】Cesium 模型轉(zhuǎn)換(obj max fbx轉(zhuǎn)gltf/3dtiles)

    【瑞模網(wǎng)】Cesium 模型轉(zhuǎn)換(obj max fbx轉(zhuǎn)gltf/3dtiles)

    這三種都是3dmax支持的格式,可以統(tǒng)一將.fbx和.max轉(zhuǎn)化為.obj格式,然后通過obj2gltf轉(zhuǎn)為glb或者gltf,其中g(shù)ltf是比glb的模型要大一點(diǎn);或者通過ceisumlab等工具將.obj處理成3dtiles,當(dāng)然3dtiles是用于大場(chǎng)景居多。 .obj .max .fbx類型的模型轉(zhuǎn)換為gltf/glb,使用obj2gltf 以下舉例講述下.max的處

    2024年02月11日
    瀏覽(83)
  • open3d,讀取stl/ply/obj/off/gltf/glb三維模型,并轉(zhuǎn)換成點(diǎn)云,保存

    open3d,讀取stl/ply/obj/off/gltf/glb三維模型,并轉(zhuǎn)換成點(diǎn)云,保存

    可以自己用建模軟件建立一個(gè)模型 本案例使用模型的下載地址 可以從free3d免費(fèi)下載,無需注冊(cè) 效果: 效果: 均勻采樣會(huì)在表面出現(xiàn)采樣點(diǎn)聚集的現(xiàn)象,open3d實(shí)現(xiàn)了一種基于poisson_disk方法的采樣,能實(shí)現(xiàn)表面的均勻采樣 原理 :參數(shù)umber_of_points是最終采樣的點(diǎn)數(shù)量,實(shí)際會(huì)先

    2024年02月11日
    瀏覽(271)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包