Godot 4.1中如何获取3D鼠标位置?intersect_ray()参数异常求助
在Godot 4.1中获取3D鼠标位置的正确方法
Godot 4.x 版本里 intersect_ray() 的API确实发生了变更,不再直接接收起点、终点两个参数,而是需要通过 PhysicsRayQueryParameters3D 对象来定义射线的各项属性。以下是具体实现步骤和代码示例:
核心逻辑
- 获取视口内的2D鼠标位置
- 通过相机将2D鼠标位置转换为3D射线的起点和方向
- 构造射线检测参数并执行检测,最终得到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
相关产品推荐
相关产品推荐

