/// <summary>
/// 屏幕空间射线检测3D物体
/// </summary>
/// <param name="ScreenPos">屏幕空间坐标</param>
/// <param name="Camera">相机对象</param>
/// <param name="RayLenght">射线长度</param>
/// <param name="CollideWithAreas">是否包含Area的碰撞</param>
/// <param name="CollisionMask">碰撞掩码</param>
/// <returns>
/// {
/// position: Vector3 # 在世界空间中的碰撞点
/// normal: Vector3 # 在世界空间中碰撞的法线
/// collider: Object # 发生碰撞的对象或null(如果未关联)
/// collider_id: ObjectID # 发生碰撞的对象ID
/// rid: RID # 发生碰撞的RID
/// shape: int # 碰撞体的形状索引
/// metadata: Variant # 碰撞的元数据
/// }
/// </returns>
public static Godot.Collections.Dictionary RayCast(
Vector2 ScreenPos,
Camera3D Camera,
float RayLenght = 100,
bool CollideWithAreas = false,
uint CollisionMask = 4294967295
) {
// 屏幕空间坐标计算*射线起始位置*
Vector3 origin = Camera.ProjectRayOrigin(ScreenPos);
// 计算射线结束位置
Vector3 end = origin + Camera.ProjectRayNormal(ScreenPos) * RayLenght;
// 创建射线碰撞请求
PhysicsRayQueryParameters3D query = PhysicsRayQueryParameters3D.Create(origin, end, CollisionMask);
// 设置参数:是否包含Area组件的碰撞
query.CollideWithAreas = CollideWithAreas;
// 射线检测
var result = Camera.GetWorld3D().DirectSpaceState.IntersectRay(query);
// 判断返回
return result.Count == 0 ? null : result;
}版权声明
作者: Chaim
链接: https://chaim.eu.org/posts/%E6%91%84%E5%83%8F%E6%9C%BA%E5%B0%84%E7%BA%BF%E6%A3%80%E6%B5%8B3d/
许可证: CC BY-NC-SA 4.0
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. Please attribute the source, use non-commercially, and maintain the same license.