射线 Raycaster
1. 光线投射 Raycaster
光线投射用于进行鼠标拾取(在三维空间中计算出鼠标移过了什么物体)。
光线投射是种线性投射,它的计算方式是:
光线投射的起点是光线的起点,终点是光线的终点。
光线投射的方向是光线的方向,即光线的方向是光线的起点到终点的方向。
2. 鼠标交互
鼠标移动 9-0
报名课程后可查看完整文档
绑定鼠标移动事件: window.addEventListener('mousemove', () => {});
指定交互对象 9-1
报名课程后可查看完整文档
raycaster.intersectObjects([box, sphere]) 指定可交互的对象
鼠标点击 9-2 点击掉落立方体
报名课程后可查看完整文档
3. 碰撞检测
在游戏和交互式应用程序中,碰撞检测是实现物体之间交互和碰撞效果的关键功能。
常见的碰撞检测方法:
- AABB 碰撞检测: (Axis-Aligned Bounding Box,轴对齐包围盒)碰撞检测是种快速且简单的碰撞检测方法。在该方法中,物体被包围在与坐标轴对齐的立方体框中,即包围盒。这意味着包围盒的每个面与坐标轴平行。适用于在需要进行粗略的碰撞检测或优化性能的情况下
- 球形碰撞检测: 是种基于球体形状的碰撞检测方法。在该方法中,物体被表示为球体,通过比较球体之间的位置和半径来检测碰撞。球形碰撞检测也可以作为快速的预筛选方法,用于过滤出可能与指定球体相交的物体。在复杂场景中,先使用球形碰撞检测进行初步筛选,然后再使用更准确的碰撞检测算法对可能相交的物体进一步检测。通过使用球形碰撞检测,可以实现简单而高效的碰撞检测。但需要注意,球体形状不一定能够精确地表示物体的真实形状
- Raycasting 碰撞检测: 是种基于射线投射的碰撞检测方法。在该方法中,通过定义一个起点和方向的射线,判断射线与场景中的物体是否相交,从而实现碰撞检测。常用于处理鼠标拾取、点击交互、碰撞检测以及射线追踪等任务。
- 物理引擎: 是使用物理模拟引擎对物体之间的碰撞进行模拟和检测的方法。物理引擎通常模拟物体的运动、重力、摩擦等物理属性,并根据这些属性来计算和处理物体之间的相交或碰撞。
[刚体模拟]:物理引擎会将物体建模为刚体,并在物体之间应用力、速度以及受到的外部紧束条件,以模拟真实世界中物体的运动。
[连续检测]:物理引擎可以提供连续碰撞检测(Continuous Collision Detection,CCD)功能。这允许检测高速运动的对象与其他对象之间的准确碰撞,以防止它们穿透或忽略细小的碰撞。
[碰撞响应]:当物体之间发生碰撞时,物理引擎会计算碰撞后的反应,如弹性碰撞(反弹)、摩擦力等。这样可以模拟物体之间的物理相互作用,产生更真实的行为。
[约束解算]: 物理引擎能够解决约束问题,例如处理物体之间的关节、连接和约束条件。这使得模拟复杂的物理系统(如骨骼、机械臂)变得更为容易。
比较流行的物理引擎包括 Box2d、Physijs、cannon、ammo.js等
3.1 Raycaster 碰撞检测
Raycaster 碰撞检测
报名课程后可查看完整文档
不够精确, 物体在相交时容易出错
3.2 Box3 包围盒碰撞检测
Box3 包围盒碰撞检测
报名课程后可查看完整文档
只能粗略进行检测
3.3 物理引擎碰撞检测
见第13章物理引擎篇
报名课程后可查看完整文档