Box2D: How to get the position of a sensor?

我怕爱的太早我们不能终老 提交于 2020-01-06 16:50:50

问题


Edit I've updated this question here: Box2D: How to get the position of a static body?

I'm using sensors in a Box2D project. On a collision with a sensor, I'd like to know the sensor's position in the world. I'm detecting the collision with a contact listener, but the sensor's position is always 0 0.

From my code: (edit, added the whole class)

public class MyContactListener extends b2ContactListener {

    public var onSensorEvent:Function;

    override public function BeginContact(contact:b2Contact):void {                 
        if(contact.GetFixtureA().IsSensor()) {
            var ud1:GameEntity = contact.GetFixtureA().GetBody().GetUserData();
            Util.traceVec(contact.GetFixtureA().GetBody().GetTransform().position);
            Util.traceVec(contact.GetFixtureB().GetBody().GetTransform().position);
            Util.traceVec(contact.GetFixtureA().GetBody().GetPosition());
            Util.traceVec(contact.GetFixtureB().GetBody().GetPosition());
            onSensorEvent(ud1);
        }

        if(contact.GetFixtureB().IsSensor()) {
            var ud2:GameEntity = contact.GetFixtureB().GetBody().GetUserData();
            Util.traceVec(contact.GetFixtureA().GetBody().GetTransform().position);
            Util.traceVec(contact.GetFixtureB().GetBody().GetTransform().position);
            Util.traceVec(contact.GetFixtureA().GetBody().GetPosition());
            Util.traceVec(contact.GetFixtureB().GetBody().GetPosition());
            onSensorEvent(ud2);
        }
    }       
}

Other than this, the sensor works normally and registers collisions as normal. Any ideas why might this be happening, and how I can fix it?

I'm using Box2DFlash version 2.1a, but I don't expect this is specific to Flash.

Edit my code to create bodies in the world:

    private function createWorldBody(x_origin:Number, y_origin:Number, box_width:Number, box_height:Number, angle:Number, 
                                     density:Number, friction:Number, bounce:Number, entity:GameEntity):b2Body {

        trace("creating body: x=" + x_origin + " y="+ y_origin + " w=" + box_width + " h=" + box_height); 
        var body:b2BodyDef= new b2BodyDef();
        if(entity.type == GameEntity.TYPE_PLAYER) body.type = b2Body.b2_dynamicBody;

        // shape
        var box:b2PolygonShape = new b2PolygonShape();
        if(entity.type == GameEntity.TYPE_PLAYER) {
            box.SetAsOrientedBox(box_width/2/pixelsPerMeter, box_height/2/pixelsPerMeter, new b2Vec2(0,0), angle);
        } else {
            box.SetAsOrientedBox(box_width/2/pixelsPerMeter, box_height/2/pixelsPerMeter, new b2Vec2(x_origin/pixelsPerMeter,y_origin/pixelsPerMeter), angle);
        }

        // fixture
        var fixture:b2FixtureDef = new b2FixtureDef();
        fixture.shape = box;
        fixture.density = density;
        fixture.friction = friction;
        fixture.restitution = bounce;
        if(entity.type == GameEntity.TYPE_ANIMATION_TRIGGER) {
            fixture.isSensor = true;
        }

        // world body
        var worldBody:b2Body = world.CreateBody(body);
        worldBody.CreateFixture(fixture);

        if(entity.type == GameEntity.TYPE_PLAYER) {
            worldBody.SetPosition(new b2Vec2(0, 6));
            worldBody.SetAngularDamping(playerAngDamping);
        } else {
            worldBody.SetAngularDamping(0.1);
        }

        Util.traceVec(worldBody.GetPosition());
        worldBody.SetUserData(entity);
        return worldBody;           
    }

Sample output from the createWorldBody method:

creating body: x=10768.85 y=129.1 w=242.1 h=508.2 angle=0
0 0 
creating body: x=13314.9 y=-176.35 w=176.05 h=39.4 angle=0
0 0
creating body: x=14324.4 y=304.3 w=116.05 h=207.6 angle=0
0 0
creating body: x=12819.449999999999 y=336.5 w=905.3 h=156.2 angle=0
0 0

Sample output from the contact listener after two collisions:

20.84107631571526 6.26063858024741
0 0
20.84107631571526 6.26063858024741
0 0
34.444376903802855 4.2002747636658855
0 0
34.444376903802855 4.2002747636658855
0 0

Edit I think I see it: it's because the sensors are static bodies, which don't have 'real' positions in the world.


回答1:


As a test, you may want to use the body's transform, as in:

contact.GetFixtureB().GetBody().GetTransform().position;

Can you post more code pertaining to the creation of the bodies and fixtures? Maybe there are some clues there as to why you current code is not working as expected.



来源:https://stackoverflow.com/questions/5664928/box2d-how-to-get-the-position-of-a-sensor

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!