2012-07-10 72 views

回答

6

最簡單的選擇是使用Vector3的distanceTo()或distanceToSquared函數在兩個對象之間的歐氏距離。

例如

console.log(yourCube.position.distanceToSquared(yourSphere.position)); 

如果兩個物體之間的距離大於球體半徑與立方體邊之間的距離,那麼這將是潛在的碰撞。我還建議distanceToSquared,因爲它更快(因爲它不調用sqrt),並且它對檢查衝突仍然有用。

注意該方法不是超精確的 - 它本質上是檢查兩個球體之間的碰撞(估計立方體是一個半徑等於立方體一半的球體),但我希望它足夠接近/足夠好對於你的設置,因爲它是我認爲最容易和最快的實現。

您可能會注意到,立方體的角落將會碰撞,而不會觸發碰撞,直到達到一定的距離。您可以通過傳遞不同的立方體比例來調整「閾值」。想象一下你的立方體周圍有一個球體,這個球體的比例應該有多大才能爲你的設置獲得一個合適的估計碰撞。

想到的另一種方法是找到最接近立方體球點:

  • 你知道可以通過減去得到球的中心到立方體的中心點兩個位置矢量
  • 通過對上述差異向量進行歸一化,並通過球面半徑對它進行縮放,您可以獲得立方體方向上的球體上的點。然後,您可以檢查該點是否在立方體內部(通過檢查如果座標位於立方體的軸對齊邊界框(AABB)內

例如

var pointOnSphere = yourSphere.position.clone().sub(yourCube.position).normalize(). multiplyScalar(yourSphereRadius); 

這要是把我的頭頂部,所以我不能保證上面的代碼將工作,可能是值得放置在pointOnSphere座標粒子首先檢查。

在3D中還有其他更高級的碰撞檢測算法,您可以在this book中查看,但最好儘量保持簡單/快速。

+0

謝謝,但計算距離只適用於這些簡單的對象。那麼three.js中有沒有內置的碰撞檢測器? – 2012-07-10 19:56:56

+0

內置?從來沒聽說過。如果你看看[three.js示例](http://mrdoob.github.com/three。js /)ZombiesVSCows使用歐幾里得距離(儘管sqrt和牛與當前殭屍位置向量之間的區別是手工實現的)。對於更復雜的東西,你可以推出你自己的或者嘗試像[Physijs](http://chandlerprall.github.com/Physijs/examples/shapes.html) - 看看支持的形狀。我沒有時間玩這個,但也許[ConvexMesh](https://github.com/chandlerprall/Physijs/blob/master/physi.js#L667)可以幫助其他形狀。 – 2012-07-10 21:45:02