这是我为 Lua 中的 LOVE2D 引擎制作的一个小库,它使用分离轴定理来解决碰撞问题。
当我的 SAT 程序开始运行时,我非常高兴,并开始使用大量多边形对其进行测试。它在大多数情况下都有效,并且也为它们提供了正确的最小平移向量。奇怪的是——如果两个形状都有锐角,那么这些角度会导致程序失败,当形状不接触时返回碰撞,或者更不寻常的是,它会给出一个奇怪的最小平移向量。我检查了返回法线的函数——因为我觉得这是我可能失败的第一点,但它似乎工作正常。
这是处理我的碰撞的主要功能。
function findIntersection(shape1, shape2)
--Get axes to test.
--MTV means 'minimum translation vector' ie. the shortest vector of intersection
local axes1 = {}
local axes2 = {}
local overlap = false
local MTV = {direction = 0, magnitude = 99999}
for i, vert in pairs(shape1.hitbox) do
nrm = getNormal(shape1.hitbox, i)
table.insert(axes1, nrm)
end
for i, vert in pairs(shape2.hitbox)do
nrm = getNormal(shape2.hitbox, i)
table.insert(axes2, nrm)
end
--print(#axes1 .. ' ' .. #axes2)
--now that we have the axes, we have to project along each of them
for i, axis in pairs(axes1) do
test1 = hitboxProj(shape1, vectorToCoord(axis.direction, axis.magnitude))
test2 = hitboxProj(shape2, vectorToCoord(axis.direction, axis.magnitude))
if test2.max > test1.min or test1.max > test2.min then
if test2.max - test1.min < MTV.magnitude then
MTV.direction = axes1[i].direction
MTV.magnitude = test2.max - test1.min
end
else
return false
end
end
--now that we have the axes, we have to project along each of them
for i, axis in pairs(axes2) do
test1 = hitboxProj(shape1, vectorToCoord(axis.direction, axis.magnitude))
test2 = hitboxProj(shape2, vectorToCoord(axis.direction, axis.magnitude))
if test2.max > test1.min or test1.max > test2.min then
if test2.max - test1.min < MTV.magnitude then
MTV.direction = axes2[i].direction
MTV.magnitude = test2.max - test1.min
end
else
return false
end
end
return {MTV}
end
我的项目文件在 github https://github.com/ToffeeGoat/ToffeeCollision