HeightMapShape3D

Наследует: Shape3D < Resource < RefCounted < Object

Трехмерная карта высот, используемая для моделирования физических столкновений.

Описание

Трехмерная карта высот, предназначенная для использования в физике в качестве формы для CollisionShape3D. Этот тип чаще всего используется для ландшафта с вершинами, расположенными в сетке фиксированной ширины.

Карта высот представлена в виде двумерной сетки значений высот, которые представляют положение точек сетки по оси Y. Точки сетки расположены на расстоянии 1 единицы друг от друга по осям X и Z, а сетка центрирована в начале координат узла CollisionShape3D. Внутри каждый квадрат сетки разделен на два треугольника.

Из-за особенностей карты высот ее нельзя использовать для моделирования нависаний или пещер, что потребовало бы наличия нескольких вершин в одном и том же вертикальном положении. Проемы можно проделать через столкновение, присвоив @GDScript.NAN высоте нужных вершин (это поддерживается как в GodotPhysics3D, так и в Jolt Physics). Затем можно вставлять сетки с собственными отдельными коллизиями для создания нависающих элементов, пещер и так далее.

Производительность: HeightMapShape3D быстрее проверяет коллизии, чем ConcavePolygonShape3D, но значительно медленнее, чем примитивные формы, такие как BoxShape3D.

Форму коллизии карты высот также можно создать, используя ссылку на Image:

var heightmap_texture = ResourceLoader.load("res://heightmap_image.exr")
var heightmap_image = heightmap_texture.get_image()
heightmap_image.convert(Image.FORMAT_RF)

var height_min = 0.0
var height_max = 10.0

update_map_data_from_image(heightmap_image, height_min, height_max)

Примечание: Если вам нужно использовать интервал, отличный от 1 единицы, вы можете настроить Node3D.scale фигуры. Однако имейте в виду, что GodotPhysics3D не поддерживает неравномерное масштабирование: вам потребуется масштабировать ось Y на ту же величину, что и оси X и Z, а это значит, что значения в map_data должны быть предварительно масштабированы на величину, обратную этому масштабу. Также обратите внимание, что GodotPhysics3D вообще не поддерживает масштабирование для динамических тел (то есть, незамороженных узлов RigidBody3D); чтобы использовать масштабированный HeightMapShape3D с ними, вам потребуется использовать Jolt Physics.

Свойства

PackedFloat32Array

map_data

PackedFloat32Array(0, 0, 0, 0)

int

map_depth

2

int

map_width

2

Методы

float

get_max_height() const

float

get_min_height() const

void

update_map_data_from_image(image: Image, height_min: float, height_max: float)


Описания свойств

PackedFloat32Array map_data = PackedFloat32Array(0, 0, 0, 0) 🔗

Данные карты высот. Размер массива должен быть равен map_width умноженному на map_depth.

Note: The returned array is copied and any changes to it will not update the original property value. See PackedFloat32Array for more details.


int map_depth = 2 🔗

  • void set_map_depth(value: int)

  • int get_map_depth()

Количество вершин в глубине карты высот. Изменение этого параметра приведет к изменению размера map_data.


int map_width = 2 🔗

  • void set_map_width(value: int)

  • int get_map_width()

Количество вершин в ширине карты высот. Изменение этого параметра приведет к изменению размера map_data.


Описания метода

float get_max_height() const 🔗

Возвращает наибольшее значение высоты, найденное в map_data. Пересчитывает только при изменении map_data.


float get_min_height() const 🔗

Возвращает наименьшее значение высоты, найденное в map_data. Пересчитывает только при изменении map_data.


void update_map_data_from_image(image: Image, height_min: float, height_max: float) 🔗

Обновляет map_data данными, считанными из ссылки Image. Автоматически изменяет размер карты высот map_width и map_depth для соответствия полной ширине и высоте изображения.

Изображение должно быть в Image.FORMAT_RF (32 бита), Image.FORMAT_RH (16 бит) или Image.FORMAT_R8 (8 бит).

Каждый пиксель изображения считывается как число с плавающей точкой в диапазоне от 0.0 (черный пиксель) до 1.0 (белый пиксель). Это значение диапазона переназначается на height_min и height_max для формирования окончательного значения высоты.

Примечание: Рекомендуется использовать карту высот с 16-битными или 32-битными данными, сохраненными в формате EXR или HDR. Использование 8-битных данных о высоте или формата, подобного PNG, который Godot импортирует как 8-битный, приведет к созданию террасного рельефа.