我一直在尝试在我的程序中进行碰撞检测。在我的程序中,立方体内有一个球。我希望球在立方体内反弹,如果我的立方体中有一个洞,我希望它能够掉出来。
我现在如何'碰撞'就是这样:
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;
}
但是当我实施引力时,这不能很好地工作并且会发生故障。它贯穿始终。它不会留在盒子里面。那么如何检测碰撞并检测一个角度,如果有倾斜的墙壁,它会在某个方向上反弹?
答案 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);
}