我的目的是用一组盒式碰撞器来近似不规则的非凸碰撞器。为了做到这一点,我想编写一个
bool IsPointInside(Vector3 point)
函数来测试 point
是否位于脚本所附加的对象内部。
复杂的是,无法使用单个盒子、球体、圆柱体或自定义凸网格来近似对象网格。
我尝试通过 Raycast 来实现它:
public bool IsPointInside(Vector3 point)
{
// Cast rays in multiple directions to increase reliability
Vector3[] directions = { Vector3.up, Vector3.down, Vector3.left, Vector3.right, Vector3.forward, Vector3.back };
int hitCount = 0;
foreach (var direction in directions)
{
Ray ray = new Ray(point, direction);
RaycastHit[] hits = Physics.RaycastAll(ray, Mathf.Infinity);
foreach (RaycastHit hit in hits)
{
if (hit.collider == meshCollider)
{
hitCount++;
}
}
}
// If the average number of hits per direction is odd, the point is inside
return (hitCount / directions.Length) % 2 != 0;
}
问题是,这个实现不仅表现不佳,而且似乎无法正常工作,因为我希望在网格之外的一些点返回
true
,而我希望在网格内部的一些点返回false
。目前我对时间效率不感兴趣,因为我是在游戏外运行脚本。
问题是:是否有另一种更简单的方法来解决这个问题?我的目标的最新技术水平如何? 任何理论和实践方面的帮助,我们都将不胜感激。