c++ - Assimp Faces 都有索引 (0,1,2)

标签 c++ file 3d loading assimp

我使用 Assimp 加载 OBJ 文件以使用我自己的渲染管道在 OpenGL 中渲染。

但是当我加载文件时,每个 面都有索引 (0,1,2),而不是顶点数组中的适当条目。

我能找到的每个例子都做了类似的事情(这就是我正在做的):

for (size_t k = 0; k<mesh->mNumFaces; ++k)
{
    if (mesh->mFaces->mNumIndices == 3)
    {
        out.index_list.push_back(mesh->mFaces->mIndices[0]);
        out.index_list.push_back(mesh->mFaces->mIndices[1]);
        out.index_list.push_back(mesh->mFaces->mIndices[2]);
    }
    else
    {
        std::cout << "wierd number of indices to a face: " << mesh->mFaces->mNumIndices << std::endl;
    }
}

或这个(我试过,非常错误):

for (size_t k = 0; k<mesh->mNumFaces; ++k)
{
    if (mesh->mFaces->mNumIndices == 3)
    {
        out.index_list.push_back(mesh->mFaces->mIndices[0]+k*3);
        out.index_list.push_back(mesh->mFaces->mIndices[1]+k*3);
        out.index_list.push_back(mesh->mFaces->mIndices[2]+k*3);
    }
    else
    {
        std::cout << "wierd number of indices to a face: " << mesh->mFaces->mNumIndices << std::endl;
    }
}

我还尝试了一些基于网格中顶点和面的相对数量的变体,猜测它应该是一个三角形带等等......但这也行不通。

例子:

if (mesh->mNumFaces == mesh->mNumVertices-2)
    for (size_t k = 0; k<mesh->mNumVertices-2; ++k)
    {
        if (k%2)
        {
            out.index_list.push_back(k+1);
            out.index_list.push_back(k+0);
            out.index_list.push_back(k+2);
        }
        else
        {
            out.index_list.push_back(k+0);
            out.index_list.push_back(k+1);
            out.index_list.push_back(k+2);
        }
    }
else if...

我显然在这里遗漏了一些非常基本和明显的东西,但我看不到它是什么。

最佳答案

我认为您的代码只是加载网格 (aiMesh) 中第一个三角形(面)的索引。

mesh->mFace 是一个指针,指向aiFace数组的first元素。

您的(第一个)代码没有考虑变量 k,您的面部索引。

相反,这样做:

for (size_t k = 0; k<mesh->mNumFaces; ++k)
{
    if (mesh->mFaces->mNumIndices == 3)
    {
        // kth face!
        out.index_list.push_back(mesh->mFaces[k].mIndices[0]);
        out.index_list.push_back(mesh->mFaces[k].mIndices[1]);
        out.index_list.push_back(mesh->mFaces[k].mIndices[2]);
    }
    else
    {
        std::cout << "wierd number of indices to a face: " << mesh->mFaces->mNumIndices << std::endl;
    }
}

这样你的 index_list 应该用正确的索引填充。

希望这可以帮助! :)

关于c++ - Assimp Faces 都有索引 (0,1,2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32649449/

相关文章:

c++ - winsock 连接持续多长时间?

c - 为什么不使用fread读取目录文件?

python - 计算文本文件中所需单词的数量

c++ - 缩放 3D 形状(OpenGL 和 C++)

c++ - 删除前是否应该关闭文件?

c++ - Qt 单选按钮在图标下方放置文本

C++ Shell 上下文菜单扩展

AngularJS 函数未通过 ngf-select 触发

c++ - 在光线追踪中对球体进行荒谬的反射

javascript - Three.js 如何在 3D Globe、Three.js 上放置带纬度/经度的标记?