如何确定轴alignment边界框碰撞中的碰撞法线?

我有一个3d移动盒和一个固定的盒子。 我可以检测到碰撞,但现在我想将移动盒滑动到固定盒上作为碰撞响应。 为此,我需要与移动盒碰撞的脸部正常。 有谁知道我怎么弄出来的? 碰撞testing似乎没有给我这个信息。 任何帮助表示赞赏。

为了计算飞机的法线(相撞的AABB表面),您需要:

  • 该平面的3个点(2个非平行边缘)。
  • 这个平面的两个边向量的叉积(通常来自同一起点)。

这将产生一个垂直于这个平面的vector(但是一个平面有两个边)。


这里是一个如何计算交叉乘积的例子。

让A,B,C和D成为AABB相撞一侧的四个点。

[B]---(c) | | [A]---[D] 

如果我们用ABC,那么平面的法线就是

 ADxAB (if we want a normal pointing out of the screen) ABxAD (if we want a normal pointing inside the screen) 

(这是因为我们的例子是面向屏幕,如果从左侧看到飞机,则第一个正常点将指向右侧,第二个点将指向左侧)

正如你所看到的那样,你拿分数的顺序会影响正常人会指向的那一面。 这就是为什么开发人员通常按照指定的顺序(顺时针或逆时针方向存储它们的点数,但对于所有的表面都是一样的),所以他们知道按照何种顺序使用它们。


现在看到更多的细节:

 AB = [ Bx-Ax, By-Ay, Bz-Az ] AD = [ Dx-Ax, Dy-Ay, Dz-Az ] 

以下是如何获得第一个正常

 ADxAB = [ ADx, ADy, ADz ] X [ ABx, ABy, ABz ] = [ (ADy*ABz - ADz*ABy), (ADz*ABx - ADx*ABz), (ADx*ABy - ADy*ABx) ] 

第二个正常指向另一边

 ABxAD = [ ABx, ABy, ABz ] X [ ADx, ADy, ADz ] = [ (ABy*ADz - ABz*ADy), (ABz*ADx - ABx*ADz), (ABx*ADy - ABy*ADx) ] 

如果用前面(Bx-Ax,By-Ay,Bz-Az等)计算出的差异代替ABx,ABy,ABz等值,交叉积可以得到法向量。