资源描述:
《球体弹性碰撞模拟.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、球体弹性碰撞模拟by:zh1110碰撞检测技术是很多游戏重要的组成部分首先我们为球和碰撞的平面定义两个类型,计算时使用DX辅助库中向量的相关函数,以达到较佳性能 '球的定义TypeballposAsD3DVECTOR'位置vAsD3DVECTOR'速度accAsD3DVECTOR'加速度boAsBoolean'是否掉落场外EndType'自定义平面格式(三角面)Typeshdowv0AsD3DVECTOR'面法向v1AsD3DVECTOR'顶点1v2AsD3DVECTOR'顶点2v3AsD3DVECTOR'顶点3dAsSingle'距圆点距离En
2、dTypePublicba(20)Asball球在未与平面发生碰撞时作平抛运动或自由落体运动,位置和速度的物理公式为:s=vt v=at如果我们将系数设置为1,周期为1秒,那么每次计算速度时,只需将速度与加速度简单的向量相加便得到结果,位置的计算也可类似处理Fork=0To20D3DXVec3Addba(k).v,ba(k).v,ba(k).accD3DXVec3Addba(k).pos,ba(k).v,ba(k).posNext 球与墙壁的弹性碰撞为了产生碰撞,首先必须必须知道球是否撞到了平面,弹性碰撞无能量损失,速度不会减慢但方向改变了,须计算反弹的方向。
3、1根据物体的运动规律计算物体在将渲染的一帧2判断物体在前一帧和当前帧时的位置与平面S的关系:如果上一帧在平面前,而当前帧在平面后因为前后两帧物体在平面的异侧,说明物体穿过了平面S。d=D3DXVec3Dot(showed(i).v0,ba(j).pos)-showed(i).d'计算当前帧球体中心到平面的距离D3DXVec3Scalevettore3,ba(j).v,-1 '速度反向D3DXVec3Addvettore3,vettore3,ba(j).pos'计算前一帧球体中心位置d2=D3DXVec3Dot(showed(i).v0,vettore3)-showed
4、(i).d'计算前一帧球体中心到平面的距离Ifd<4Andd2>4Then '在平面的异侧,4是球体半径 判断是否在三角形内:物体在平面的异侧,但这时还不能说物体与三角形发生了碰撞,因为三角形是有边界的,还需进一步判断撞击点是否在三角形三条边范围之内穿过平面: 如图,从交点到三角形的三个顶点作向量,计算相领向量的夹角余弦a1,a2,a3,如果夹角余弦和小于-1则点在三角形内部,如果夹角余弦和大于-1则点在三角形外,夹角余弦的计算可通过两个单位向量作点积。D3DXVec3Scalevettore,showed(i).v0,-dD3DXVec3Addvettore1
5、,ba(j).pos,vettore '计算交点D3DXVec3Subtractv0,vettore1,showed(i).v1 '交点到三个顶点的向量D3DXVec3Subtractv1,vettore1,showed(i).v2D3DXVec3Subtractv2,vettore1,showed(i).v3D3DXVec3Normalizev0,v0 '计算夹角余弦需先单位化向量D3DXVec3Normalizev1,v1D3DXVec3Normalizev2,v2c0=D3DXVec3Dot(v0,v1) '计算相领向量的夹角余弦值a1,a2,a3c1=D3DX
6、Vec3Dot(v1,v2)c2=D3DXVec3Dot(v2,v0)If(c0+c1+c2)<-1Then 反弹的计算:如图,我们将速度分解为平行于平面的分量Vx和投影到平面法向的Vy. Vy因为受碰撞力反向变成Vy',但速度的大小不变,然后将Vy'与Vx相加就得到碰撞后的速度V'.D3DXVec3Scalevettore3,showed(i).v0,-d+4D3DXVec3Addba(j).pos,ba(j).pos,vettore3 '重新定义位置D3DXVec3Crossvettore1,showed(i).v0,ba(j).v '垂直D3DXVec3Norm
7、alizevettore1,vettore1D3DXVec3Crossvettore2,showed(i).v0,vettore1 '平行于平面的单位向量c1=D3DXVec3Dot(vettore2,ba(j).v) '计算Vx,Vy的长度c2=D3DXVec3Dot(showed(i).v0,ba(j).v)D3DXVec3Scalevettore2,vettore2,c1 '计算平行于平面的分量VxD3DXVec3Scalevettore,showed(i).v0,-c2 '计算投影到法向的Vy',负数即反向D3DXVec3Addba(