3D中的XNA冲突

时间:2014-03-14 12:49:16

标签: c# 3d xna

我一直在尝试在我的程序中进行碰撞检测。在我的程序中,立方体内有一个球。我希望球在立方体内反弹,如果我的立方体中有一个洞,我希望它能够掉出来。

我现在如何'碰撞'就是这样:

protected void Bounce()
    {
        if (ballPosition.X >= boxWidth || ballPosition.X <= -boxWidth)
            modelVelocity.X *= -1;
        if (ballPosition.Y >= boxHeight*4.18 || ballPosition.Y <= -boxHeight)
            modelVelocity.Y *= -1;
        if (ballPosition.Z >= boxLength || ballPosition.Z <= -boxLength)
            modelVelocity.Z *= -1;
    }

但是当我实施引力时,这不能很好地工作并且会发生故障。它贯穿始终。它不会留在盒子里面。那么如何检测碰撞并检测一个角度,如果有倾斜的墙壁,它会在某个方向上反弹?

2 个答案:

答案 0 :(得分:3)

要检测球和盒子何时相交,您可以分别使用BoundingSphere和BoundingBox。然后使用BoudningBox.Contains()方法和其中一种Containment类型来检测球和框边相交的时间。

仅作为一个例子:

void CollisionDetection()
{
    if (!boxBoundingBox.Contains(ballBouningSphere, ContainmentType.Contains)) 
    //if the box doesn't completely contain the ball they are overlapping
    {
        //Collision happened.
    }
}

然后对于洞,您可能想要创建一个自定义对象holes,如果球和框重叠,则检查球是否在洞中,如果是,则取消碰撞。这些只是一些想法。 HTH

答案 1 :(得分:0)

使用轴的逻辑:当X&gt; targetX和X&lt; targetX + width - &gt; X轴碰撞确认。 但这并不意味着存在碰撞:你必须为Y轴做同样的事情(对于3D也要做Z) 所以你得到:

public bool collision(Vector3 pos, Vector3 dimensions, Vector3 targetPos, 
Vector3 targetDimensions)
{
   return (pos.X + dimensions.X > targetPos.X &&
           pos.X < targetPos.X + targetDimensions.X &&
           pos.Y + dimensions.Y > targetPos.Y &&
           pos.Y < targetPos.Y + targetDimensions.Y &&
           pos.Z + dimensions.Z > targetPos.Z &&
           pos.Z < targetPos.Z + targetDimensions.Z);
}