Я использую Pandas3D 1.10 (с Python 3.6) и пытаюсь создать ландшафт на лету.
В настоящее время я смог выполнить это:
![enter image description here](https://i.stack.imgur.com/zoUEm.png)
Теперь моя идея - добавить текстуры к этой местности.Я планирую добавить разные текстуры для разных видов грунта и биома, но когда я пытаюсь добавить текстуру, это добавляется на всю местность.
![enter image description here](https://i.stack.imgur.com/VgdJA.png)
Я хочу добавить текстуру только к определенным частям сетки, чтобы я мог комбинировать различные текстуры (грязь, трава, песок и т. Д.) И улучшать ландшафт.
Из этой документации по Panda3D Вы можете увидеть пример того, как сделать ландшафт:
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
.
Iпытался применить это руководство , но кажется, что не работает на 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)
![enter image description here](https://i.stack.imgur.com/0X9TE.png)
Проблема в том, что я не могу изменить ни расположение этой текстуры, ни ее размер.Кроме того, обратите внимание, что я не хочу уменьшать масштаб текстуры, когда я хочу сделать текстуру меньше, я имею в виду «вырезать» или «стереть» все части, которые не помещаются на месте, а не уменьшить общий объем текстуры.размер текстуры.
К сожалению, эти команды не работают:
myTexture.setTexScale(ts, LVecBase2(0.5, 250))
myTexture.setTexOffset(ts, LVecBase2(0.15, 0.5))