9 Babylonjs基础入门 模型碰撞

在动态场景中,对象正则相互移动和交互。要获得最佳渲染效果,你需要知道网格物体何时相互接触。在本教程中,我们将了解碰撞系统的工作原理。
9 Babylonjs基础入门 模型碰撞

如何实现

本教程将向你展示两种碰撞检测方法:第一种是在两个网格接触时引发碰撞事件,另一种是检测网格与单个点之间的接触。
我们将讨论上面的场景。第一个和第二个球体(气球)将在旋转的地面上碰撞,最后一个球体劲和一个点碰撞。创建此基本场景后,继续阅读以了解如何检查碰撞。

模型网格相交的要点是检查球体和地面之间的接触。我们将使用使用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引擎在对象周围创建一个边界框,并测试此框与碰撞网格之间的交集。以下是边界框的示例:
9 Babylonjs基础入门 模型碰撞
但是这个边界框可以设置高精度或者低精度,这也是为什么会有第二个参数值。简而言之,如果将第二个参数设置为true(默认值false),则边界框更接近模型网格(OBB边界类型),但这是一个更昂贵的计算。请注意,如果你的模型网格旋转到一个角度时,这种类型的边界框特别有用。
9 Babylonjs基础入门 模型碰撞
因此,请根据情况设置你的碰撞精度。
如果您想了解有关第二个参数的更多信息,可以查看点击这里,尤其是有关AABB和OBB模式的信息。

相交点

你可以使用另一个函数是intersectsPoint判断与特定点的碰撞,如下所示:

var pointToIntersect = new BABYLON.Vector3(10, -5, 0);
if (balloon3.intersectsPoint(pointToIntersect)){
  balloon3.material.emissiveColor = new BABYLON.Color4(1, 0, 0, 1);
}

我们在场景中定义了一个精确的点,如果我们的气球与此点相交,气球上的任何地方,则会引发事件并更改气球的颜色。
最后付上当前案例的官方案例:点击这里