2

ShapeRenderer を使用して楕円をレンダリングしようとしていますが、次の部分的な解決策を思いつきました:

void drawEllipse(float x, float y, float width, float height) {
    float r = (width / 2);
    ShapeRenderer renderer = new ShapeRenderer();
    renderer.setProjectionMatrix(/* camera matrix */);
    renderer.begin(ShapeType.Circle);
    renderer.scale(1f, (height / width), 1f);
    renderer.circle(x + r, y, r);
    renderer.identity();
    renderer.end();
}

これにより、指定された座標に正しい幅と高さで楕円が描画されます。ただし、スケール変換により、円がビューポートで変換されるように見えます。変換の背後にある数学を特定することに成功していません。座標が画面上のピクセルにマップされる y-up で正射影を使用しています。私は OpenGL にあまり詳しくありません。

libgdx を使用して楕円を描画し、指定した正確な座標で楕円を描画するにはどうすればよいですか? 理想的には、楕円が長方形に含まれている場合、楕円の原点が左上隅にあることを意味します。

4

1 に答える 1

1

新しい Libgdx ShapeRendererAPI (現在のナイトリー、v0.9.8 以降のリリース) には楕円描画メソッドが含まれているため、この回答の残りの部分は無視できます。ただし、方法は他のShapeRenderer方法でも変更されています (たとえば、、、または今ShapeTypeだけです)。FilledLinePoint

古い API を使用している場合は、原点の周りでスケーリングが行われるようにすることで、歪みを回避できるはずです。これは標準的な OpenGL の慣行です (少しわかりにくいですが、彼らは OpenGL のリードに従っています)。OpenGLの行列変換の順序OpenGL: scale then translate?を参照してください。そしてどうやって?. さらに良いことに (これも標準的な OpenGL の慣例です)、操作を発生させたい逆の順序で操作をリストすることになるため、円を作成し、それを楕円に変形させてから、実際に次のようなコードを記述する特定の宛先に移動します。

renderer.begin(ShapeType.Circle);
renderer.translate(x, y, 0);
renderer.scale(1f, (height/width), 1f);
renderer.circle(0, 0, r);
renderer.end();
于 2013-07-04T06:33:13.247 に答える