【问题标题】:Selecting the relevant plane of a bounding box prior to ray plane intersection在光线平面相交之前选择边界框的相关平面
【发布时间】:2011-09-28 09:29:16
【问题描述】:

我正在跟踪需要测试它们是否位于立方体/边界框内部或外部的对象。如果它们在外面,我会做一个射线平面相交来计算立方体的一个平面上的一个点。光线从盒子的中心开始,指向物体。该平面是构成立方体的 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

我在这里错过了什么?

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

【问题讨论】:

    标签: lua collision-detection linear-algebra vectormath


    【解决方案1】:

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

    如果一个长度相当小(想想一个非常薄的盒子),无论你往哪个方向看,几乎在任何情况下,你都会碰到那些大平面,而几乎永远不会碰到薄边。

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

    另一个说明:请注意,比较可以正常工作,也可以使用未标准化的方向,但如果您保持点积未标准化,您可能会遇到其他问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      • 2012-02-14
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多