将Wavefront .obj的vt映射到OpenGL纹理坐标

4
一位艺术家朋友给我发送了一个由3DS Max 2009导出的.obj文件,其中包含三个纹理坐标作为vt命令的参数。根据.obj规范,这是正确的。然而,我不确定如何映射提供给常规2D .jpg纹理的U-V-W坐标。
对我来说,这相对重要,因为我一直在尝试通过使用3DS Max来强制导出只有U-V坐标,但似乎没有简单的方法。在这种情况下,这只是一个天空盒,但在其他情况下,它可能是更复杂的东西,无法手动修复。
谢谢!
2个回答

8
在文章什么是UVW映射?中有一节解释如下:

你可能会问为什么在一个二维平面上需要一个深度坐标W。原因之一是,有时候需要能够相对于几何图形翻转地图的方向。为了做到这一点,需要第三个坐标。W坐标也对3D过程材料具有意义。

针对你的情况,你可以忽略W坐标,并且只读取以vt开头的行的前两个浮点数。这样做的前提是你不关心W坐标所占用的额外空间,因为.obj本身就是一种效率低下的文件格式。
我个人不喜欢在OpenGL中使用.obj,因为它提供的是每个面的顶点法线而不是每个顶点的法线。要正确地照明一个对象,必须要么复制顶点,要么通过对面内周围顶点法线求平均值来计算法线。如果您想探索更有效的替代方案,请查看二进制格式,例如详细记录的.md2格式。另外请考虑是否已经使用glDrawElements。

谢谢!我已经在使用顶点数组和显示列表(太少的动画需要),我会将您的答案标记为接受的,只要您编辑一件小事:您关于 .obj 不提供“顶点法线”的说法是错误的 :-) 请看“vn”命令和在“f”中使用顶点法线的用法:您可以针对每个顶点指定一个法线,而不是每个面。在这种情况下,您混淆了 .obj 和 .3ds。此外,我现在暂时选择了 .obj,但稍后我会转换到其他格式。也许我甚至会将 .obj 用作中间格式:这是了解所有细节的另一个原因。 - Ivan Vučica
3
当我使用.obj文件时,发现"vn"条目的数量总是超过"v"条目的数量。导出一个简单的模型并自行检查。这是因为.obj提供每个面的几个法线向量,而每个顶点可以属于不同的面。这意味着一个具有8个顶点的立方体最多可能有24个"vn"条目,每个顶点相邻的面都有一个。要使每个顶点和其法线之间一一对应,您必须进行前面提到的计算。或者,您可以为每个共享面的顶点复制一个顶点,然后使用所有24个"vn"条目。希望这样更清晰明了! - Kai
1
这是给你的一些声誉 :)啊,没错。但是它必须在出现尖锐物体(如立方体)时提供几个法线。我不想让一个被平滑映射的立方体,我想让它被尖锐地映射!这就是OBJ允许你做的事情。对它们进行平均处理是完全错误的方法;所以,是的,你必须复制它们并优化它们(如果你愿意的话)。但是OBJ对OpenGL有问题的真正原因是,你需要为单个面顶点使用多个索引;然而OpenGL不支持这样做。你需要为索引创建索引数组...你看到我的点了吗。这就是让我烦恼的地方;法线是可以的。 - Ivan Vučica
1
是的,我们在同一页面上:D我很高兴不是唯一一个对OpenGL中的.obj格式有些恼火的人,但如果你想要尖锐的边缘,那么这是有道理的。祝你好运! - Kai
@Kai,@Ivan,有没有一种格式可以同时支持OpenGL的锐利和平滑对象,方便使用?我现在只能使用.obj格式,但我仍然很好奇... - Drew Noakes
1
顺便说一句,我认为.obj文件具有平滑组的概念,可以解决你在这里讨论的问题。 - Drew Noakes

3
抱歉如果我误解了您的问题。但是,您不能简单地忽略第三个参数w吗?据我所知,w只是垂直于由u和v描述的平面的平面中的一个坐标,因此对于简单的2d纹理映射来说很少需要它。
希望这可以帮助您。

这也是我理解的方式,但它可能包含更多的语义信息。否则,如果它明显可见是2D映射,像3ds max 2009一样,为什么要导出它呢? - Ivan Vučica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接