代码之家  ›  专栏  ›  技术社区  ›  rantash68

Godot新手对光线投射中的节点层次结构感到困惑

  •  -1
  • rantash68  · 技术社区  · 3 年前

    我是Godot的新手,但不是OOP的新手。我对一些事情感到困惑,我想这是因为我对节点层次结构总体上缺乏理解:

    如果光线跟踪交叉点查找碰撞对象;那么,为什么会产生碰撞对象的父节点呢?它在某种程度上与信号有关吗?

    我看了这个例子: https://kidscancode.org/godot_recipes/4.x/3d/shooting_raycasts/index.html (代码位于 https://github.com/godotrecipes/3d_shoot_raycasts. ) 例如,在节点层次中,有一个名为“Ground”的节点,其子节点名为“Ground”,而其子节点的类型为CollisionShape3D。

    hierarchy

    尽管中间级别的Ground节点的类型为StaticBody3D,这意味着它也是一个CollisionShape3D,但它删除了disable_mode,据我所知,它不参与碰撞和光线投射。

    inspector of Ground StaticBody3D

    拍摄代码使用光线投射

        var collision = space.intersect_ray(query)
        if collision:
            $CanvasLayer/Label.text = collision.collider.name
    

    我本以为光线投射碰撞是与CollisionShape3D发生的,但显示的却是“地面”。

    collider name

    发生什么事?

    1 回复  |  直到 3 年前
        1
  •  1
  •   0x5453 Yuki    3 年前

    尽管中层Ground节点的类型为StaticBody3D,这意味着它也是一个CollisionShape3D

    StaticBody3D 源自 CollisionObject3D , CollisionShape3D A. 碰撞对象3D 必须有一个或多个 碰撞形状3D s作为子节点来描述对象的形状。(这使您可以从多个基本体形状构建复杂的物理形状。)

    我认为你困惑的根源在于这种区别。多个形状组合在一起形成一个碰撞对象,该碰撞对象(在您的情况下为 StaticBody3D 命名的 Ground )是光线投射作为 collider 。但是,请注意,您可以使用 collision['shape'] 以获得 碰撞形状3D 射线与之相交。

    它删除了disablemode,据我所知,它不参与碰撞和光线投射。

    这个 disable_mode 描述了物理引擎在禁用节点时应该采取的行为,但它实际上并没有禁用节点。因此,在这种情况下,静止物体仍在参与碰撞检测。

    推荐文章
    user193464  ·  Godot键盘事件
    9 年前