Assimp 模型有纹理但没有纹理坐标

Posted

技术标签:

【中文标题】Assimp 模型有纹理但没有纹理坐标【英文标题】:Assimp model has Textures but no Texture Coordinates 【发布时间】:2013-05-01 17:58:48 【问题描述】:

我正在使用 Assimp 将 3D 模型加载到我的程序中。到目前为止,一切都变得很花哨,除了我遇到了一个似乎没有意义的 Lightwave 对象。当然它在 Lightwave 中渲染得很好,但在 Assimp 中没有纹理坐标,没有 UV 坐标,但纹理最终会被加载。但这无济于事——它们只是停留在内存中,永远不会被使用,因为——你猜对了——没有纹理坐标。

到目前为止,我还没有找到任何有用的 Assimp 页面。其他模型加载良好并且经过适当的纹理映射。这是 Assimp 的问题吗?

【问题讨论】:

【参考方案1】:

所有 Lightwave 型号都会出现这种情况,还是只有这一款?你的程序能正确渲染其他模型吗?

我也遇到了和你一样的问题,使用 assimp 读取 OBJ 文件(而不是 Lightwave 数据文件)并在 OpenGL 中渲染。我的渲染器完全是从 assimp 网站上的示例复制而来的。我对我的渲染器进行了一些调查,发现我没有任何代码可以使用 UV!所以,我添加了

if( mesh->mTextureCoords[0] != NULL ) 
    glTexCoord2fv( &mesh->mTextureCoords[0][index].x );

就在我画一个顶点之前,在哪里

int index = face->mIndices[i];

而 i 是 for 循环的循环控制变量。

问题:在 assimp 网站上找到的渲染代码对 UV 坐标没有任何用处。您必须自己添加。

希望这还不算晚!

【讨论】:

我没有大量的模型,但至少有一个发生了这种情况。【参考方案2】:

有8个纹理坐标槽...每个可以填充不同的纹理...你只需要检查第一个

网格->mTextureCoords[0]

将其转换为类似“const struct aiVector3D*”的数组 并遍历索引 mTextureCoords[0][t]

注意我们循环 t 和它的二维数组

    for (t = 0; t < mesh->mNumVertices; ++t) 
        const struct aiVector3D* textureVec = &mesh->mTextureCoords[0][t];
        printf("tex (%f,%f,%f)", textureVec->x, textureVec->y, textureVec->z );
    

希望对您有所帮助!我也卡在这里了!以为它没有加载...

现在: Tex(0.159871,0.410298,0.000000)Tex(0.034839,0.369741,0.000000)Tex(0.147435,0.506447,0.000000)Tex(0.018893,0.493014,0.000000)Tex(0.159871,0.602596,0.000000)Tex(0.034839,0.616288,0.000000)Tex( 0.196806,0.695823,0.000000)Tex(0.082196,0.735817,0.000000)Tex(0.257118,0.783297,0.000000)Tex(0.159520,0.847968,0.000000)Tex(0.314932,0.833907,0.000000)Tex(0.318555,0.981848,0.000000)Tex(0.554152, 0.373114,0.000000)tex (0.557998,0.677465,0.000000)tex (0.442610,0.703479,0.000000)

【讨论】:

其实可能是meth->mNumUVComponents...抱歉!

以上是关于Assimp 模型有纹理但没有纹理坐标的主要内容,如果未能解决你的问题,请参考以下文章

在纹理的SceneKit绘画与纹理坐标

Assimp 无法加载除 FBX 的漫反射纹理外的其他纹理

obj 模型加载纹理坐标和顶点位置未正确加载

OpenGL 纹理坐标没有影响

知识点3 shader_基础纹理

3D模型文件 OBJ格式模型详细介绍