[Day15] 碰撞侦测 - 分离轴原理 SAT

今日目标

  • 实作SAT碰撞侦测

SAT的作法

回顾一下,AABB的作法是不管是甚麽形状,都把物件包进矩形的碰撞框里,但很明显的这会导致碰撞的「不精确」,既使是矩形,只要旋转,就会看到「异次元碰撞」。

SAT,分离轴原理的作法,从结果上,就是找出两物体的分离轴,只要找到一条,就代表两个物体是分开的。下面说明一下SAT的步骤。

  1. 也先从矩形开始思考,两个矩形,但这次旋转了45度。我们要先把八个顶点位置都找出来。
  2. 然後,使用向量的减法,算出各自四个边的向量,这个就会是把我们矩形包起来的边界。
  3. 接下来,找出垂直於各边界的向量,也就是法向量(可以使用点积找到)。
// 例如: E = (100, 82),依据点积则 E.N = 0
// 会找到两个向量,N = (-82, 100) or (82, -100)
  1. 以一条法向量为例,找出来个物体的各自点在该法向量的正投影,只要找到这个物体在该轴上的最大与最小的位置就好。会像下图中这样,可以看出来在这一轴上,两个物体的投影是没有重叠的,这标示找到分离轴了,没有碰撞。
    找出正投影
  2. 有两个矩形,八条边界,最多会需要迭代八次,找到在各自的投影有没有重叠。

AABB也是一种SAT?

仔细一下,昨天AABB的做法也是一种SAT,两个矩形的边界就是XY两轴,毕竟两个物体都「正正方方」的,然後所说的投影就是各自的X轴的min与max,Y轴的min与max。

MISSION FAILED!

实作过程中发现一些问题,在找顶点的时候就发生了问题,於是我直接拿昨天找到的网路文章看发甚麽问题,後来找到是选找的时候,我的参考点是世界座标的原点不是矩形的原点。

接着照上面的步骤,找出边界,找出法向量,迭代每个法向量找出有没有「不重叠」的正投影。

然後!出现了「异次元碰撞」,不管有没有碰撞,都是显示碰撞的状态,加上头有点昏(数学啊~我的天),时间已快到了,今天先休息吧。

参考

一样上传了今天的成果,但是结果是错误的。明天再战


<<:  [Day10 - UI/UX] 上传UI至 Zeplin

>>:  [Day 10] - Spring Boot 实作登入验证(四)(JWT登入验证)

Day 6 - 架设 WireGuard Server

那今天,我们来架设一下 WireGuard 服务器。 首先,我们先进入 VyOS 的 config ...

Day 23 Selenium模组二

今天的影片内容为介绍selenium的webdriver物件用来寻找网页元素的方法 其实跟Beaut...

第31天~上架

上架 一.打包APK 1.选Buile-Generate Signed Bundle/APK 2.选...

Day 29 | SQLite资料库(四)

查询资料 query()方法 //查询资料 var number = "" va...

Day_30 RPI GPIO

openwrt虽然主力是在网路服务,但如果硬体与韧体的支援上有GPIO(通用型之输入输出的简称),也...