在 Unity 3D 中测试 Vector3 点是否位于游戏对象内部的最简单方法

问题描述 投票:0回答:1

我的目的是用一组盒式碰撞器来近似不规则的非凸碰撞器。为了做到这一点,我想编写一个

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
。目前我对时间效率不感兴趣,因为我是在游戏外运行脚本。

问题是:是否有另一种更简单的方法来解决这个问题?我的目标的最新技术水平如何? 任何理论和实践方面的帮助,我们都将不胜感激。

我附上该物体的图片只是为了让您有一个想法。 Object with non-convex mesh

c# unity-game-engine mesh raycasting collider
1个回答
0
投票

该方法对我来说看起来是正确的,并且是“包含”的典型方法,只是单个方向就足够了。我相信您的问题可以在光线投射文档中看到:

注意:光线投射不会检测光线投射原点位于碰撞体内部的碰撞体。

不幸的是我对Unity了解不够。也许从网格外部进行所有光线投射,并忽略比您真正想要检查的点更接近原点的任何命中?

我在其他软件中使用的方法是自己进行射线与三角形的相交。例如,请参阅本文

如果您想“体素化”网格,您还可以计算网格与一组平面的交集。 IE。将其分成离散的层。然后对每层生成的多边形进行栅格化,可能通过使用一些绘图库将它们绘制到图像中。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.