游戏开发

本类阅读TOP10

·DirectX 9.0 SDK 开发包下载(April 2005)
·完成端口的深入理解及一种变态用法
·初学者的福音:游戏开发新手入门指南
·linux下编写OpenGL程序的一些准备工作
·《学VC、编游戏》重点算法解疑·快一点
·Windows的消息机制与消息重定向技术
·《魔兽世界》的寻路体系和作弊原理分析
·《学VC、编游戏》重点算法解疑·再快一点
·5月新开传奇私服|6月新开传奇私服|传奇私服|新区
·《学VC、编游戏》重点算法解疑·狩猎谋生

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
椭球体和顶点之间的碰撞检测。

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

对于某些比较特殊的模型,用包围盒碰撞得到的精确度会有些偏差,尤其是在对于人物背后的披风和人物模型发生碰撞的时候,用普通的包围盒碰撞会得到非常不协调的结果。

这个时候椭球体碰撞就显得尤其的重要,那么下面我们就来看看如何判断一个椭球体和一个顶点的碰撞。

首先我们需要的是一个数据结构来描叙一个椭球体:
vector3 midpoint;
vector3 longradius;
float shortradius;

只需要一个中点,一个带方向的长经,和一个标量短经就可以完整的在空间中描叙一个椭球体。然后我们判断的思想就是根据椭圆的方程(是椭圆,不是椭球)传入顶点的坐标,可以算出在这个坐标下,在椭圆上的点。然后做从中点到那个点的连线,如果长度大于那个顶点到中点的连线,则那个顶点在椭球内,即发生了碰撞。

具体的做法是:
首先将椭球平移到0,0,0,然后将长经旋转到跟x轴重合,再绕x轴旋转顶点和y轴的夹角,这个时候就可以用椭圆方程(x/(a^2)) + (y/(b^2)) = 1来算出在椭圆上的点的y轴坐标,然后比较两根线段的长度即可,具体代码如下:
double len = CalDist(source, &cur.midpoint);
D3DXMATRIX m, m1;
D3DXVECTOR3 cross(1,0,0);
D3DXMatrixTranslation(&m1, source->x, source->y, source->z);
D3DXMatrixTranslation(&m, -cur.midpoint.x, -cur.midpoint.y, -cur.midpoint.z);
D3DXMatrixMultiply(&m, &m, &m1);
XMatrixVecToVec(&m1, &cur.longradius, &cross);
D3DXMatrixMultiply(&m, &m, &m1);
double r = atan(m._43 / m._42);
D3DXMatrixRotationX(&m1, r);
D3DXMatrixMultiply(&m, &m, &m1);
double y = (1 - m._41 / sqr(cur.shortradius)) * 
sqr(CalDist(&cur.midpoint, &cur.longradius));
其中XMatrixVecToVec的实现为首先算出两个向量之间的叉乘,得到一根垂线,然后绕那根垂线旋转他们点乘出来的角度,即可以得到将两个向量旋转到一起。

然后判断if(len > sqrt(sqr(m._41) + sqr(y)))即可以得出顶点是否与椭球体发生碰撞。



相关文章

相关软件




月光软件程序下载编程文档电脑教程网站设计网址导航网络文学游戏天地幽默笑话生活休闲写作范文安妮宝贝
电脑技术编程开发网络专区谈天说地情感世界游戏元素分类游戏热门游戏体育运动手机专区业余爱好影视沙龙
音乐天地数码广场教育园地科学大观古今纵横谈股论金人文艺术医学保健动漫图酷二手专区地方风情各行各业

月光软件站·版权所有