射线
Ray 类表示从一个起点沿指定方向无限延伸的射线,位于 laya/d3/math/Ray.ts。广泛用于物体拾取、碰撞检测、视线判断等场景。
一、基本结构
Section titled “一、基本结构”// 创建射线:起点 + 方向(归一化向量)let origin = new Laya.Vector3(0, 10, 0);let direction = new Laya.Vector3(0, -1, 0);let ray = new Laya.Ray(origin, direction);
// 属性ray.origin; // Vector3 - 起点ray.direction; // Vector3 - 方向二、获取射线上的点
Section titled “二、获取射线上的点”// at(t, out):获取距起点距离 t 处的点let point = new Laya.Vector3();ray.at(5, point);// point = origin + direction * 5三、屏幕射线(鼠标拾取)
Section titled “三、屏幕射线(鼠标拾取)”最常用的场景:将2D屏幕坐标转换为3D空间射线。
3.1 生成射线
Section titled “3.1 生成射线”
(图3-1)
let ray = new Laya.Ray(new Laya.Vector3(), new Laya.Vector3());let mousePos = new Laya.Vector2(Laya.InputManager.mouseX, Laya.InputManager.mouseY);
// 从相机和屏幕坐标生成射线camera.viewportPointToRay(mousePos, ray);3.2 物理射线检测(单个)
Section titled “3.2 物理射线检测(单个)”let hitResult = new Laya.HitResult();
if (scene.physicsSimulation.rayCast(ray, hitResult)) { let hitNode = hitResult.collider.owner; // 击中的节点 let hitPoint = hitResult.point; // 击中点坐标 let hitNormal = hitResult.normal; // 击中面法线 let hitFraction = hitResult.hitFraction; // 击中距离比例}3.3 射线检测全部物体
Section titled “3.3 射线检测全部物体”let results: Laya.HitResult[] = [];if (scene.physicsSimulation.rayCastAll(ray, results)) { for (let result of results) { console.log("击中:", result.collider.owner.name); }}四、应用示例
Section titled “四、应用示例”4.1 点击地面定位
Section titled “4.1 点击地面定位”onMouseDown(): void { let ray = new Laya.Ray(new Laya.Vector3(), new Laya.Vector3()); let mousePos = new Laya.Vector2(Laya.InputManager.mouseX, Laya.InputManager.mouseY); this.camera.viewportPointToRay(mousePos, ray);
let hitResult = new Laya.HitResult(); if (this.scene.physicsSimulation.rayCast(ray, hitResult)) { this.player.transform.position = hitResult.point; }}4.2 前方障碍检测
Section titled “4.2 前方障碍检测”let origin = this.owner.transform.position;let forward = new Laya.Vector3();this.owner.transform.getForward(forward);let ray = new Laya.Ray(origin, forward);
let hitResult = new Laya.HitResult();if (this.scene.physicsSimulation.rayCast(ray, hitResult, 100)) { console.log("前方有障碍物");}