Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么assimp无法生成切线?_C++_Opengl_Assimp - Fatal编程技术网

C++ 为什么assimp无法生成切线?

C++ 为什么assimp无法生成切线?,c++,opengl,assimp,C++,Opengl,Assimp,我正在使用Assimp加载一个模型以在OpenGL中渲染(该模型是斯坦福兔子的.obj,只有顶点位置信息,没有纹理坐标或法线)。我设置了后处理标志,以便Assimp生成平滑法线并计算切线/双切线。然而,虽然我可以很好地访问法线数组,但当我尝试访问切线数组时,我会得到一个segfault 以下是我用来读取文件的代码,以及我所有的后处理标志: const aiScene* scene = importer.ReadFile(filename, aiProcess_JoinIdenticalV

我正在使用Assimp加载一个模型以在OpenGL中渲染(该模型是斯坦福兔子的.obj,只有顶点位置信息,没有纹理坐标或法线)。我设置了后处理标志,以便Assimp生成平滑法线并计算切线/双切线。然而,虽然我可以很好地访问法线数组,但当我尝试访问切线数组时,我会得到一个segfault

以下是我用来读取文件的代码,以及我所有的后处理标志:

const aiScene* scene = importer.ReadFile(filename,
    aiProcess_JoinIdenticalVertices |
    aiProcess_Triangulate |
    aiProcess_GenSmoothNormals |
    aiProcess_CalcTangentSpace |
    //aiProcess_RemoveComponent (remove colors) |
    aiProcess_LimitBoneWeights |
    aiProcess_ImproveCacheLocality |
    aiProcess_RemoveRedundantMaterials |
    aiProcess_GenUVCoords |
    aiProcess_SortByPType |
    aiProcess_FindDegenerates |
    aiProcess_FindInvalidData |
    aiProcess_FindInstances |
    aiProcess_ValidateDataStructure |
    aiProcess_OptimizeMeshes |
    aiProcess_OptimizeGraph |
    aiProcess_Debone |
    0);
这里是我撞车的地方:

vert.normal.x = mesh->mNormals[j].x; // This runs fine
vert.normal.y = mesh->mNormals[j].y;
vert.normal.z = mesh->mNormals[j].z;

vert.tangent.x = mesh->mTangents[j].x; // I crash here
vert.tangent.y = mesh->mTangents[j].y;
vert.tangent.z = mesh->mTangents[j].z;
显然,它无法创建切线,即使我告诉它


我尝试在读取文件和其他步骤完成后使用
importer.ApplyPostProcessing()
计算切线,因此它有法线来计算切线,但我得到了相同的结果。

通常需要纹理坐标来生成切线向量。如果无法将法线贴图映射到网格上,为什么需要切线空间基?这就解释了。Assimp的手册只说它需要法线,而不是纹理坐标,所以我想知道为什么它不起作用。要计算切线,需要三角形位置和三角形纹理坐标。