如何在 3D 中检测由平面定义的凸体积与球体之间的碰撞

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

对于每个平面,计算球体到平面的距离,如果距离大于半径,则返回 false,给出正错误结果,但也会给出误报。

当球体接近“角”(例如立方体)时,就会发生误报。

分离轴定理法也有类似的问题。

传递所有正错误结果,并通过添加从球体位置到凸体积中最近点的轴并在其上投影球体位置和凸体积点来进行最终检查,这在 2D 中工作,但我还没有设法使其工作3D 模式。

这肯定是 3D 图形中的标准问题,我希望得到明确的答案。

3d collision-detection
1个回答
0
投票

要检测球体和由平面定义的凸体积之间的碰撞,您首先需要知道如何检测球体和单个平面之间的碰撞。平面由

Vec3 normal
float d
定义。

检查球体中心到平面的距离并减去球体半径。图像中的箭头是平面的法线。 sphere plane

当你有一个由平面定义的凸体积时,你需要检查每个平面是否与球体碰撞。

代码:

//create a convex volume for a cube
float cubeSize = 0.5f;
PlaneSet planeSet = new PlaneSet(new List<Plane> {
    new Plane(-Vec3.Up, cubeSize),
    new Plane(Vec3.Up, cubeSize),
    new Plane(-Vec3.Right, cubeSize),
    new Plane(Vec3.Right, cubeSize),
    new Plane(-Vec3.Forward, cubeSize),
    new Plane(Vec3.Forward, cubeSize)
});

static bool PlaneSetIntersectSphere(PlaneSet planes, Sphere sphere)
{
    for (int i = 0; i < planes.planes.Count; i++)
    {
        float dotProduct = Vec3.Dot(planes.planes[i].normal, sphere.center);
        if (dotProduct - planes.planes[i].d - sphere.radius > 0)
        {
            return false;
        }
    }
    return true;
}

sphere vs cube collision gif

这就是飞机在 2D 视图中的外观。箭头是平面法线。 cube planes

© www.soinside.com 2019 - 2024. All rights reserved.