2009-05-28 121 views
4

艺术家朋友向我发送了一个由3DS Max 2009导出的.obj文件,其中包含三个纹理坐标作为vt命令的参数。根据.obj规范,这是正确的。但是,我不确定如何映射为常规2D .jpg纹理提供的U-V-W坐标。将Wavefront .obj的vt映射到OpenGL纹理坐标

这对我来说比较重要,因为我已经玩过3DS Max试图找出如何强制它导出U-V坐标,但似乎没有直接的方法。在这种情况下,这只是一个天空盒,但在其他情况下,它可能更复杂一些,而不是手动修复。

谢谢!

回答

8

有解释的文章What Is UVW Mapping?在一节:

你可能会问,为什么你需要一个 深度坐标像W代表一个二维平面 。原因之一是因为 有时可以将 翻转为地图的方向,相对于 其几何。要做到这一点,你需要第三个坐标 。 W坐标 对于三维 程序性材料也有意义。

在你的情况,你可以简单地忽略在W协调和只读与vt开头的行的前两个浮动。这假定你不担心W坐标所占用的额外空间,因为.obj是一个相当低效的文件格式。

就我个人而言,我不喜欢在OpenGL中使用.obj,因为它提供了每个人脸而不是每个顶点的顶点法线。要正确点亮对象,必须重复顶点或通过平均周围的顶点法线来计算法线。如果您想探索更高效的替代方案,请查看二进制格式,例如彻底记录的.md2格式。如果您尚未使用glDrawElements,请考虑使用glDrawElements。

+0

谢谢!我正在使用顶点数组+显示列表(空间模拟需要很少的动画)。只要你编辑一个小东西,我就会将你的答案标记为已接受:你错在于.obj不提供VERTEX NORMALS :-)参见“v”命令和在“f”中使用顶点法线:你指定每个顶点的法线,而不是每个面。在这种情况下,你将.obj与.3ds混合在一起。此外,我现在要与.obj一起,但稍后我会进行其他转换。也许我甚至会使用.obj作为中间格式:另一个理解它的所有细节的理由。 – 2009-06-02 09:40:36

3

对不起,如果我误解你的问题。但是你不能简单地忽略第三个参数w? 据我所知,w只是一个与u和v描述的平面垂直的平面中的坐标,所以它对于简单的2d纹理映射很少需要。

希望这有助于。

+0

这也是我理解它的方式,但是它可能包含更多的语义信息。否则,为什么要导出它,如果它清晰可见,那么它就是2D映射,就像3ds max 2009一样? – 2009-05-31 16:56:31