[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登入验证)

Day24-Kaggle Titanic迈进前5% part(1)

前面23天讲了这麽多,我们学会了numpy、pandas、seaborn、sklearn、pytor...

[Day26] swift & kotlin 游戏篇!(8) 小鸡BB-游戏制作-历史纪录

Swift 游戏示意 Swift 游戏纪录 最後一个功能是游戏纪录 修改一下Player.swift...

初探 YC Startup School

Y Combinator,简称 YC,是国际上十分知名的加速器之一,其中最大的特点在於他们的新创社群...

Day 05 Introduction to AI

Summary What is AI? Machine learning Anomaly detec...

Day25 [实作] 一对一视讯通话(5): 切换设备

如果我们的电脑有两个摄影机,就会有切换装置的需求,今天我们就来加入这个功能 在 index.html...