我是Godot的新手,但不是OOP的新手。我对一些事情感到困惑,我想这是因为我对节点层次结构总体上缺乏理解:
如果光线跟踪交叉点查找碰撞对象;那么,为什么会产生碰撞对象的父节点呢?它在某种程度上与信号有关吗?
我看了这个例子: https://kidscancode.org/godot_recipes/4.x/3d/shooting_raycasts/index.html (代码位于 https://github.com/godotrecipes/3d_shoot_raycasts. ) 例如,在节点层次中,有一个名为“Ground”的节点,其子节点名为“Ground”,而其子节点的类型为CollisionShape3D。
尽管中间级别的Ground节点的类型为StaticBody3D,这意味着它也是一个CollisionShape3D,但它删除了disable_mode,据我所知,它不参与碰撞和光线投射。
拍摄代码使用光线投射
var collision = space.intersect_ray(query) if collision: $CanvasLayer/Label.text = collision.collider.name
我本以为光线投射碰撞是与CollisionShape3D发生的,但显示的却是“地面”。
发生什么事?
尽管中层Ground节点的类型为StaticBody3D,这意味着它也是一个CollisionShape3D
StaticBody3D 源自 CollisionObject3D , 不 CollisionShape3D A. 碰撞对象3D 必须有一个或多个 碰撞形状3D s作为子节点来描述对象的形状。(这使您可以从多个基本体形状构建复杂的物理形状。)
StaticBody3D
CollisionObject3D
CollisionShape3D
碰撞对象3D
碰撞形状3D
我认为你困惑的根源在于这种区别。多个形状组合在一起形成一个碰撞对象,该碰撞对象(在您的情况下为 StaticBody3D 命名的 Ground )是光线投射作为 collider 。但是,请注意,您可以使用 collision['shape'] 以获得 碰撞形状3D 射线与之相交。
Ground
collider
collision['shape']
它删除了disablemode,据我所知,它不参与碰撞和光线投射。
这个 disable_mode 描述了物理引擎在禁用节点时应该采取的行为,但它实际上并没有禁用节点。因此,在这种情况下,静止物体仍在参与碰撞检测。
disable_mode