在光线平面交叉点之前选择边界框的相关平面

时间:2011-07-04 21:01:58

标签: lua collision-detection linear-algebra vectormath

我正在跟踪我需要测试的对象,如果它们位于多维数据集/边界框的内部或外部。如果它们在外面,我会做一个射线平面交叉点来计算立方体的一个平面上的点。光线从盒子的中心开始,指向物体。飞机是构成立方体的6架飞机之一。

我想避免的是,我一直在测试6个平面中每个平面上的光线平面交点。所以我认为我会聪明并首先计算每个平面法线和光线之间的点积。然后选择具有最小角度(最接近1)的那个。

这只能中途工作。当对象与其中一个平面对齐时,存在我的函数选择错误平面的位置。它大部分时间都有效,我想知道为什么会这样。我认为我的方法肯定存在根本性的错误。

这是我定义的平面,每个平面都有一个标签。坐标系的0,0,0是立方体的一角。

planes = {
    xnear = { normal = {1, 0, 0}, d = 0 },
    xfar = { normal = {-1, 0, 0}, d = cubeSize.x },
    ynear = { normal = {0, 1, 0}, d = 0 },
    yfar = { normal = {0, -1, 0}, d = cubeSize.y },
    znear = { normal = {0, 0, 1}, d = 0 },
    zfar = { normal = {0, 0, -1}, d = cubeSize.z }, 
}

然后我使用以下功能:

-- Determine what plane to use for collision testing. The angle is calculated
-- between the plane normal and the direction of the ray
function whatPlane(pos)
local direction = vec3.sub(cubeCenter, pos)
local result
local max = -1
for label, plane in pairs(planes) do
    local dotproduct = vec3.dot(plane.normal, direction)
    if dotproduct > max then
        max = dotproduct
        result = label
    end
end
return result
end

我在这里错过了什么?

我想我可以在每个平面上进行碰撞测试,然后选择最接近立方体中心的点,但这似乎是浪费。

1 个答案:

答案 0 :(得分:1)

如果立方体确实是一个立方体,即所有尺寸都相同(并且仅适用于位于正多面体中心的情况),您的论证会没问题。但是看起来你的每个轴都有不同的尺寸。

如果一个长度相当小(想象一个非常薄的盒子),无论你在几乎任何情况下你看起来什么方向,你都会击中那些大型飞机,而且几乎不会碰到薄侧。

如果您按方向的精确长度缩放方向,则可以对此进行补偿。即而不是direction,你使用direction/(cubeSize.x,cubeSize.y,cubeSize.z),其中divison是通过坐标完成的。

另一个注意事项:请注意,比较工作正常,方向也不正常,但如果保持点积不规范,则可能会遇到其他问题。