CSGShape3D
继承: GeometryInstance3D < VisualInstance3D < Node3D < Node < Object
派生: CSGCombiner3D, CSGPrimitive3D
CSG 基类。
描述
这是 CSG 的基类,为 Godot 中的各种 CSG 节点提供 CSG 运算支持。
性能:CSG 节点仅适用于原型设计,存在显著的 CPU 性能消耗。请考虑将最终的 CSG 运算结果烘焙为静态几何体,替换 CSG 节点。
使用选中 CSG 根节点后显示的编辑器菜单可以将各个 CSG 根节点的结果烘焙为使用静态资源的节点。
使用脚本也可以将各个 CSG 根节点烘焙为静态资源,可视网格请调用 bake_static_mesh(),物理碰撞请调用 bake_collision_shape()。
使用编辑器的 gltf 场景导出器可以将由 CSG 节点构成的整个场景烘焙为静态几何体:场景 > 导出为... > glTF 2.0 场景...
教程
属性
|
||
|
||
|
||
|
||
|
||
|
方法
get_collision_layer_value(layer_number: int) const |
|
get_collision_mask_value(layer_number: int) const |
|
get_meshes() const |
|
is_root_shape() const |
|
void |
set_collision_layer_value(layer_number: int, value: bool) |
void |
set_collision_mask_value(layer_number: int, value: bool) |
枚举
enum Operation: 🔗
Operation OPERATION_UNION = 0
合并两个图元的几何体,移除相交的几何体。
Operation OPERATION_INTERSECTION = 1
仅保留相交的几何,其余的将被移除。
Operation OPERATION_SUBTRACTION = 2
从第一个形状减去第二个形状,留下一个带有其形状的凹痕。
属性说明
bool calculate_tangents = true 🔗
计算允许使用法线贴图的 CSG 形状的切线。仅适用于根形状,该设置在所有子级上均被忽略。设置为 false 可以略微加速形状的生成。
这个区域所处的物理层。
可碰撞的物体可以存在于 32 个不同层中的任何一个。这些层的工作就像一个标签系统,而不是可视化的。一个可碰撞物体可以使用这些层来选择它可以与哪些物体碰撞,使用 collision_mask 属性。
如果对象 A 在对象 B 所扫描的任何层中,或者对象 B 在对象 A 所扫描的任何层中,就会检测到接触。详见文档中的《碰撞层与掩码》。
该 CSG 形状扫描碰撞的物理层。仅当 use_collision 为 true 时有效。有关更多信息,请参阅文档中的《碰撞层与掩码》。
float collision_priority = 1.0 🔗
发生穿透时用于解算碰撞的优先级。仅当 use_collision 为 true 时有效。优先级越高,对对象的穿透力就越低。例如,这可以用来防止玩家突破关卡的边界。
在此形状上执行的操作。对于第一个 CSG 子节点,将忽略此操作,因为操作是在此节点与该节点父级的上一个子级之间进行的。
已弃用: The CSG library no longer uses snapping.
该属性无效。
为我们的 CSG 形状向物理引擎添加碰撞形状。这样行为就始终与静态物体类似。请注意,即使 CSG 形状本身被隐藏,碰撞形状仍处于活动状态。另见 collision_mask 和 collision_priority。
方法说明
ConcavePolygonShape3D bake_collision_shape() 🔗
返回针对该节点 CSG 运算结果烘焙的物理 ConcavePolygonShape3D。如果该节点不是 CSG 根节点或者不包含有效的几何体,则返回空形状。
性能:如果 CSG 运算得到的是包含大量细节的几何体,面数很多,那么物理性能可能非常慢。一般来说,凹面形状应该只用来制作静态关卡几何体,不应用来制作可以移动的动态物体。
注意:CSG 网格数据是延迟更新的,即延迟一个渲染帧后更新。为了避免获取到空形状或过时的网格数据,请确保在 Node._ready() 中使用 bake_collision_shape() 之前,或在更改 CSGShape3D 的属性后,调用 await get_tree().process_frame。
ArrayMesh bake_static_mesh() 🔗
返回该节点 CSG 运算结果烘焙得到的静态 ArrayMesh。相关 CSG 节点的材质会作为额外的网格表面添加。如果该节点不是 CSG 根节点或没有有效的几何体,则返回空网格。
注意:CSG 网格数据是延迟更新的,存在一个渲染帧的更新延迟。要避免获取到空的形状或过时的网格数据,请确保在 Node._ready() 中使用 get_meshes() 之前以及在修改 CSGShape3D 的属性后调用 await get_tree().process_frame。
bool get_collision_layer_value(layer_number: int) const 🔗
返回 collision_layer 中是否启用了指定的层,给定的 layer_number 应在 1 和 32 之间。
bool get_collision_mask_value(layer_number: int) const 🔗
返回 collision_mask 中是否启用了指定的层,给定的 layer_number 应在 1 和 32 之间。
返回一个包含两个元素的 Array,第一个元素是该节点的 Transform3D,第二个元素是该节点的根 Mesh。仅在该节点为根形状时有效。
注意:CSG 网格数据是延迟更新的,存在一个渲染帧的更新延迟。要避免获取到空的形状或过时的网格数据,请确保在 Node._ready() 中使用 get_meshes() 之前以及在修改 CSGShape3D 的属性后调用 await get_tree().process_frame。
如果这是根形状,因此是渲染的对象,则返回 true。
void set_collision_layer_value(layer_number: int, value: bool) 🔗
根据 value,启用或禁用 collision_layer 中指定的层,给定的 layer_number 应在 1 和 32 之间。
void set_collision_mask_value(layer_number: int, value: bool) 🔗
根据 value,启用或禁用 collision_mask 中指定的层,给定的 layer_number 应在 1 和 32 之间。