babylon101| 08. Cameras, Mesh Collisions and Gravity(相机、碰撞和重力)

在本教程中,我们将模拟摄像机运动,摄像机在地板上,与地面发生碰撞,并可能与场景中的任何对象发生碰撞,实现步骤如下:

1.Define and apply gravity  定义并添加重力

首先要做的是定义重力矢量,在地球这样的经典世界中,重力的方向沿着Y轴向下(负的),但是我们可以随意改变它!

scene.gravity = new BABYLON.Vector3(0, -9.81, 0);//定义xyz方向的重力

重力可以应用于之前在代码中定义的任何摄像机

camera.applyGravity = true;

2.Define an ellipsoid 定义一个椭球体

下一个重要的步骤是定义相机周围的椭球体,这个椭球面代表我们玩家的尺寸,当一个网格与这个椭球面接触时,会引发碰撞事件,防止我们的相机离这个网格太近:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值