您当前的位置: 首页 >  数学

开发游戏的老王

暂无认证

  • 4浏览

    0关注

    803博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

游戏中的数学:高等向量数学(下)

开发游戏的老王 发布时间:2020-08-07 10:04:54 ,浏览量:4

英文原文地址:Docs » Math » Advanced vector math

转载请注明出处

一些平面的例子

这是一个展示平面用途的简单例子。试想一下,你有一个凸多边形(convex polygon)。例如,矩形,梯形,三角形或者任何不包含凹陷面的多边形。

我们求得通过多边形的每一个面片的平面,以获得一个平面的列表,这时我们就可以爽歪歪了,比如我们可以一个点是否在多边形内部。

我们遍历每一个面,只要我们能找到一个平面到点的距离是正的,那么这个点就在多边形外,否则点在多边形内部。

image

示意代码如下:

var inside = true
for p in planes:
 # check if distance to plane is positive
 if (p.distance_to(point) > 0):
 inside = false
 break # with one that fails, it's enough

是不是很酷?但是这个更厉害!再稍稍努力一点,相似的逻辑,我们还可以判断两个凸多边形是否重叠。这招叫做分离轴检测法(Separating Axis Theorem 简写为SAT),大多数物理引擎用SAT进行碰撞检测。

对于一个点,我们只需检查是否有一个平面返回正距离就足以告诉我们这个点是否在平面外。对于一个多边形,我们必须找到一个平面对于另一个多边形上所有的点都返回一个正距离。这个检测先要对A的所有平面对B的所有点进行,然后再对B的所有平面对A的所有点进行:

image

示意代码如下:

var overlapping = true
​
for p in planes_of_A:
 var all_out = true
 for v in points_of_B:
 if (p.distance_to(v)             
关注
打赏
1656935939
查看更多评论
0.4976s