OBB包围盒及其碰撞检测算法(一)

之前对于游戏的物理 引擎挺感兴趣,但是碰撞算法得学习一下,AABB就不说了,给点思路基本都能做出来,但是OBB就不一样了,涉及到了一些数学知识,其实涉及到图形方面的时候,线性代数就会常用一些,虽然这个OBB病没有涉及到图形的变换,但是也用到了线性代数的东西。

如果不懂AABB和OBB是什么的话我在这里简单说一下,玩游戏的时候,游戏中的元素会发生碰撞,有的时候元素的形状不是很规则,如果直接对不规则元素进行彭专检测更麻烦并且效率低下,所以就有了一个近似的算法,就是在物体外侧加上包围盒,什么叫包围盒,如图。

OBB包围盒及其碰撞检测算法(一)_第1张图片

蓝色部分是不规则物体,外面的一圈方框就是包围盒,将整个物体近似看成一个矩形,这样虽然不精确,但是计算速度快,游戏基本都会用这样检测的办法,这样能让游戏运行的快,我们并不希望一个很小的游戏也要很高的配置来运行。包围盒也分好多种,这里主要介绍OBB,但是为了知道什么OBB,我要用AABB来对比一下

这个是OBB包围盒

OBB包围盒及其碰撞检测算法(一)_第2张图片

这个是AABB包围盒

OBB包围盒及其碰撞检测算法(一)_第3张图片

我们不难发现这两种包围盒的区别AABB的包围盒不会旋转,当物体旋转的时候,空白空间被纳入包围盒的面积更大了,这样就导致不准了。

AABB包围盒的生成也 比较容易,下面我们来看一下OBB包围盒是如何生成的,

先弄一些点,生成包围盒也就是将一些点都圈在一个方框内,有这个几个点

A(2,6) B(3,2) C(4,4) D(6,3) E(7,5);
根据这几个点做包围盒,原则就是包围盒尽可能的贴近所有点,要是AABB就好做了,去上下左右最大最小的坐标生成一个矩形就可以。但是OBB就不一样了,这里涉及到了一个叫做协方差矩阵的东西。
协方差这个词我的印象是在概率论里面听过的,协方差是什么,我说不太准确,我理解大概意思就是,有两组或者多组数据,当要比较这些数据的相关性时,发现数据的维数过多(维数就是数据项),导致比较起来困难,这时有了协方差,通过计算每组之间的协方差,这就有了一个比较参数,如果协方差是0,那就说明数据之间无关,如果不为0就是相关。大概就是这个意思,而我们计算OBB包围盒,就是要先求出这些点组成矩形的中心点,利用协方差矩阵来求,协方差矩阵大概就是这些点在一起组成相关性后的一个相关性的矩阵,个人这么理解的。这些点会有个共同的趋向。协方差矩阵就是来度量各个维度偏离其均值的程度.比如计算一个人的食量和性格开朗之间有什么关系。

这个公式来计算协方差。

这是成立 关系
协方差矩阵如下。

计算协方差矩阵不是什么问题,重要的是,我们要对角化矩阵,求出特征向量和特征值,利用特征向量来得出OBB的坐标轴
OBB包围盒及其碰撞检测算法(一)_第4张图片
求出了坐标轴,根据已知点就可以求出OBB坐标轴中心坐标,和矩形的长宽,之后就可以确定OBB包围盒了。
OBB包围盒及其碰撞检测算法(一)_第5张图片
这个是之前那几个点在坐标系里的分布,我们要在这里根据这些点画出OBB包围盒。这些点就相当于一个不规则形状内所包含所有的点。
先求出这些点的协方差矩阵

OBB包围盒及其碰撞检测算法(一)_第6张图片
就是这个矩阵。这只是一个协方差矩阵,我们还要得到它的特征值和特征向量。如果手工算的话,比较好说了,要用电脑程序算,你可以用MATLAB来算,我用MATLAB得出的结果
OBB包围盒及其碰撞检测算法(一)_第7张图片
但是我们也不能就这么直接拿MATLAB算,本着造轮子的想法就需要我们动手自己写一个函数在算。计算用的算法就是雅克比计算矩阵特征向量算法,先贴一个运行效果图,下一篇讲一下这个算法。

上面的矩阵是特征,下面的是特征向量,matlab的d是特征向量,v是特征值

你可能感兴趣的:(图形)