如何在Java中正确旋转多个对象?

时间:2012-12-12 18:30:29

标签: java graphics rotation box2d jbox2d

我有一个Arraylist,其中的对象包含一个对象的位置和旋转,我想使用Graphics2D在屏幕上绘制。

public void render(Graphics g1) {
Graphics2D g = (Graphics2D) g1;
g.setColor(Color.white);
for(PhysicObject object : entities) {

if (object.getBody().getType() == BodyType.DYNAMIC) {
            Vec2 position = object.getBody().getPosition().mul(30);
            g.translate(position.x, position.y);
            g.rotate(object.getBody().getAngle());
            g.fillRect((int)-(object.width), (int)-(object.height), (int)(object.width*2), (int)(object.height*2));
        }
    }

}

第一个对象总是正确旋转,但是下面的对象围绕第一个旋转而不是围绕它们自己。

希望有人可以帮助我,谢谢。

3 个答案:

答案 0 :(得分:5)

要独立旋转每个对象,必须撤消第一个对象的平移和旋转。因此,最简单的方法是使用AffineTransform“组合”两个转换并更容易地撤消它们。 e.g。

    AffineTransform t = new AffineTransform();
    t.translate(position.x, position.y);        
    t.rotate(object.getBody().getAngle());
    g.transform(t);
    g.fillRect((int)-(object.width), (int)-(object.height), (int)(object.width*2), (int)(object.height*2));
    try{
        g.transform(t.createInverse());
    }catch(NoninvertibleTransformException e){
        //...
    }

createInverse()创建“反向”转换并将Graphics空间返回到其原始状态。然后下一个转换应该可以正常工作。

答案 1 :(得分:0)

当您translaterotate时,这会永久影响您的图形对象。 fillRect调用后,务必将其翻译并旋转到原始原点和方向。

g.translate(-position.x, -position.y);
g.rotate(-object.getBody().getAngle());

答案 2 :(得分:0)

不要使用Graphics上下文旋转方法,而是尝试使用AffineTransformation

您需要在每个循环上重置转换。

更好的方法是利用形状API并转换形状