0

我是 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);

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

另外, 我正在使用 JBox2D 在 Android 上制作类似网球的 2D 游戏。那么,谁能告诉我有关 JBox2D 的教程/书籍?虽然我用谷歌搜索,但我找不到一个好的教程。(虽然 Box2D 似乎比 JBox2D 更受欢迎)

如果有人可以在这里帮助我,我将不胜感激。谢谢你。

4

1 回答 1

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就没有问题。例如,你可以看看那里

于 2013-01-31T17:58:21.557 回答