我从搅拌机导出了一个 .obj 以加载到我正在编写的 C++ 程序中 一切都很好,但我想知道在解析面部时我注意到面部数据的第三点上有一个未使用的纹理坐标。
f 1/1 2/2 3/3
//f 1/s 2/t 3/? Its vt3 that is the coordinate in question
这是干什么用的?我应该保留它吗?
我认为您对 obj 文件格式略有误解,并且对 3D 和 2D 坐标的混合感到困惑。
三角形实际上有 3 个纹理坐标,就像它们有 3 个位置一样。这是正确的、预期的,甚至是必需的。如果三角形上的两个点具有纹理坐标,但其中一个没有纹理坐标,这将是没有意义的。
定义一个面,在这种f
情况下具有三个顶点(三角形)。每个顶点都有一个 3D 位置和一个 2D UV 坐标。这意味着一个三角形由 3 个 3D 位置和 3 个 2D UV 坐标(每个顶点一组)组成。面数索引到顶点位置和纹理坐标的数组,而不是构成这些结构的单个元素。
符号实际上看起来像这样。
f v1/vt1 v2/vt2 v3/vt3
阅读这些以获取更多详细信息:
http://www.eg-models.de/formats/Format_Obj.html http://www.cs.cmu.edu/~mbz/personal/graphics/obj.html
这可以通过考虑代码中的三角形结构来更好地可视化,例如:
struct
{
Vec2 texCoord; // one vt for each vertex (s,t)
Vec3 position; // one v for each vertex (x,y,z)
} Vertex;
struct
{
Vertex verts[3]; // 3 vertices
} Face;