我一直在使用Assimp,现在我正在尝试加载.obj文件。它加载完美,但我想在加载后操纵面部数据。
基本上我在简单的cube.obj文件中有这个(完整文件 - http://pastebin.com/ha3VkZPM)
# 8 Vertices
v -1.0 -0.003248 1.0
v 1.0 -0.003248 1.0
v -1.0 1.996752 1.0
v 1.0 1.996752 1.0
v 1.0 -0.003248 -1.0
v -1.0 -0.003248 -1.0
v 1.0 1.996752 -1.0
v -1.0 1.996752 -1.0
# 36 Texture Coordinates
vt 1.0 0.0
vt 0.0 0.0
...
# 36 Vertex Normals
vn 0.0 0.0 1.0
vn 0.0 0.0 1.0
...
f 1/1/1 2/2/2 3/3/3
f 2/4/4 4/5/5 3/6/6
f 5/7/7 6/8/8 7/9/9
f 6/10/10 8/11/11 7/12/12
f 3/13/13 6/14/14 1/15/15
f 3/16/16 8/17/17 6/18/18
f 7/19/19 2/20/20 5/21/21
f 7/22/22 4/23/23 2/24/24
f 3/25/25 7/26/26 8/27/27
f 3/28/28 4/29/29 7/30/30
f 2/31/31 6/32/32 5/33/33
f 2/34/34 1/35/35 6/36/36
据我所知,面部入口是V / T / N(顶点指数,tex坐标指数和正常指数)。
所以
f 1/1/1 2/2/2 3/3/3
表示顶点三角形(1,2,3) - 右?
从这个面部条目 - 我想只提取顶点索引。
现在进入Assimp - 我现在有了这个 - Indices
是一个stl :: vector
for (uint32 i = 0; i < pMesh->mNumFaces; i++) {
const aiFace& Face = pMesh->mFaces[i];
if(Face.mNumIndices == 3) {
Indices.push_back(Face.mIndices[0]);
Indices.push_back(Face.mIndices[1]);
Indices.push_back(Face.mIndices[2]);
}
以下是pMesh->mNumFace = 12
的值 - 所以这是正确的。
(for 1st face)
Face.mindices[0] should probably point to 1/1/1
Face.mindices[1] should probably point to 2/2/2
Face.mindices[2] should probably point to 3/3/3
现在我如何只提取顶点索引?当我检查Face.mIndices[0] its index as 0,1,2...respectively.
为什么这样的值? Assimp Faces all have indices (0,1,2)
我在Google和StackOverflow上搜索过 - 这里有一些类似的问题,但我似乎无法弄明白。
Assimp and D3D model loading: Mesh not being displayed in D3D
Assimp not properly loading indices
如果您需要更多信息,请与我们联系。感谢。
答案 0 :(得分:1)
OpenGL和DirectX使用稍微不同的方法来索引顶点数据,然后使用obj格式。与可以对位置/ texcoords等使用不同索引的文件格式相比,图形卡需要一个单个索引缓冲区用于整个顶点。
该说法:Assimp传递obj格式并将其转换为单索引缓冲区表示。基本上这意味着,当indexbuffer指向这个新的顶点列表时,每个唯一的vertex-texcoord-normal组合将给出一个顶点。
据我所知,使用Assimp无法访问原始索引。