【问题标题】:Three JS detect multiple moving object collision三个JS检测多个运动物体碰撞
【发布时间】:2022-01-21 00:07:51
【问题描述】:

我目前有多个对象,每个对象都像这样随机前进

model.lookAt(position_x, 0, position_z);

setInterval(function(){
   model.translateZ(0.015);
}, 10);

我需要每个对象在向前移动时避免相互碰撞。我发现这个解决方案建议使用边界框进行碰撞检测,但它似乎只适用于两个对象之间的碰撞:

How to detect collision between two objects in JavaScript with Three.js?

是否可以有多个对象,每个对象都有自己的碰撞检测?

谢谢!

【问题讨论】:

  • 您应该为此使用物理引擎。查看 Cannon.JS 或 Oimo.JS
  • 但是当我只需要简单的碰撞检测时,使用物理引擎是相当繁重的。
  • 如果您想要更简单的解决方案并且不需要 3D 碰撞,您可以使用 2d 物理引擎。如果您想使用Box3isIntersectionBox 保留您的解决方案,您唯一需要做的就是创建一个循环。您将所有对象保存在一个数组中,并在每一帧中检查所有对象是否与其中一个对象发生碰撞

标签: javascript three.js


【解决方案1】:

你可以这样做:

var objectA = ...your first object...
var objectB = ...your second object...
var objectC = ...your first object...
var objectD = ...your second object...

firstBB = new THREE.Box3().setFromObject(objectA);
secondBB = new THREE.Box3().setFromObject(objectB);
thirdBB = new THREE.Box3().setFromObject(objectC);
fourthBB = new THREE.Box3().setFromObject(objectD);

const BBs = [firstBB, secondBB, thirdBB, fourthBB];


// at each frame, you could do this to check if some objects are colliding :
BBs.forEach(bb => {
  // Filter out this bb from BBs
  const otherBBs = BBs.filter(other => other !== bb)

  // Check if any of the other BBs intersects with this bb
  otherBBs.forEach(other => {
    if (bb.intersectsBox(other)) {
      // Collision ! Do something
    }
  })
})  

【讨论】:

  • 感谢您的回答,这是否意味着在每个过渡帧上,每个对象都对数组中的每个其他对象执行交叉检查?如果我增加到 50 - 100 个对象,这会比物理引擎更占用资源吗?
  • 对于 50/100 个对象,使用此方法不会出现性能问题。这是一个简单的边界框重叠检查,所以它并不是真正的性能密集型。如果你好奇,可以做一个基准来比较这个方法和物理引擎的使用。
  • 我注意到来自 setFromObject 的框的最小值和最大值即使在移动原始对象之后仍然保持静态。唯一的方法是再次调用 setFromObject 以获取更新的值。那么这是否意味着在每个过渡帧上,每个对象的 BB 都需要先从 setFromObject 重新计算?
猜你喜欢
  • 1970-01-01
  • 2015-02-10
  • 1970-01-01
  • 2014-04-19
  • 1970-01-01
  • 2014-06-09
  • 2013-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多