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

Godot 4.1中如何获取3D鼠标位置?intersect_ray()参数异常求助

在Godot 4.1中获取3D鼠标位置的正确方法

Godot 4.x 版本里 intersect_ray() 的API确实发生了变更,不再直接接收起点、终点两个参数,而是需要通过 PhysicsRayQueryParameters3D 对象来定义射线的各项属性。以下是具体实现步骤和代码示例:

核心逻辑

  1. 获取视口内的2D鼠标位置
  2. 通过相机将2D鼠标位置转换为3D射线的起点和方向
  3. 构造射线检测参数并执行检测,最终得到3D空间中的对应点

代码示例

func _process(delta):
    # 获取视口内的2D鼠标坐标
    var mouse_2d_pos = get_viewport().get_mouse_position()
    
    # 获取场景中的相机节点(替换为你的相机路径)
    var camera = get_node("Camera3D")
    # 将2D鼠标位置转换为3D射线的起点和方向
    var ray_origin = camera.project_ray_origin(mouse_2d_pos)
    var ray_direction = camera.project_ray_normal(mouse_2d_pos)
    
    # 构造射线检测参数
    var ray_params = PhysicsRayQueryParameters3D.new()
    ray_params.from = ray_origin
    # 设置射线长度,根据场景大小调整数值
    ray_params.to = ray_origin + ray_direction * 1000.0
    # 设置碰撞层,和场景中物体的碰撞层对应
    ray_params.collision_mask = 1
    
    # 执行射线检测
    var space_state = get_world_3d().direct_space_state
    var hit_result = space_state.intersect_ray(ray_params)
    
    # 处理检测结果
    if hit_result:
        # 碰撞到物体时,获取碰撞点的3D坐标
        var hit_3d_pos = hit_result["position"]
        print("3D鼠标碰撞位置:", hit_3d_pos)
    else:
        # 未碰撞到物体时,取射线终点作为3D位置
        var ray_end_pos = ray_origin + ray_direction * 1000.0
        print("3D鼠标射线终点位置:", ray_end_pos)

补充说明

  • 如果不需要碰撞检测,仅需获取射线延长线上的点,直接计算 ray_origin + ray_direction * 自定义长度 即可
  • 调整射线长度(示例中的1000.0)以适配你的场景规模
  • collision_mask 需与场景中目标物体的碰撞层匹配,避免检测到无关物体

内容的提问来源于stack exchange,提问作者Harald dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 11:47:35