变换AABB的快速算法

最近一段时间一直在重写引擎,设计和实现都有不少改变,自我感觉比以前的版本在易用性上有一定提高,除去了一些不太实用的设计。另外在一些实现细节上也有一些改进。

  前几天翻看老外的一本”3D Math Primer for Graphics and Game Development”,发现里面提到的一种变换AABB的快速算法,比我以前的实现要好的多。再查看Ogre和nnebula的代码,都没有做这样的优化。在此说明,希望对写引擎的朋友有所帮助。     设有点p,矩阵m,以及变换后的点q

q = p*m 即

q.x = p.x * m.m11 + p.y * m.m21 + p.z * m.m31 + m.41  q.y = p.x * m.m12 + p.y * m.m22 + p.z * m.m32 + m.42 

q.z = p.x * m.m13 + p.y * m.m23 + p.z * m.m33 + m.43 

  对于变换AABB来说,最直接的做法就是将起八个角点都按照上述公式变换到新的空间中,然后再找出minx,miny,minz和maxx, maxy, maxz组成新的AABB。但是仔细观察这个公式,可以发现如下的优化方法:

  以新AABB的minx为例

q.x = p.x * m.m11 + p.y * m.m21 + p.z * m.m31 + m.41

p为原始的八个角点之一,其中p.x为原min.x或max.x,y和z亦然。则八个角点形成了原min.x, max.x, min.y, max.y, min.z, max.z对这个式子的全部组合。可以看出只要计算出和式中各个部分的最小值,将它们相加,即为最终的minx。

   假如 m11 > 0, m21 > 0, m31 > 0; 则原角点(minx, miny, minz)变换后取得最小x值。 假如 m11 < 0, m21 < 0, m31 < 0; 则原角点(maxx, maxy, maxz)变换后取得最小x值。其余类推。这样只要先对矩阵元素的符号进行判断就可以可避免多余的计算。

  “3D Math Primer for Graphics and Game Development” 一书提供有支持网站
http://gamemath.com 。上面有源代码下载。

点赞