这里的“鼠标交互”并不是指 addEventListener 提供的交互——虽然也会用到——而 是另一个更具体的问题:鼠标没有3D坐标,怎么和三维空间里的物体交互?想象 一下,如果我们在3D视图上单击了一下鼠标,要怎么找到被单击的3D对象?

当然,我们可以自己用鼠标二维坐标 + 投影矩阵 + 3D对象的变换矩阵 + 3D对 象的几何信息,计算出鼠标到底点击在哪个对象上……或者,我们也可以用 Three.js 提供的 Raycaster .

Ray Casting

Raycaster 使用的方法正是 Ray Casting ,顾名思义就是从一点发射一束“光线” ——动感死光biubiubiu——然后看看这束“光线”在前进路线上会遇到什么东西。

乍看这似乎和鼠标交互没什么关系,但是当我们在用鼠标选择3D场景中的物体时,可 以想象也有一束“光线”从镜头所在的点出发,沿着鼠标所指的方向发射出去,那么这 一束光线一定会首先遇到鼠标方向上最靠近镜头的物体,一般情况下这也正是我们想 要用鼠标操作的物体。

遥控纸飞机

这里的例子沿用了 上一篇笔记 的场景,但是我们现在可以用鼠标来控制飘来飘去 的纸飞机了~我用了一个 看不见 的平面来“截获”镜头“发射”出来的“光线”,从 而得到纸飞机的目标位置。