我正在跟踪需要测试它们是否位于立方体/边界框内部或外部的对象。如果它们在外面,我会做一个射线平面相交来计算立方体的一个平面上的一个点。光线从盒子的中心开始,指向物体。该平面是构成立方体的 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
我在这里想念什么?
我想我可以在每个平面上进行碰撞测试,然后选择最接近立方体中心的点,但这似乎是一种浪费。