CS
/// <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.

开始搜索

输入关键词搜索文章内容

↑↓
ESC
⌘K 快捷键