C# 询问Box2d是否发生碰撞
我使用的是Box2dx(移植到C#,针对XNA进行了优化)。它处理碰撞分辨率,但如何判断两个对象当前是否发生碰撞 这就是我要写的函数:C# 询问Box2d是否发生碰撞,c#,xna,box2d,physics-engine,C#,Xna,Box2d,Physics Engine,我使用的是Box2dx(移植到C#,针对XNA进行了优化)。它处理碰撞分辨率,但如何判断两个对象当前是否发生碰撞 这就是我要写的函数: public bool IsColliding(GameObjectController collider1, GameObjectController collider2) 其中collider1.Model.Body是Box2dBody,而collider1.Model.BodyDef是Box2dBodyDef。(当然,collider2也是如此。) 更新
public bool IsColliding(GameObjectController collider1, GameObjectController collider2)
其中collider1.Model.Body
是Box2dBody
,而collider1.Model.BodyDef
是Box2dBodyDef
。(当然,collider2
也是如此。)
更新:看起来像联系人侦听器,或者这可能很有用:
AABB collisionBox;
model.Body.GetFixtureList().GetAABB(out collisionBox);
为什么
GetFixtureList()
返回一个夹具?如果知道形状类型,可以使用以下任何函数直接检查重叠
public static void Collision.CollideCircles(ref Manifold manifold,
CircleShape circle1, XForm xf1, CircleShape circle2, XForm xf2);
public static void Collision.CollidePolygonAndCircle(ref Manifold manifold,
PolygonShape polygon, XForm xf1, CircleShape circle, XForm xf2);
public static void Collision.CollideEdgeAndCircle(ref Manifold manifold,
EdgeShape edge, XForm transformA, CircleShape circle, XForm transformB);
public static void Collision.CollidePolyAndEdge(ref Manifold manifold,
PolygonShape polygon, XForm transformA, EdgeShape edge, XForm transformB);
public static void Collision.CollidePolygons(ref Manifold manifold,
PolygonShape polyA, XForm xfA, PolygonShape polyB, XForm xfB);
它们都有两种形状和两种变换。结果是一个流形对象,其中包含形状边界相交处的点集合。如果点数大于零,则发生碰撞
通过类实现ContactListener接口,可以间接获得相同的信息
public class MyContactListener : ContactListener {
// Called when intersection begins.
void BeginContact(Contact contact) {
// ...
// Make some indication that the two bodies collide.
// ...
}
// Called when the intersection ends.
void EndContact(Contact contact) {
// ...
// Make some indication that the two bodies no longer collide.
// ...
}
// Called before the contact is processed by the dynamics solver.
void PreSolve(Contact contact, Manifold oldManifold) {}
// Called after the contact is processed by the dynamics solver.
void PostSolve(Contact contact, ContactImpulse impulse) {}
}
这两具尸体禁止接触。_fixtureA.Body和Contact。_fixtureB.Body。您必须向World注册侦听器对象
GetFixtureList()、GetBodyList()、GetJointList()等。返回链接列表中的第一个元素。通过对元素调用GetNext()可以找到列表中的下一个元素。您可以使用以下代码迭代列表。当GetNext()返回null时,没有更多的元素
// Given there is a Body named body.
for (Fixture fix = body.GetFixtureList(); fix; fix = fix.GetNext()) {
// Operate on fix.
}