【问题标题】:Assimp Faces all have indices (0,1,2)Assimp Faces 都有索引 (0,1,2)
【发布时间】:2015-12-15 10:49:58
【问题描述】:

我正在使用 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...

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

【问题讨论】:

    标签: c++ file 3d loading assimp


    【解决方案1】:

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

    mesh-&gt;mFace 是一个指向 first 的指针aiFaces 的数组元素。

    您的(第一个)代码没有考虑变量 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 应该填充正确的索引。

    希望这可以帮助! :)

    【讨论】:

    • @Illiander 我的回答有帮助吗?您已经找到解决方案了吗?
    【解决方案2】:

    mFaces 是一个数组...即,一个指针。 执行 mFaces->mIndices 就像执行 mFaces[0]->mIndices。

    这就是为什么你得到相同的索引...

    【讨论】:

      猜你喜欢
      • 2013-07-21
      • 2018-05-26
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 2021-05-11
      • 2018-03-05
      相关资源
      最近更新 更多