在动态的场景中,物体之间是运动和相互作用的。为了得到最好的渲染效果,你需要知道你的网格什么时候相互接触。在本教程中,我们将了解碰撞系统是如何工作的
本教程将展示两种碰撞检测方法:一种是在两个网格接触时引发碰撞事件,另一种是检测网格与单点之间的接触
我们将讨论上面的场景,第一个球和第二个球(气球)与旋转过的平面碰撞,最后一个球将只在一个点上碰撞
- Intersect mesh 网格碰撞
这里的重点是检查气球和平面的接触情况,我们将使用“intersectsMesh()”函数,它有两个参数:要检查的网格和判断碰撞的精度(布尔值)。
if (balloon1.intersectsMesh(plan1, false)) {
balloon1.material.emissiveColor = new BABYLON.Color4(1, 0, 0, 1);
} else {
balloon1.material.emissiveColor = new BABYLON.Color4(1, 1, 1, 1);
}
为了通过检查网格上的许多细节来避免昂贵的计算,babylon引擎在对象周围创建一个边界框,并测试该框和碰撞网格之间的交集,下面是一个包围框的例子:
但是这个边界框的精确程度是可以调节的,这就是为什么我们有第二个参数。简而言之,如果这个参数被设置为true(默认情况下为false),那么边界框更接近网格(OBB边界类型),但是这是一种开销更大的计算,请注意,当网格旋转到某个角度时,这种类型的边界框特别有用,所以在选择之前考虑一下碰撞的细节
- Intersect point 单点碰撞
可以使用的另一个函数是具有特定点的“intersectsPoint()”,如下所示:
var pointToIntersect = new BABYLON.Vector3(10, -5, 0);
if (balloon3.intersectsPoint(pointToIntersect)){
balloon3.material.emissiveColor = new BABYLON.Color4(1, 0, 0, 1);
}
我们在场景中定义了一个精确的点,如果气球与这个点相交,气球上的任何地方,事件就会被提起,我们改变气球的颜色
参考资料: https://doc.babylonjs.com/babylon101/intersect_collisions_-_mesh