前腐后继 发表于 2006-12-13 10:51:00

椭球体和顶点之间的碰撞检测

<span id="TopicDetail_DataList1__ctl0_lblPostBody">对于某些比较特殊的模型,用包围盒碰撞得到的精确度会有些偏差,尤其是在对于人物背后的披风和人物模型发生碰撞的时候,用普通的包围盒碰撞会得到非常不协调的结果。 <br/><br/>这个时候椭球体碰撞就显得尤其的重要,那么下面我们就来看看如何判断一个椭球体和一个顶点的碰撞。 <br/><br/>首先我们需要的是一个数据结构来描叙一个椭球体: <br/>vector3&nbsp;midpoint; <br/>vector3&nbsp;longradius; <br/>float&nbsp;shortradius; <br/><br/>只需要一个中点,一个带方向的长经,和一个标量短经就可以完整的在空间中描叙一个椭球体。然后我们判断的思想就是根据椭圆的方程(是椭圆,不是椭球)传入顶点的坐标,可以算出在这个坐标下,在椭圆上的点。然后做从中点到那个点的连线,如果长度大于那个顶点到中点的连线,则那个顶点在椭球内,即发生了碰撞。 <br/><br/>具体的做法是: <br/>首先将椭球平移到0,0,0,然后将长经旋转到跟x轴重合,再绕x轴旋转顶点和y轴的夹角,这个时候就可以用椭圆方程(x/(a^2))&nbsp;+&nbsp;(y/(b^2))&nbsp;=&nbsp;1来算出在椭圆上的点的y轴坐标,然后比较两根线段的长度即可,具体代码如下: <br/>double&nbsp;len&nbsp;=&nbsp;CalDist(source,&nbsp;&amp;cur.midpoint); <br/>D3DXMATRIX&nbsp;m,&nbsp;m1; <br/>D3DXVECTOR3&nbsp;cross(1,0,0); <br/>D3DXMatrixTranslation(&amp;m1,&nbsp;source-&gt;x,&nbsp;source-&gt;y,&nbsp;source-&gt;z); <br/>D3DXMatrixTranslation(&amp;m,&nbsp;-cur.midpoint.x,&nbsp;-cur.midpoint.y,&nbsp;-cur.midpoint.z); <br/>D3DXMatrixMultiply(&amp;m,&nbsp;&amp;m,&nbsp;&amp;m1); <br/>XMatrixVecToVec(&amp;m1,&nbsp;&amp;cur.longradius,&nbsp;&amp;cross); <br/>D3DXMatrixMultiply(&amp;m,&nbsp;&amp;m,&nbsp;&amp;m1); <br/>double&nbsp;r&nbsp;=&nbsp;atan(m._43&nbsp;/&nbsp;m._42); <br/>D3DXMatrixRotationX(&amp;m1,&nbsp;r); <br/>D3DXMatrixMultiply(&amp;m,&nbsp;&amp;m,&nbsp;&amp;m1); <br/>double&nbsp;y&nbsp;=&nbsp;(1&nbsp;-&nbsp;m._41&nbsp;/&nbsp;sqr(cur.shortradius))&nbsp;*&nbsp; <br/>sqr(CalDist(&amp;cur.midpoint,&nbsp;&amp;cur.longradius)); <br/>其中XMatrixVecToVec的实现为首先算出两个向量之间的叉乘,得到一根垂线,然后绕那根垂线旋转他们点乘出来的角度,即可以得到将两个向量旋转到一起。 <br/><br/>然后判断if(len&nbsp;&gt;&nbsp;sqrt(sqr(m._41)&nbsp;+&nbsp;sqr(y)))即可以得出顶点是否与椭球体发生碰撞。<br/></span>
页: [1]
查看完整版本: 椭球体和顶点之间的碰撞检测