我是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)
如果有人能帮助我,我将非常感激。谢谢。
答案 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。