如何在Box2dweb(JavaScript)中获取碰撞的X、Y坐标?
Box2DWeb:获取碰撞接触点坐标的正确方式
问题描述
在Box2DWeb中,碰撞触发时会通过b2ContactListener.prototype.BeginContact生成对应的contact对象。目前可以通过以下代码获取Fixture的UserData:
var a = contact.GetFixtureA().GetUserData(); var b = contact.GetFixtureB().GetUserData();
但尝试通过Body的位置方法获取碰撞坐标时,得到的并非实际碰撞点:
// 此代码获取的是Body中心坐标,不是碰撞发生的具体点位 var aColX = contact.GetFixtureA().GetBody().GetPosition().x; var aColY = contact.GetFixtureA().GetBody().GetPosition().y;
需要从contact.GetFixtureA()关联的对象中获取实际碰撞点的X、Y坐标,正确方法是什么?
解决方案
你要获取的是碰撞接触点的坐标,而非Body的中心位置。在Box2DWeb中,需从contact对象的接触流形(Manifold)中提取,代码示例如下:
// 先确认当前碰撞存在有效接触点 if (contact.GetManifold().pointCount > 0) { // 创建b2Vec2对象用于存储世界坐标系下的碰撞点 var worldContactPoint = new b2Vec2(); // 获取世界坐标系中的碰撞点坐标 contact.GetWorldManifold(worldContactPoint); // 提取碰撞点的世界坐标值 var colX = worldContactPoint.x; var colY = worldContactPoint.y; // 可选:将世界坐标转换为Fixture所属Body的本地坐标(相对于Body自身原点) var bodyA = contact.GetFixtureA().GetBody(); var localContactPoint = bodyA.GetLocalPoint(worldContactPoint); var localColX = localContactPoint.x; var localColY = localContactPoint.y; }
关键说明
contact.GetWorldManifold()返回的是碰撞点在世界坐标系中的真实位置,这才是两个Fixture实际接触的点位。GetBody().GetPosition()获取的是Body的中心坐标,和碰撞点位置没有直接关联,这是你之前代码无法得到正确碰撞坐标的核心原因。
内容的提问来源于stack exchange,提问作者Diego
相关产品推荐
相关产品推荐

