在本教程中,我们将模拟摄像机运动,摄像机在地板上,与地面发生碰撞,并可能与场景中的任何对象发生碰撞,实现步骤如下:
1.Define and apply gravity 定义并添加重力
首先要做的是定义重力矢量,在地球这样的经典世界中,重力的方向沿着Y轴向下(负的),但是我们可以随意改变它!
scene.gravity = new BABYLON.Vector3(0, -9.81, 0);//定义xyz方向的重力
重力可以应用于之前在代码中定义的任何摄像机
camera.applyGravity = true;
2.Define an ellipsoid 定义一个椭球体
下一个重要的步骤是定义相机周围的椭球体,这个椭球面代表我们玩家的尺寸,当一个网格与这个椭球面接触时,会引发碰撞事件,防止我们的相机离这个网格太近:
相机上的椭球属性默认为size(0.5, 1,0.5),但是改变值会让其更高、更大、更小、更薄,这取决于调整后的轴。在下面的例子中,我们将使我们的相机的椭球比默认的稍大一点:
//Set the ellipsoid around the camera (e.g. your player's size)
camera.ellipsoid = new BABYLON.Vector3(1, 1, 1);
3.Apply collision 添加碰撞
一旦你完成了之前的设置,我们的最后一步是声明场景中的碰撞:
// Enable Collisions
scene.collisionsEnabled = true;
camera.checkCollisions = true;
声明哪些网格可能与我们的相机发生碰撞:
ground.checkCollisions = true;
box.checkCollisions = true;
现在,相机会落在y轴上,直到它与地面相撞。而且,当你把相机移得太近时,它会与盒子相撞。
4.Object vs. object collision 对象与对象的碰撞
你也可以通过网格来做同样的事情,通过 mesh.ellipsoid 和 mesh.moveWithCollisions(velocity) 函数。这个函数将尝试根据给定的速度移动网格,并检查当前网格和所有激活了校验冲突的网格之间是否没有碰撞。
- ArcRotateCamera
ArcRotateCamera也还可以检测碰撞,但当碰撞发生时,它不会沿着障碍物滑动,也不会移动
参考资料: https://doc.babylonjs.com/babylon101/cameras,_mesh_collisions_and_gravity