You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 12:35:19