Поворот формы opengl при вращении тела box2d

У меня есть простое приложение Java, в котором используются JOGL и JBox2D.
Ниже показано, как приложение отображает.

3 прямоугольника, 2 динамических и 1 статический, то есть земля

Я могу переместить 1 из Rectangle влево, вправо или прыгнуть с помощью KeyListener и соответствующим образом отрегулировать тела BodyLinearVelocity.
Но если Rectangle (которое я могу переместить) упадет с другого динамического Rectangle, графическое представление Box2D Body вращается неправильно.
Похоже, Body Box2D вращается, но GL2.GL_QUADS остается стоять.
Видите пустое место на картинке ниже, я полагаю, что Rectangle должен выглядеть так, как будто он стоит на одном из своих краев, если он правильно повернут?

Как я могу добиться этого сопоставления между JOGL и JBox2D?

Графическая модель вращается неправильно

public class Level extends org.jbox2d.dynamics.World {

    private Vector<Rectangle> levelObjects = new Vector<Rectangle>();

    public Level(Vec2 gravity) {
        super(gravity);

        this.setGravity(gravity);

        levelObjects.add(
                new Rectangle(
                    new Vec2(17.0f, 10.0f),
                   0.0f,
                   2.0f,
                   2.0f,
                        BodyType.DYNAMIC,
                        1.0f,
                        0.8f,
                        0.3f,
                        this));

             levelObjects.add(
                new Rectangle(
                    new Vec2(22.0f, 10.0f),
                   0.0f,
                   2.0f,
                   2.0f,
                        BodyType.DYNAMIC,
                        1.0f,
                        0.8f,
                        0.3f,
                        this));
    }

    protected void draw(GLAutoDrawable gLDrawable){

        gLDrawable.getGL().getGL2().glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);

        for (Rectangle object : levelObjects){
            object.draw(gLDrawable);
        }
    }
}

Это определение Rectangle:

public class Rectangle {

    private Vec2 centerPoint;
    private PolygonShape blockShape;
    private BodyDef bodydef;
    private Body body;
    private World world;
    private float width;
    private float height;

    public Rectangle (Vec2 centerPoint, 
              float angle, float width, float height,
          BodyType bt, float density, float friction, float restitution, 
          World w) { 

        this.world = w;
            this.angle = angle
        this.width = width;
        this.height = height;

        blockShape = new PolygonShape();
        blockShape.setAsBox(this.width, this.height);

        FixtureDef fixtureDef = new FixtureDef();
        fixtureDef.shape = blockShape;
        fixtureDef.density = density;
        fixtureDef.friction = friction;
        fixtureDef.restitution = restitution;

        bodydef = new BodyDef();
        bodydef.type = BodyType.DYNAMIC;
        bodydef.position.set(this.centerPoint.x, this.centerPoint.y);

        body = world.createBody(bodydef);
        body.createFixture(fixtureDef);
        body.setType(bt);
    };

    void draw(GLAutoDrawable gLDrawable){
        gLDrawable.getGL().getGL2().glLoadIdentity();

        gLDrawable.getGL().getGL2().glColor3f(0.0f, 60.0f, 120.0f);
        gLDrawable.getGL().getGL2().glTranslatef(this.body.getPosition().x, this.body.getPosition().y, -6.0f);
        gLDrawable.getGL().getGL2().glRotatef(this.body.getAngle(), 0, 1, 0);
        gLDrawable.getGL().getGL2().glBegin(GL2.GL_QUADS);
        gLDrawable.getGL().getGL2().glTexCoord2f(0.0f, 0.0f);
        gLDrawable.getGL().getGL2().glVertex3f(-this.width, -this.height, 0.0f);
            gLDrawable.getGL().getGL2().glTexCoord2f(0.0f, 1.0f);
        gLDrawable.getGL().getGL2().glVertex3f(-this.width, this.height, 0.0f);
        gLDrawable.getGL().getGL2().glTexCoord2f(1.0f, 1.0f);
        gLDrawable.getGL().getGL2().glVertex3f(this.width, this.height, 0.0f);  
        gLDrawable.getGL().getGL2().glTexCoord2f(1.0f, 0.0f);
        gLDrawable.getGL().getGL2().glVertex3f(this.width, -this.height, 0.0f);
        gLDrawable.getGL().getGL2().glEnd();                
        gLDrawable.getGL().getGL2().glFlush();
    }
}

person bobbyrne01    schedule 07.04.2014    source источник


Ответы (2)


glRotatef принимает угол в градусах на входе, и вы должны убедиться, что ваша ось вращения правильно ориентирована и нормализована. Советую задавать вопросы о JOGL на нашем официальном форуме.

person gouessej    schedule 08.04.2014

this.body.getAngle() вернул угол в радианах, поэтому я преобразовал в градусы и повернул по оси Z.
Теперь это работает..

gLDrawable.getGL().getGL2().glTranslatef(this.body.getPosition().x, this.body.getPosition().y, -6.0f);
gLDrawable.getGL().getGL2().glRotated(Math.toDegrees(this.body.getAngle()), 0, 0, 1);
gLDrawable.getGL().getGL2().glBegin(GL2.GL_QUADS);
gLDrawable.getGL().getGL2().glTexCoord2f(0.0f, 0.0f);
gLDrawable.getGL().getGL2().glVertex3f(-this.width, -this.height, 0.0f);
gLDrawable.getGL().getGL2().glTexCoord2f(0.0f, 1.0f);
gLDrawable.getGL().getGL2().glVertex3f(-this.width, this.height, 0.0f);
gLDrawable.getGL().getGL2().glTexCoord2f(1.0f, 1.0f);
gLDrawable.getGL().getGL2().glVertex3f(this.width, this.height, 0.0f);
gLDrawable.getGL().getGL2().glTexCoord2f(1.0f, 0.0f);
gLDrawable.getGL().getGL2().glVertex3f(this.width, -this.height, 0.0f);
gLDrawable.getGL().getGL2().glEnd();
gLDrawable.getGL().getGL2().glFlush(); 
person bobbyrne01    schedule 11.04.2014
comment
... что я и предложил: forum.jogamp.org/ - person gouessej; 13.04.2014