我正在使用Pandas3D 1.10(使用Python 3.6),并且试图动态生成地形。
当前,我能够执行此操作:
现在,我的想法是向该地形添加纹理。我计划为不同种类的地面和生物群落添加不同的纹理,但是当我尝试添加纹理时,它会被添加到整个地形上。
我只想将纹理添加到网格的某些部分,因此我可以组合不同的纹理(污垢,草皮,沙子等)并创建一个更好的地形。
在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.vert
和terrain.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)
输出是相同的。我更改setTextScale
和setTexOffset
的数量都没关系,输出始终都是草。
如何仅在模型的特定部分上实现纹理?
很明显,我可以即时制作图像并使用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)
问题是我无法更改此纹理的位置或其大小。另外,请注意,我不想减小纹理的比例,当我想缩小纹理时,是指“剪切”或“擦除”所有不适合该位置的部分,而不是减少整体纹理大小。
不幸的是,这些命令不起作用:
myTexture.setTexScale(ts, LVecBase2(0.5, 250))
myTexture.setTexOffset(ts, LVecBase2(0.15, 0.5))