babylon101

Intersect Collisions - mesh


网格碰撞

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

Collisions

最后结果

我怎样才能做到这一点 ?

本教程将向您展示两种碰撞检测方法:第一种是在两个网格接触时引发碰撞事件,另一种是检测网格与单个点之间的接触。

我们将谈论上面的场景。第一个和第二个球体(气球)将在旋转的地面上碰撞,最后一个球体将仅在一个点上碰撞。创建此基本场景后,继续阅读以了解如何检查碰撞。

  • 相交网格 这里的要点是检查我们的气球和地面之间的接触。我们将使用“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引擎在对象周围创建一个边界框,并测试此框与碰撞网格之间的交集。以下是边界框的示例:

    Collisions

    但是这个边界框可以或多或少精确,这就是为什么我们有第二个参数。简而言之,如果此参数设置为true(默认为false),则边界框更接近网格(OBB边界类型),但这是一个更昂贵的计算。请注意,当您的网格旋转到一个角度时,这种类型的边界框特别有用。

    Collisions

    因此,在选择之前,请考虑您需要的碰撞细节。

    如果您想了解有关此第二个参数的更多信息,可以查看此Wikipedia页面,尤其是有关AABB和OBB模式的信息: http://en.wikipedia.org/wiki/Bounding_volume

  • 相交点 您可以使用的另一个函数是“intersectsPoint()”和特定点,如下所示:

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

    我们在场景中定义了一个精确的点,如果我们的气球与此点相交,气球上的任何地方,则会引发事件并更改气球的颜色。

您可以通过访问我们游乐场的演示来玩本教程中使用的代码。

下一步

通过这两个功能,您的场景变得更加动态:您可以定义对象交叉和碰撞的特定反应,并开始将物理概念引入场景。

在下一个教程中,您将了解如何检查场景和鼠标之间的碰撞。.

进一步阅读

相机概述