如何通过Box2d获取碰撞点或多个碰撞点?

3

我创建了自己的接触监听器,实现了通常的4种方法:BeginContact、EndContact、PreSolve、PostSolve。

从哪里可以获取这些方法的参数中当前的接触点?

我尝试过类似以下的代码,但没有帮助:

void CListener::PreSolve(b2Contact* contact, const b2Manifold* oldManifold) {
    for(int i = 0 ; i < oldManifold->pointCount; ++i) {
        b2ManifoldPoint p = oldManifold->points[i];   
    }
}

3
这可能会有所帮助:http://www.iforce2d.net/b2dtut/collision-anatomy。 - iforce2d
1个回答

2
在Box2D 2.3.2版本中,“接触”点是从b2ContactListener方法的contact参数(第一个参数)中获取的。我把“接触”放在括号里,因为这些包括了在重叠情况下获得的点(即形状已经移动到超出接触的位置)。
接触点的基本信息是从b2Contact::GetManifold()方法返回的接触点的b2Manifold结构中获得的。然而,这些坐标是与该流形相关联的两个形状的本地坐标。
如果你想要世界坐标系下的接触点(我猜这才是你想要的),你可以调用接触点的b2Contact::GetWorldManifold方法来填充一个b2WorldManifold实例。在底层,这个方法本质上是一个方便的方法,它收集了从接触中所需的信息,包括b2Manifold,然后将点转换为世界坐标。
请注意,要知道有多少个世界坐标系下的接触点实际上是有效的(可能是0、1或2),或者要知道表示接触的流形的类型,你仍然需要访问b2Manifold信息-特别是它的pointCount和type字段。
最后,@iforce2d为您链接的网页仍然很有帮助,比我在这里陈述的更加详细和直观。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接