math - 测试视锥体相交中的轴对齐框 (AAB)

标签 math collision-detection

我读到this aabb-plane 测试教程,我无法理解所描述的“优化”aabb-plane 测试。

在“几何方法 - 测试盒 II”下,我理解了所有内容,直到这一行:

Assume a AAB that has its components x,y,and z varying between xmin and xmax; ymin and ymax; and zmin and zmax. The components of the positive vertex p are selected as follows: ...

我也没有得到后面的代码。 我的 AABB 对象由其 minVertex、maxVertex 参数定义。

你能解释一下作者的意思吗?

最佳答案

考虑下面的图片,其中对角线PS (据说)与 normal 平行向量(顺便说一句,这就是教程中所说的 AAB 案例)。这张图代表了问题的 2D 版本,其中的想法更容易解释和理解。

2D version of the problem

p-vertex根据定义,是与法线方向进一步对齐的方向。这意味着您必须决定以下四个向量中的哪一个与法线进一步对齐:

R - Q, Q - R, P - S or S - P                        (1)

在本例中答案是 S - P ,这意味着Sp-vertexP n-vertex 。但问题是如何以编程方式检测到这一点。

嗯,dot product两个向量之间测量其中一个向量到另一个向量的投影,因此问题可以重述为: (1) 中的哪个向量与法线 (xn, yn) 具有最大点积。 ?

这是四个点积:

(xn, yn).(R - Q) = xn(x1 - x2) + yn(y1 - y2)
(xn, yn).(Q - R) = xn(x2 - x1) + yn(y2 - y1)
(xn, yn).(P - S) = xn(x1 - x2) + yn(y2 - y1)
(xn, yn).(S - P) = xn(x2 - x1) + yn(y1 - y2)

所以,我们正在寻找的是使总和的两项都为正的那个,这就是

  • 如果 xn > 0选择x2 - x1 ( >0 ) 否则 x1 - x2 (<0)
  • 如果 yn > 0选择y2 - y1 ( >0 ) 否则 y1 - y2 (<0)

原因是符号规则(++ = +-- = +。)

所有这些都转化为

  1. p-vertex = (x1, y1) 开头
  2. 如果 xn > 0 ,更改x1x2 (有效地离开 p-vertex = (x2, y1) )
  3. 如果 yn > 0 ,更改y1y2 (有效地离开 p-vertex = (x*, y2) )

(在步骤 3 中,x*x1x2,具体取决于 setp 2 的结果)

如果您处于三维空间,这些论点仍然有效。唯一的区别是你必须添加 z坐标无处不在。

关于math - 测试视锥体相交中的轴对齐框 (AAB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33577445/

相关文章:

.net - DotNumerics、AlgLib、dnAnalytics、Math.net、F# for Numerics、Mtxvec?

c - Wolfram Alpha 的指数怎么能这么快?

java - Activity 重新启动后功能发生变化

c++ - (CGAL) 获取AABB树生成的bounding cube做碰撞检测

algorithm - 找到方程式的数学算法

java - 获取线和形状的交点

ios - ccpSub 实现获取 2 个坐标的角度

javascript - 如何检测 html5 Canvas 中半圆的碰撞?

将矩形放置在多边形内的算法

c# - 在运行时更新网格对撞机的替代方案?