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(当前的 nightlies,在 v0.9.8 之后的任何版本中)包含一个椭圆绘图方法,因此您可以忽略此答案的其余部分。不过,该ShapeRenderer方法在其他方面也发生了变化(例如,ShapeTypeis just FilledLinePointnow)。

对于那些坚持使用旧 API 的人,您应该能够通过确保缩放发生在原点周围来解决失真问题。这是一个标准的 OpenGL 实践(所以它有点迟钝,但他们遵循 OpenGL 的领导)。请参阅矩阵变换的 Opengl 顺序OpenGL:缩放然后平移?如何?. 更好的是(再次是标准的 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 回答