JBox2d:负重力导致物体上升?

时间:2013-01-31 13:29:56

标签: android box2d jbox2d

我是JBox2D的新手学习者。我刚刚在Android上尝试JBox2D(我知道Android开发并且我很擅长),因为我的项目需要物理。

现在,Box2D的教程和“官方用户手册”说负重力会导致物体被吸引向下。 但是,在我的情况下,当我将 Vec2 的第二个参数设置为负数时,该对象被吸引了!怪异。

以下代码会导致圆形形状自行上升:

重力:

Vec2 gravity = new Vec2(0.0f, -50.0f);
boolean doSleep = true;
world = new World(gravity, doSleep);

圆形是通过以下代码制作的:

    //body definition
    BodyDef bd = new BodyDef();
    bd.position.set(200, 500);  
    bd.type = BodyType.DYNAMIC;

    //define shape of the body.
    CircleShape cs = new CircleShape();
    cs.m_radius = 10f;  

    //define fixture of the body.
    FixtureDef fd = new FixtureDef();
    fd.shape = cs;
    fd.density = 1f;
    fd.friction = 0.2f;        
    fd.restitution = 0.8f;

    //create the body and add fixture to it
    body =  world.createBody(bd);
    body.createFixture(fd);

我正在使用SurfaceView画布绘制:

canvas.drawCircle(body.getPosition().x, body.getPosition().y, 10, paint);

步骤如下:

float timeStep = 1.0f / 60.f;
int velocityIterations = 6;
int positionIterations = 2;

world.step(timeStep, velocityIterations, positionIterations);

那么,我的代码中有什么问题?我无法确定我所犯的错误。

另外, 我正在Android上制作类似网球的2D游戏,我将使用JBox2D。那么,任何人都能告诉我关于JBox2D的教程/书吗?虽然我用力搜索,但我找不到一个好的教程。 (虽然Box2D似乎很受欢迎而不是JBox2D)

如果有人能帮助我,我将非常感激。谢谢。

1 个答案:

答案 0 :(得分:2)

在Box2D中有标准坐标系:Y向上,X向右。在图形系统中,通常,坐标系Y指向下,因为窗口有静态左上角。看起来像你的图形系统一样。那么,Box2D正在向下移动,你会看到向上移动。

这是一个烦躁的问题,引导重力并不是最好的解决方案。如果仅更改重力,则需要在许多其他情况下考虑上下问题,例如,在定义实体,应用力等时。最烦人的是,它不容易理解,物理坐标如何符合图形(例如,在我的一个项目中,我必须在纸上画点,然后将纸张翻转,旋转180个等级并查看光线:)

您无法更改Box2D坐标系,但最有可能的是,您可以通过更改平移矩阵轻松更改图形系统的坐标系。例如,在OpenGL中它看起来像这样:

glScalef(1.0, -1.0, 1.0);

但请注意,在此之后,所有具有正Y坐标的内容都将在屏幕上不可见(它将位于窗口的上边缘之上)。因此,您需要使用负坐标。如果你不想这样,你可以像这样翻译矩阵:

glTranslatef(0.0, -windowHeight.0, 0.0)

但之前,如果要调整窗口大小,请考虑该怎么做。

关于第二个问题。我怀疑你是否可以找到JBox2D的任何教程或书籍。 JBox2D是Box2D的端口(这意味着它是Box2D的精确副本),并为它编写特殊的书看起来很奇怪。学习Box2D,你对JBox2D没有任何问题。例如,您可以查看there