【问题标题】:Mapping Wavefront .obj's vt to OpenGL texture coordinates将 Wavefront .obj 的 vt 映射到 OpenGL 纹理坐标
【发布时间】:2010-10-29 16:57:43
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: opengl 3d .obj wavefront


    【解决方案1】:

    What Is UVW Mapping? 文章中有一段解释:

    您可能会质疑为什么需要 深度坐标,如 2D 的 W 飞机。一个原因是因为它是 有时对能够翻转很有用 地图的方向,相对于 它的几何形状。为此,您需要 第三坐标。 W坐标 也有 3 维的含义 程序材料。

    在您的情况下,您可以简单地忽略 W 坐标,只读取以 vt 开头的行的前两个浮点数。这假设您不太担心 W 坐标占用的额外空间,因为 .obj 是一种效率很低的文件格式。

    我个人不喜欢在 OpenGL 中使用 .obj,因为它为每个面而不是每个顶点提供顶点法线。要正确照亮对象,您必须复制顶点或通过平均面中周围的顶点法线来计算法线。如果您想探索更有效的替代方案,请查看二进制格式,例如完整记录的 .md2 格式。如果您还没有使用 glDrawElements,也可以考虑使用它。

    【讨论】:

    • 谢谢!我已经在使用顶点数组+显示列表(空间模拟需要很少的动画)。只要您编辑一件小事,我就会将您的答案标记为已接受:您对 .obj 不提供 VERTEX NORMALS 是错误的 :-) 请参阅“vn”命令和“f”中顶点法线的用法:您指定每个顶点的法线,而不是每个面。在这种情况下,您将 .obj 与 .3ds 混合在一起。此外,我现在将使用 .obj,但稍后我将过渡到其他内容。也许我什至会使用 .obj 作为中间格式:了解它所有细节的另一个原因。
    • 当我使用 .obj 文件时,我发现“vn”条目的数量总是超过“v”条目的数量。导出一个简单的模型并自己检查。这是因为 .obj 为不同面的每个顶点提供了多个法线。这意味着一个 8 个顶点的立方体最多可以有 24 个“vn”条目,一个用于每个顶点的相邻面。要与顶点及其法线一一对应,您必须进行我之前提到的计算。或者,您可以为它共享的每个面复制一个顶点,然后使用所有 24 个“vn”条目。我希望这更清楚!
    • 这是给你的一些声誉 :) 是的,没错。但它必须提供几个法线以防尖锐物体,例如立方体。我不希望一个立方体被平滑地映射,我希望它被清晰地映射!这就是 OBJ 允许您做的事情。将它们平均是一种完全错误的方法。所以是的,你必须复制它们并优化它们(如果你愿意的话)。但是 OBJ 对 OpenGL 有问题的真正原因是您需要为单个面顶点提供多个索引;然而 OpenGL 不支持这一点。您需要用于索引的索引数组...您明白我的意思。这就是让我烦恼的地方;法线没问题
    • 是的,我们在同一页上 :D 我很高兴我不是唯一一个对 Open GL 中的 .obj 格式有些恼火的人,但如果锋利的边缘是你想要什么那么它是有道理的。祝你好运!
    • 顺便说一句,我认为 .obj 文件具有平滑组的概念,以解决您在此处讨论的问题。
    【解决方案2】:

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

    希望这会有所帮助。

    【讨论】:

    • 我也是这么理解的,不过可能包含更多的语义信息。否则,如果像 3ds max 2009 那样清晰可见它是 2D 映射,为什么还要导出它?
    猜你喜欢
    • 2014-04-23
    • 1970-01-01
    • 2012-02-08
    • 2011-07-31
    • 2013-09-06
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多