XNA 子弹和3D目标的碰撞检测

终于把命运艺术弹药的碰撞检测做好了,说点心得吧。

我的子弹和飞船单位的碰撞检测是这样做的 假定有一个Bullet类表示子弹 Unit类表示目标单位GetWorldMatrix()返回Unit的世界转换矩阵

Bullet类的position表示子弹在该桢的位置,positionl表示在上一桢的位置

这样用position和positionl得到两条射线与单位模型的ModelMesh的碰撞球体检测是否有交叉

如果都有交叉那么子弹和单位碰撞

那么碰撞检测类可以这样写

终于把命运艺术弹药的碰撞检测做好了,说点心得吧。

大地无敌的子弹和飞船单位的碰撞检测是这样做的 假定有一个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后自然就可以进行将子弹除去并造成伤害的下一步操作了

:)

Leave a Reply

Your email address will not be published. Required fields are marked *