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

У меня есть простая установка приложения Java, которая использует JOGL и JBox2D.
Ниже показано, как приложение отображает.. 3 Rectangles, 2 - динамические, 1 - статические, т. е. земля.

3 прямоугольника, 2 являются динамическими и 1 является статическим, т.е

Я могу переместить 1 из Rectangleс левой, правой или прыгая с помощью KeyListener и регулировка тел BodyLinearVelocity соответственно.
Но если Rectangle (который я могу переместить) падает с другой динамикой Rectangleграфическое представление Box2D Body не вращается правильно.
Похоже на Box2D Body вращается, но 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();
    }
}

2 ответа

Решение

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(); 

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

Другие вопросы по тегам