2D线条在“镜子”上的反射
2015-6-21 23:32:33
收藏:0
阅读:108
评论:1
我已经断断续续地工作了一个星期,搜索了一些资料,但还是找不到如何解决我的问题。
我有一个“射线”表和一个“线”表,我想让线表作为镜子,每当射线撞到一条线时就反射。想象一下激光从镜子上反弹的情景。我已经解决了交点检测的问题,但是我无法弄清楚如何正确计算反射的角度并延伸到那个方向。
代码:
--射线表是一张子表的表,每个子表的格式如下:
-- rays[x] = {100,200,150,600,200,400},其中(100,200)是有序对,等等。
--线表只包含x1、y1、x2、y2的值
for i,ray in ipairs(rays) do
for j,line in ipairs(lines) do
if line.x2 ~= nil and #ray>3 then
print(line.x2..' '..line.y2)
iX, iY = intersect.test(ray[#ray-3],ray[#ray-2],
ray[#ray-1],ray[#ray],line.x1,line.y1,line.x2,line.y2)
--以上代码将每个射线和线检测是否相交,intersect.test函数
-- 然后如果是的话,iX和iY不是零,就可以继续执行下去
if iX ~= nil and iY ~= nil then
local rayA = (180/math.pi)*math.atan(getSlope(ray[#ray-3],ray[#ray-2],ray[#ray-1],ray[#ray]))
local lineA = (180/math.pi)*math.atan(getSlope(line.x1,line.y1,line.x2,line.y2))
local normalA = (180/math.pi)*math.atan(-1/getSlope(line.x1,line.y1,line.x2,line.y2))
--在这里,我正在计算角度的度数。在最终的代码中,所有的atan都
--会被优化掉,但现在看起来最容易看到实际的角度
print(rayA..' '..lineA..' '..normalA)
ray[#ray-1]=iX
ray[#ray]=iY
--这个小部分只是在交点右侧创建一个射线上的点
--接下来的代码是我的尝试,但无法预期工作
local reflectA = normalA-rayA
local reflectR = 2*reflectA+rayA
print(reflectR)
reflectR = reflectR/(180/math.pi)
local rSlope = math.tan(reflectR)
local offset = 0
ray[#ray+1]=iX+offset
ray[#ray+1]=iY+(offset*rSlope)
end
end
end
end
我卡在了最后一个部分。它有点像从线开始反弹的一段,但有时会越过线,而且永远不是正确的反射角度。如果您能指导我应该如何做,我将非常感激。
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在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中获取用户配置主目录的跨平台方法
如果可以避免,则最好避免与坡度和角度一起工作,因为您将不得不处理令人讨厌的特殊情况,例如斜率为+ve或-ve无穷大等等。
如果您可以计算出线的法向量(蓝色箭头),则可以使用点积来进行反射:
计算线的法向量是这样完成的:
local normalY = line.x2 - line.x1 local normalX = line.y1 - line.y2 local normalLength = math.sqrt(normalX * normalX + normalY * normalY) normalX = normalX / normalLength normalY = normalY / normalLength然后,您需要计算从线和光线的交点到光线尖端(“穿过”您要反射的线的点)的向量:
local rayX = rayTipX - iX local rayY = rayTipY - iY然后计算点积:
local dotProduct = (rayX * normalX) + (rayY * normalY)这告诉我们光线沿线法线方向超出交点走了多远(绿线的长度)。要找到绿线的向量,请将线法线乘以点积:
local dotNormalX = dotProduct * normalX local dotNormalY = dotProduct * normalY如果我们否定此向量并将其乘以2(以获得绿线和粉线),然后加上光线的尖端,我们将得到反射后的光线尖端:
local reflectedRayTipX = rayTipX - (dotNormalX * 2) local reflectedRayTipY = rayTipY - (dotNormalY * 2)