在网格的特定部分上应用纹理

时间:2018-10-11 00:17:48

标签: python-3.x panda3d

我正在使用Pandas3D 1.10(使用Python 3.6),并且试图动态生成地形。

当前,我能够执行此操作:

enter image description here

现在,我的想法是向该地形添加纹理。我计划为不同种类的地面和生物群落添加不同的纹理,但是当我尝试添加纹理时,它会被添加到整个地形上。

enter image description here

我只想将纹理添加到网格的某些部分,因此我可以组合不同的纹理(污垢,草皮,沙子等)并创建一个更好的地形。

this Panda3D documentation中,您可以看到如何制作地形的示例:

from panda3d.core import ShaderTerrainMesh, Shader, load_prc_file_data

# Required for matrix calculations
load_prc_file_data("", "gl-coordinate-system default")

# ...

terrain_node = ShaderTerrainMesh()
terrain_node.heightfield_filename = "heightfield.png"  # This must be in gray scale, also you can make an image with PNMImage() with code.
terrain_node.target_triangle_width = 10.0
terrain_node.generate()

terrain_np = render.attach_new_node(terrain_node)
terrain_np.set_scale(1024, 1024, 60)

terrain_np.set_shader(Shader.load(Shader.SL_GLSL, "terrain.vert", "terrain.frag"))

在该链接中,还提供了terrain.vertterrain.frag的示例。

我尝试申请this guide,但似乎不适用于ShaderMeshTerrain,或者我认为。

ts = TextureStage('ts')
myTexture = loader.loadTexture("textures/Grass.png")
terrain_np.setTexture(ts, myTexture)
terrain_np.setTexScale(ts, 10, 10)
terrain_np.setTexOffset(ts, -25, -25)

输出是相同的。我更改setTextScalesetTexOffset的数量都没关系,输出始终都是草。

如何仅在模型的特定部分上实现纹理?

很明显,我可以即时制作图像并使用PNMImage()进行所有修改,但是它会很慢而且很困难,而且我非常确信不用重新制作纹理就可以做到这一点。每次。

编辑

我发现我可以这样做只是为了将纹理放置在某个地方:

ts = TextureStage('ts')
myTexture = loader.loadTexture("textures/Grass.png")
myTexture.setWrapU(Texture.WM_border_color)
myTexture.setWrapV(Texture.WM_border_color)
myTexture.setBorderColor(VBase4(0, 0, 0, 0))
terrain_np.setTexture(ts, myTexture)

enter image description here

问题是我无法更改此纹理的位置或其大小。另外,请注意,我不想减小纹理的比例,当我想缩小纹理时,是指“剪切”或“擦除”所有不适合该位置的部分,而不是减少整体纹理大小。

不幸的是,这些命令不起作用:

myTexture.setTexScale(ts, LVecBase2(0.5, 250))
myTexture.setTexOffset(ts, LVecBase2(0.15, 0.5))

0 个答案:

没有答案
相关问题