1

我正在尝试编写一个小脚本来将纹理应用于矩形长方体。为了实现这一点,我遍历了场景图,并且无论在哪里找到 SoIndexedFaceSet 节点,我都会在其之前插入一个 SoTexture2 节点。我将图像文件放在 SoTexture2 节点中。我面临的问题是纹理正确应用于 YZ 平面中的 2 个面(比如 face1 和 face2),但对于其他 4 个平面,它只是在两个面的边界处拉伸纹理(1和 2)。

它看起来像这样。纹理拉伸

正面是它应该看起来的样子,但正如您所见,在其他两个面上,它只是外推正面的角值。任何想法为什么会发生这种情况以及避免这种情况的任何方法?

4

1 回答 1

0

是的,假设您没有为 SoIndexedFaceSet 指定纹理坐标,这正是预期的行为。

如果 Open Inventor 发现您已将纹理图像应用到几何体并且未指定纹理坐标,它将自动计算一些纹理坐标。当然,不可能猜测您希望如何应用纹理。因此,它计算边界框,然后计算纹理坐标,将纹理拉伸到几何体的最大范围(XY、YZ 或 XZ)。如果几何体是长方体,您可以清楚地看到图像中的效果。这种行为可能很有用,尤其是作为快速近似值。

您需要按照您想要的方式进行这项工作,即显式地将纹理坐标分配给几何体,以便将纹理单独映射到每个面。在 Open Inventor 中,您实际上仍然可以在面之间共享顶点,因为您可以指定不同的顶点索引和纹理坐标索引(当然这对应用程序更方便,因为 OpenGL 不支持这一点,Open Inventor 必须重新内部洗牌数据)。如果您将相同的纹理应用到 SoCube 节点,您会看到纹理按预期分别映射到每个面。这是因为 SoCube 为每个面定义了纹理坐标。

于 2016-06-10T19:37:13.920 回答