You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Godot中如何实例化场景并使其仅朝向X或Z方向,禁止Y轴旋转?

问题根因

  • 操作顺序错误:你在将墙添加为muzzle子节点之前调用了look_at,此时look_at计算的是全局空间朝向,添加到muzzle下后,墙的变换会继承muzzle的局部偏移,之前设置的朝向就会错乱。子弹逻辑无异常是因为子弹生成后通常会在运动逻辑中脱离父节点、使用全局坐标移动,父节点的变换不会对其生效。
  • 未限制轴向旋转:默认的look_at会根据目标点的高度差计算俯仰角,导致墙出现非水平方向的旋转,不符合墙始终垂直地面的需求。

修复代码

if Input.is_action_just_pressed("light_attack"):
    var b = bullet.instance()
    muzzle.add_child(b)
    b.look_at(aimcast.get_collision_point(), Vector3.UP)
    b.shoot = true
    print(aimcast.get_collision_point())
if Input.is_action_just_pressed("block"):
    var w = wall.instance()
    # 先将墙加入场景树,后续变换计算基于正确的父节点空间
    muzzle.add_child(w)
    # 如果你需要墙正面朝向相机,直接取相机全局位置作为朝向目标
    var target_pos = get_viewport().get_camera_3d().global_position
    # 抹平Y轴坐标差,完全禁止上下方向的俯仰旋转,保证墙始终垂直地面
    target_pos.y = w.global_position.y
    # 使用全局look_at保证朝向正确
    w.global_look_at(target_pos, Vector3.UP)
    w.summon = true

可选调整

  • 如果你需要墙正面朝向瞄准点(挡在你和瞄准目标之间),只需要把target_pos的赋值替换为aimcast.get_collision_point()即可,Y轴抹平逻辑不需要修改。
  • 如果你确实需要完全禁止墙绕Y轴旋转,在global_look_at之后加一行w.rotation.y = 0即可。

内容的提问来源于stack exchange,提问作者Spiro Cromwell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 18:27:04