Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

GPUParticlesCollisionHeightField3D

继承: GPUParticlesCollision3D < VisualInstance3D < Node3D < Node < Object

影响 GPUParticles3D 节点的实时高度图形状 3D 粒子碰撞形状。

描述

影响 GPUParticles3D 节点的实时高度图形状的 3D 粒子碰撞形状。

高度图形状允许有效地表示凸面和凹面对象与单个“地板”(例如地形)的碰撞。它不如 GPUParticlesCollisionSDF3D 灵活,但不需要烘焙步骤。

也可以在移动时、相机移动时、甚至连续时,实时重新生成 GPUParticlesCollisionHeightField3D。这对雨雪等天气效果、以及具有高度动态几何体的游戏来说,GPUParticlesCollisionHeightField3D 是一个不错的选择。但是,该类有限制,因为高度图无法表示悬垂(例如室内或洞穴)。

注意:GPUParticles3D 的处理材质上,ParticleProcessMaterial.collision_mode 必须为 true,才能使碰撞生效。

注意:粒子碰撞只影响 GPUParticles3D,不影响 CPUParticles3D

属性

bool

follow_camera_enabled

false

int

heightfield_mask

1048575

Resolution

resolution

2

Vector3

size

Vector3(2, 2, 2)

UpdateMode

update_mode

0

方法

bool

get_heightfield_mask_value(layer_number: int) const

void

set_heightfield_mask_value(layer_number: int, value: bool)


枚举

enum Resolution: 🔗

Resolution RESOLUTION_256 = 0

生成 256×256 的高度图。适用于小规模场景,或没有远景粒子的较大场景。

Resolution RESOLUTION_512 = 1

生成 512×512 的高度图。适用于中等规模的场景,或没有远景粒子的较大场景。

Resolution RESOLUTION_1024 = 2

生成 1024×1024 的高度图。适用于具有远景粒子的大型场景。

Resolution RESOLUTION_2048 = 3

生成 2048×2048 的高度图。适用于具有远景粒子的非常大的场景。

Resolution RESOLUTION_4096 = 4

生成 4096×4096 的高度图。适用于具有远景粒子的巨大场景。

Resolution RESOLUTION_8192 = 5

生成 8192×8192 的高度图。适用于具有远景粒子的巨大场景。

Resolution RESOLUTION_MAX = 6

代表 Resolution 枚举的大小。


enum UpdateMode: 🔗

UpdateMode UPDATE_MODE_WHEN_MOVED = 0

仅在 GPUParticlesCollisionHeightField3D 节点移动时,或者当 follow_camera_enabledtrue 且相机移动时,更新高度图。可以通过向任意方向稍微移动 GPUParticlesCollisionHeightField3D 或者调用 RenderingServer.particles_collision_height_field_update() 来强制更新。

UpdateMode UPDATE_MODE_ALWAYS = 1

每帧更新高度图。这具有显著的性能成本。只有当粒子可以碰撞的几何体在游戏过程中发生显著变化时,才应使用该更新选项。


属性说明

bool follow_camera_enabled = false 🔗

  • void set_follow_camera_enabled(value: bool)

  • bool is_follow_camera_enabled()

如果为 true,则 GPUParticlesCollisionHeightField3D 将在全局空间中跟随当前相机。GPUParticlesCollisionHeightField3D 不需要是该 Camera3D 节点的子节点也能工作。

跟随相机会有性能成本,因为它会在相机移动时强制更新高度图。如果 follow_camera_enabledtrue,请考虑降低 resolution 以提高性能。


int heightfield_mask = 1048575 🔗

  • void set_heightfield_mask(value: int)

  • int get_heightfield_mask()

更新高度图时要考虑的可视层。高度图碰撞更新中只会包含 VisualInstance3D.layersheightfield_mask 匹配的 MeshInstance3D。默认情况下,更新高度图碰撞时会考虑全部 20 个用户可见层。

注意:由于 heightfield_mask 总共能够存储 32 个层,还有 12 个层是仅限引擎内部使用的,未在编辑器中暴露。通过脚本设置 heightfield_mask 就可以开关这些保留的层,适用于编辑器插件。

脚本中可以使用 get_heightfield_mask_value()set_heightfield_mask_value() 更方便地调整 heightfield_mask


Resolution resolution = 2 🔗

更高的分辨率可以更准确地表示大场景中的小细节,但会降低性能。如果 update_modeUPDATE_MODE_ALWAYS,请考虑使用可能的最低分辨率。


Vector3 size = Vector3(2, 2, 2) 🔗

碰撞高度图的 3D 单位大小。为了提高高度图质量,size 应被设置得尽可能小,同时覆盖需要的场景部分。


UpdateMode update_mode = 0 🔗

生成的高度图的更新策略。


方法说明

bool get_heightfield_mask_value(layer_number: int) const 🔗

如果启用了 heightfield_mask 中的指定层,则返回 true,给定的 layer_number120 之间,包括端点。


void set_heightfield_mask_value(layer_number: int, value: bool) 🔗

根据 value 启用或禁用 heightfield_mask 中的指定层,给定的 layer_number120 之间,包括端点。