Swept-AABB与AABB碰撞检测不起作用。
2012-2-28 18:49:45
收藏:0
阅读:147
评论:1
我正在尝试将Gomez的Swept-AABB vs AABB碰撞检测算法移植到Lua中,如此页面所示,但它无法工作。它几乎在所有地方的输出时间等于零检测到“碰撞”,还有其他的不准确之处。我做错了什么吗?
local axis = {"x","y","z"}
-- box1是移动的盒子,disp是盒子的位移,box2是固定的
function Collision.swept_aabb_vs_aabb(box1, disp, box2)
local a = box2
local b = box1
local amin = a:minCorner()
local amax = a:maxCorner()
local bmin = b:minCorner()
local bmax = b:maxCorner()
local u0d, u1d = vector(0,0,0), vector(1,1,1)
for i=1,3 do
local ax = axis[i]
if amax[ax] < bmin[ax] and disp[ax] < 0 then
u0d[ax] = (amax[ax] - bmin[ax]) / disp[ax]
elseif bmax[ax] < amin[ax] and disp[ax] > 0 then
u0d[ax] = (amin[ax] - bmax[ax]) / disp[ax]
end
if bmax[ax] > amin[ax] and disp[ax] < 0 then
u1d[ax] = (amin[ax] - bmax[ax]) / disp[ax]
elseif amax[ax] > bmin[ax] and disp[ax] > 0 then
u1d[ax] = (amax[ax] - bmin[ax]) / disp[ax]
end
end
local u0 = max(u0d.x,u0d.y,u0d.z)
local u1 = min(u1d.x,u1d.y,u1d.z)
if u0 <= u1 then return u0 else return nil end
end
编辑:似乎在所有三个轴上都没有触发将值分配给u0d的if条件,将进行更多测试。
原文链接 https://stackoverflow.com/questions/9458337
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
似乎已经解决了。
local axis = {"x","y","z"} function Collision.swept_aabb_vs_aabb(box1, disp, box2) local amin = box2:minCorner() local amax = box2:maxCorner() local bmin = box1:minCorner() local bmax = box1:maxCorner() local u0, u1 = -math.huge, math.huge for i=1,3 do local ax = axis[i] if amax[ax] < bmin[ax] then if disp[ax] < 0 then local u_0 = (amax[ax] - bmin[ax]) / disp[ax] if u_0 > u0 then u0 = u_0 end else return nil end elseif bmax[ax] < amin[ax] then if disp[ax] > 0 then local u_0 = (amin[ax] - bmax[ax]) / disp[ax] if u_0 > u0 then u0 = u_0 end else return nil end end if bmax[ax] > amin[ax] and disp[ax] < 0 then local u_1 = (amin[ax] - bmax[ax]) / disp[ax] if u_1 < u1 then u1 = u_1 end elseif amax[ax] > bmin[ax] and disp[ax] > 0 then local u_1 = (amax[ax] - bmin[ax]) / disp[ax] if u_1 < u1 then u1 = u_1 end end end if u0 <= u1 and u0 >= 0 and u0 <= 1 then return u0 else return nil end end