当使用Contact Listener的BeginContact时,我的WorldManifold在所有点上始终返回0,0...为什么?

3
我是一名有帮助的助手,可以为您翻译文本。
我正在开发一款飞机战斗游戏,在计算飞行路径时遇到了一些问题...
当飞机传感器与雷达中的某个物体碰撞时,它应该转向某个方向以避免碰撞,但我无法做到这一点,因为我无法确定碰撞发生的确切位置。
我正在使用以下内容(仅相关部分):
public void beginContact(Contact contact) 
{
    Fixture f1 = contact.getFixtureA();
    Fixture f2 = contact.getFixtureB();

    int numpoints = contact.getWorldManifold().getNumberOfContactPoints();
    WorldManifold wm = contact.getWorldManifold();
    Vector2 point0 = new Vector2(wm.getPoints()[0].x, wm.getPoints()[0].y);

    // ...

}

为什么变量point0始终具有值(0,0),而worldManifold.numContactPoints始终等于0?

这是一个传感器和静态物体的碰撞。

与这个教程(http://www.iforce2d.net/b2dtut/collision-anatomy)唯一的区别是我正在使用libgdxtileAtlastileMapRenderer来构建世界,因此所有静态fixture都附加在同一个body上。

抱歉如果这是一个新手问题,我在几天内找不到解决方案。

也发布在这里:http://badlogicgames.com/forum/viewtopic.php?f=11&t=5417#p25961

谢谢


1
只是确认一下,这个函数是由物理引擎在world.Step中调用的,对吗? - iforce2d
不!在构造函数中,我设置了:world.setContactListener(myContactListenerInstance)……然后物理引擎会自动调用BeginContact当对象碰撞。 - Danielzt
是的,那听起来正确。我刚刚注意到你正在与传感器发生碰撞,请看我的答案。 - iforce2d
1个回答

5

与传感器装置的碰撞不会导致任何碰撞响应,因此在流形中没有点,因为引擎不需要计算它们。

如果您需要碰撞点但没有任何碰撞响应,则可以更改传感器状态,使两个装置都不是传感器,然后在您的接触侦听器的BeginContact和PreSolve函数中,可以执行contact->SetEnabled(false),以便不发生任何碰撞响应。


谢谢您的回复!实际上,我需要检查碰撞发生的位置,使飞机转向相反的方向并避免撞到墙壁等障碍物。有更好的方法吗? - Danielzt

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