私が正しく理解していれば、LibGDXはaddActionsメソッドを使用して画像を回転させています。
this.addAction( parallel(rotateBy(360, 0.5f), moveTo(320, 100, 0.5f)));
つまり、画像のpoint =(0,0)によって回転しているということです。
これが私の質問です:
オブジェクトの中心点で画像を回転する方法はありますか?真ん中に固定して、車のホイールのように回すようなものですか? rotateByとrotateToメソッドは、画像自体の(0,0)ポイントでそれを回転させます。
アクターの「原点」を正しく設定する必要があります。 Actor APIから、原点が位置を基準にしており、スケールと回転に使用されていることがわかります。
したがって、中間点を計算し、原点を中間点に設定します。
Actor a;
....
a.setOrigin(a.getWidth()/2, a.getHeight()/2);
Libgdxでアクターを回転させる簡単な方法は次のとおりです。
まず、原点を設定する必要があります。
img.setorigin(width/2,hieght/2);
これで、必要に応じて時計回りと反時計回りに回転できます。
img.rotate(2f);
または
img.rotate(-2f);
最も簡単な方法は、0,0ポイントが中心になるようにオブジェクトを移動し、回転させてから、元の位置に移動することです。私はlibGDXに精通していませんが、3つの変換を集約する方法があるはずです。つまり、1つの集約された変換のみをオブジェクトに適用します。変換を集約する順序が違いを生むことを覚えておいてください。
まったく同じ結果が得られるはるかに複雑な方法では、回転によって作成されたオフセットの量を計算し、画像を原点に戻す必要があります。このようにしないでください。 3つの単純な変換を組み合わせることは、進むべき方法であり、変換を使用する最も良い理由の1つです。
**編集 [〜#〜] api [〜#〜] Actorオブジェクトにはtranslate()メソッドがあります。これを使用して、0,0ポイントが中央になるように画像をシフトします。擬似コードで;
x = this.getX();
y = this.getY();
cx = this.getWidth() * .5;
cy = this.getHeight() * .5;
this.translate(-(x+cx), -(y+cy)); // move so 0,0 is the centre of the Actor object
this.rotate(thisMuch); // rotate the Actor
this.translate((x+cx), (y+cy)); // move it back to its original location
これにより、オブジェクトがその中心点を中心にその場で回転します。複雑に見えますが、実際にはかなり効率的です。これらのメソッドを駆動する行列(変換)を直接操作できる場合はさらにそうです。
原点を設定するために私が見つけた最も簡単で最短の方法は、次のように呼び出すことです。
Actor a;
...
a.setOrigin(Align.center);