1

Graphics2D を使用して画面に描画するオブジェクトの位置と回転を含むオブジェクトを含む Arraylist があります。

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

}

最初のオブジェクトは常に正しく回転しますが、次のオブジェクトは最初のオブジェクトを中心に回転し、それ自体は回転しません。

誰かが私を助けてくれることを願っています、ありがとう。

4

3 に答える 3

5

各オブジェクトを個別に回転するには、最初のオブジェクトの移動と回転を元に戻す必要があります。したがって、最も簡単な方法は、AffineTransform を使用して 2 つの変換を「結合」し、簡単に元に戻すことです。例えば

    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() は「反対の」変換を作成し、グラフィック空間を元の状態に戻します。その後、次の変換は正常に機能するはずです。

于 2012-12-12T18:47:29.260 に答える
0

あなたtranslaterotateこれがあなたのグラフィックオブジェクトに永続的に影響を与えるとき。fillRect呼び出し後、バスクを元の原点と方向に移動および回転してください。

g.translate(-position.x, -position.y);
g.rotate(-object.getBody().getAngle());
于 2012-12-12T18:46:46.097 に答える
0

Graphics コンテキストの回転メソッドを使用しないでください。代わりにAffineTransformationを使用してみてください。

各ループで変換をリセットする必要があります。

より良いのは、形状 API を利用して、代わりに形状を変換することです

于 2012-12-12T18:50:51.993 に答える