我怎么做一个立方体和一个平面之间的碰撞,我可以在平面上做一个球体,但我不能在平面上计算出立方体,我知道我必须找到这个立方体的x,y,z,然后在平面上做一个检测,但是我做不出来。
这是我的碰撞测试器代码。
public static bool sphereAndSphere(Sphere a, Sphere b, ref Contact contact)
{
// Get the vector from the centre of particle B to the centre of particle A
Vector3 separationVector = b.Position - a.Position;
float sumOfRadii = a.Radius + b.Radius;
float distance = separationVector.Length();
if (distance < sumOfRadii)
{
contact.contactPoint = a.Position + separationVector / 2f;
separationVector.Normalize();
contact.contactNormal = separationVector;
contact.penetrationDepth = sumOfRadii - distance;
return true;
}
return false;
}
// This assumes that the Origin is in the centre of world
// and that the planes are the boundaries of the world and that all rigid-bodies are within the boundaries
public static bool sphereAndPlane(Sphere a, PlaneEntity b, ref Contact contact)
{
// Depth of sphere into plane (if negative, no collision)
float depth = Vector3.Dot(a.Position, b.DirectionFromOrigin) + a.Radius + b.OffsetFromOrigin;
if (depth > 0)
{
contact.contactPoint = a.Position + (a.Radius - depth) * b.DirectionFromOrigin;
contact.contactNormal = -b.DirectionFromOrigin;
contact.penetrationDepth = depth;
return true;
}
return false;
}这是一个关于魔方的测试
public static bool sphereAndBox(Sphere a, Cube b, ref Contact contact)
{
Vector3 relativePoint = Vector3.Transform(a.Position, Matrix.Invert(b.WorldTransform));
// Early out check, based on separation axis theorem
if (Math.Abs(relativePoint.X) - a.Radius > b.halfSize.X
|| Math.Abs(relativePoint.Y) - a.Radius > b.halfSize.Y
|| Math.Abs(relativePoint.Z) - a.Radius > b.halfSize.Z)
return false;
Vector3 closestPoint = Vector3.Zero;
closestPoint.X = MathHelper.Clamp(relativePoint.X, -b.halfSize.X, b.halfSize.X);
closestPoint.Y = MathHelper.Clamp(relativePoint.Y, -b.halfSize.Y, b.halfSize.Z);
closestPoint.Z = MathHelper.Clamp(relativePoint.Z, -b.halfSize.Z, b.halfSize.Z);
float distance = (closestPoint - relativePoint).LengthSquared();
if (distance < a.Radius * a.Radius)
{
contact.contactPoint = Vector3.Transform(closestPoint, b.WorldTransform);
contact.contactNormal = a.Position - contact.contactPoint;
contact.contactNormal.Normalize();
contact.penetrationDepth = a.Radius - (float)Math.Sqrt(distance);
return true;
}
return false;
}发布于 2013-08-01 21:29:11
如果平面或立方体没有轴对齐,或者立方体(宽度、长度、高度)不相等,您会发现针对平面单独测试立方体的每个角位置最容易,而不是将立方体作为一个整体进行测试。然后,当第一个角点穿过平面时,注册碰撞。
但是,如果平面和立方体都是轴对齐的,并且立方体是对称的(WLH),那么可以将立方体视为半径为立方体宽度一半的球体。
https://stackoverflow.com/questions/17984000
复制相似问题