XNA 子弹和3D目标的碰撞检测
终于把命运艺术弹药的碰撞检测做好了,说点心得吧。
大地无敌的子弹和飞船单位的碰撞检测是这样做的 假定有一个Bullet类表示子弹 Unit类表示目标单位GetWorldMatrix()返回Unit的世界转换矩阵
Bullet类的position表示子弹在该桢的位置,positionl表示在上一桢的位置
这样用position和positionl得到两条射线与圆检测是否有交叉
如果都有交叉那么子弹和单位碰撞
那么碰撞检测类可以这样写
public class Collision
{
public static bool isCollided(Unit unit, Bullet bullet)
{
if (bullet.position != bullet.positionl)
{
Ray ray1 = new Ray(bullet.positionl, Vector3.Normalize(bullet.position - bullet.positionl));
Ray ray2 = new Ray(bullet.position, Vector3.Normalize(bullet.positionl - bullet.position));
Matrix[] transforms = new Matrix[unit.model.Bones.Count];
unit.model.CopyAbsoluteBoneTransformsTo(transforms);
foreach (ModelMesh mesh in unit.model.Meshes)
{
BoundingSphere bS = mesh.BoundingSphere.Transform(transforms[mesh.ParentBone.Index]
* unit.GetWorldMatrix());
if (bS.Intersects(ray1) != null && bS.Intersects(ray2) !=null )
{
return true;
}
}
return false;
}
else return false;
}
}
检测到true后自然就可以进行将子弹除去并造成伤害的下一步操作了
:)