📜  godot 获取鼠标位置光线投射 (1)

📅  最后修改于: 2023-12-03 14:41:33.051000             🧑  作者: Mango

Godot 获取鼠标位置光线投射

在Godot中,我们可以使用内置的函数获取当前鼠标在场景中的位置,并通过光线投射来获取它所在的3D空间位置。

获取鼠标在场景中的位置

Godot提供了get_local_mouse_position()函数来获取当前鼠标在场景中的位置。该函数返回一个Vector2对象,表示鼠标在局部坐标系中的位置。我们通常需要将其转换为世界坐标系中的位置才能进行光线投射。

# 返回鼠标在局部坐标系中的位置
var mouse_pos = get_local_mouse_position()

# 将局部坐标系转换为世界坐标系
mouse_pos = $Camera.get_global_transform().xform(mouse_pos) 

上述代码中,我们首先使用get_local_mouse_position()函数获取鼠标在局部坐标系中的位置。然后,我们使用场景中的相机节点$Camera来将它转换为世界坐标系中的位置。get_global_transform()返回相机节点的全局变换,xform()函数将局部坐标系中的位置转换为世界坐标系中的位置。

进行光线投射

Godot提供了get_viewport_ray()函数来返回一条从相机到指定2D屏幕坐标的光线。我们可以将上述代码中转换后的鼠标位置作为参数传递给该函数,以获取从相机到该位置的光线。

# 返回从相机到指定屏幕坐标的光线
var ray = $Camera.get_viewport_ray(mouse_pos.x / get_viewport().size.x,
                                   mouse_pos.y / get_viewport().size.y)

上述代码中,我们首先将鼠标位置的x和y值除以视口的x和y大小,以获取归一化的坐标值。然后,我们将这些归一化的坐标用作get_viewport_ray()函数的参数,以获取光线对象。

获取光线投射的交点

Godot提供了intersect_ray()函数来从场景树中返回给定光线的最接近交点。我们可以将上述代码中获取到的光线对象作为参数传递给该函数,以获得从相机到鼠标位置的3D空间位置。

# 返回光线与场景的最近交点的位置
var result = get_world().intersect_ray(ray.origin, ray.dest)
var hit_pos = result.position

上述代码中,get_world()函数返回场景的根节点,intersect_ray()函数返回光线与场景的最近交点信息。我们将交点的位置赋值给变量hit_pos,以获取从相机到鼠标位置的3D空间位置。

完整代码
# 返回鼠标在局部坐标系中的位置
var mouse_pos = get_local_mouse_position()

# 将局部坐标系转换为世界坐标系
mouse_pos = $Camera.get_global_transform().xform(mouse_pos) 

# 返回从相机到指定屏幕坐标的光线
var ray = $Camera.get_viewport_ray(mouse_pos.x / get_viewport().size.x,
                                   mouse_pos.y / get_viewport().size.y)

# 返回光线与场景的最近交点的位置
var result = get_world().intersect_ray(ray.origin, ray.dest)
var hit_pos = result.position

上述代码可用于在Godot中获取当前鼠标位置的3D空间位置,以进行光线投射等操作。