对于某些比较特殊的模型,用包围盒碰撞得到的精确度会有些偏差,尤其是在对于人物背后的披风和人物模型发生碰撞的时候,用普通的包围盒碰撞会得到非常不协调的结果。
这个时候椭球体碰撞就显得尤其的重要,那么下面我们就来看看如何判断一个椭球体和一个顶点的碰撞。
首先我们需要的是一个数据结构来描叙一个椭球体:
vector3 midpoint;
vector3 radius;
vector3 direction;
只需要一个中点,一个方向,和一个描叙三条半径长度的向量就可以完整的在空间中描叙一个椭球体。然后我们判断的思想就是根据椭球体的方程(是椭圆,不是椭球)传入顶点的坐标,然后看方程的和是否小于1,小于1即在椭球体内。
具体的做法是:
D3DXMatrixTranslation(&mSource, source->x, source->y, source->z);
D3DXMatrixTranslation(&mEllipsoid, -sCur.vMidpoint.x, -sCur.vMidpoint.y, -sCur.vMidpoint.z);
D3DXMatrixMultiply(&mSource, &mSource, &mEllipsoid);
XMatrixVecToVec(&mEllipsoid, &sCur.vDirection, &(D3DXVECTOR3(1,0,0)));
D3DXMatrixMultiply(&mSource, &mSource, &mEllipsoid);
float x = mSource._41;
float y = mSource._42;
float z = mSource._43;
float a = sCur.vRadius.x;
float b = sCur.vRadius.y;
float c = sCur.vRadius.z;
if(sqr(x) / sqr(a) + sqr(y) / sqr(b) + sqr(z) / sqr(c) < 1.0) return true;
其中XMatrixVecToVec的实现为首先算出两个向量之间的叉乘,得到一根垂线,然后绕那根垂线旋转他们点乘出来的角度,即可以得到将两个向量旋转到一起。
这个时候椭球体碰撞就显得尤其的重要,那么下面我们就来看看如何判断一个椭球体和一个顶点的碰撞。
首先我们需要的是一个数据结构来描叙一个椭球体:
vector3 midpoint;
vector3 radius;
vector3 direction;
只需要一个中点,一个方向,和一个描叙三条半径长度的向量就可以完整的在空间中描叙一个椭球体。然后我们判断的思想就是根据椭球体的方程(是椭圆,不是椭球)传入顶点的坐标,然后看方程的和是否小于1,小于1即在椭球体内。
具体的做法是:
D3DXMatrixTranslation(&mSource, source->x, source->y, source->z);
D3DXMatrixTranslation(&mEllipsoid, -sCur.vMidpoint.x, -sCur.vMidpoint.y, -sCur.vMidpoint.z);
D3DXMatrixMultiply(&mSource, &mSource, &mEllipsoid);
XMatrixVecToVec(&mEllipsoid, &sCur.vDirection, &(D3DXVECTOR3(1,0,0)));
D3DXMatrixMultiply(&mSource, &mSource, &mEllipsoid);
float x = mSource._41;
float y = mSource._42;
float z = mSource._43;
float a = sCur.vRadius.x;
float b = sCur.vRadius.y;
float c = sCur.vRadius.z;
if(sqr(x) / sqr(a) + sqr(y) / sqr(b) + sqr(z) / sqr(c) < 1.0) return true;
其中XMatrixVecToVec的实现为首先算出两个向量之间的叉乘,得到一根垂线,然后绕那根垂线旋转他们点乘出来的角度,即可以得到将两个向量旋转到一起。