使用libgdx渲染椭圆

时间:2012-08-05 23:06:16

标签: java libgdx

我正在尝试使用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绘制椭圆,并将椭圆绘制在我指定的精确坐标处?理想情况下,如果椭圆包含在矩形中,则意味着椭圆的原点位于左上角。

1 个答案:

答案 0 :(得分:1)

新的Libgdx ShapeRenderer API(当前的夜晚,无论在v0.9.8之后的任何版本中都会包含ellipse drawing method,因此您可以忽略此答案的其余部分。 ShapeRenderer方法在其他方面也发生了变化(例如,ShapeType现在只有FilledLinePoint

对于那些坚持使用旧API的人来说,你应该能够通过确保缩放发生在原点周围来解决失真问题。这是一个标准的OpenGL实践(所以它有点迟钝,但它们遵循OpenGL的领先优势)。请参阅Opengl order of matrix transformationsOpenGL: scale then translate? and how?。更好(再次标准的OpenGL练习)你最终会按照你希望它们发生的相反顺序列出操作,所以要制作一个圆圈,将其扭曲成椭圆形,然后将它移动到你实际编写代码的特定目的地,如:

renderer.begin(ShapeType.Circle);
renderer.translate(x, y, 0);
renderer.scale(1f, (height/width), 1f);
renderer.circle(0, 0, r);
renderer.end();