纹理在Open Inventor中伸展在长方体的面上

时间:2015-03-06 13:07:05

标签: texture-mapping openinventor coin3d

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

它看起来像这样。 Texture Stretching

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

1 个答案:

答案 0 :(得分:0)

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

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

使您按照自己的方式工作所需要的是明确地将纹理坐标指定给几何体,以便将纹理分别映射到每个面。在Open Inventor中,您实际上仍然可以共享面之间的顶点,因为您可以指定不同的顶点索引和纹理坐标索引(当然这对应用程序来说更方便,因为OpenGL不支持这个并且Open Inventor必须在内部重新调整数据)。如果将相同的纹理应用于SoCube节点,您将看到纹理按预期分别映射到每个面。这是因为SoCube定义了每个面的纹理坐标。