Нанести текстуру на определенную часть сетки - PullRequest
0 голосов
/ 11 октября 2018

Я использую Pandas3D 1.10 (с Python 3.6) и пытаюсь создать ландшафт на лету.

В настоящее время я смог выполнить это:

enter image description here

Теперь моя идея - добавить текстуры к этой местности.Я планирую добавить разные текстуры для разных видов грунта и биома, но когда я пытаюсь добавить текстуру, это добавляется на всю местность.

enter image description here

Я хочу добавить текстуру только к определенным частям сетки, чтобы я мог комбинировать различные текстуры (грязь, трава, песок и т. Д.) И улучшать ландшафт.

Из этой документации по 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

Проблема в том, что я не могу изменить ни расположение этой текстуры, ни ее размер.Кроме того, обратите внимание, что я не хочу уменьшать масштаб текстуры, когда я хочу сделать текстуру меньше, я имею в виду «вырезать» или «стереть» все части, которые не помещаются на месте, а не уменьшить общий объем текстуры.размер текстуры.

К сожалению, эти команды не работают:

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