12. 碰撞检测-让物体之间产生联系

本教程翻译自官方教程Intersect Collisions - mesh,各位也可以进入本站镜像站点查看

本文目录

  1. 物体碰撞
    1. 我该怎么做?
      1. 物体相交
      2. 点相交
    2. 下一步
  2. 延伸阅读
  3. 贡献者

物体碰撞

    在动态场景中,物体都是在移动和彼此相交的。为了获得最好的渲染效果,我们会需要知道物体在什么情况是互相接触的。在本章,我们将探索一下Babylon.js碰撞系统的工作原理。

1-10
最终结果

我该怎么做?

    本教程将介绍两种碰撞检测的方法:第一种、是两个物体接触时引发碰撞事件,第二种、是检测物体和一个点接触时的碰撞检测。

    接下来我们将讨论上图描述的场景。从左到右,第一个和第二个红球将与旋转过的地面发生碰撞,而第三个白球将与一个单独的点发生碰撞。可以自己试试创建一个上面的场景,接下来我们将继续了解何如进行碰撞检测。

物体相交

    这里的重点是检查球体和地面之间的接触,这里我们使用 intersectsMesh() 函数,它由2个参数:要进行检测的物体实例,和相交的精度级别(布尔值,false是默认粗略,true是精确)。

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引擎会在对象周围创建一个 边界框bounding box ,并测试该框与碰撞物体之间的交集。以下是关于边界框的示例:

2-10-1
白色的细线就代表边界框

    边界框在有些时候可以做到更精确,更贴近物体,这由intersectsMesh函数的第二参数来控制,简而言之,如果将此参数设置为true,则边界框更加靠近物体(Oriented Bounding Box,简称OBB,又称为定向边界框),但缺点是计算成本更高,更耗性能。请注意当物体旋转了一个角度时,精确计算边界框的方法非常有效。

3-10-2

    因此,我们在选择模式的时候,需要考虑碰撞的细节。

    加入想对此进行更加深入的了解,可以查看此维基百科Wikipedia页面。尤其是有关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);
}

    我们在场景中定义了一个精确的点,如果无论球体的哪个部分与这个点相交,那么碰撞事件将会被触发,球体的颜色将会修改。

    可以在下面的例子中了解本教程的所有代码。

Playground 三种碰撞检测的示例

下一步

    有了上面介绍的两个功能,我们的场景将变得更加活灵活现:可以指定对象相交和碰撞的特定效果,并开始将物理概念引入场景。

在下一个教程中,我们将学习如何检查场景和鼠标之间的碰撞,然后选中一个物体。请阅读下一章13. 选中整个物体或它的某一个面

延伸阅读

相机概述

贡献者

翻译/校对: Cow&Sheep
Playground: 天才
技术支持: Dushusir github

参与贡献? 联系alexads@foxmail.com