我正在尝试使用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绘制椭圆,并将椭圆绘制在我指定的精确坐标处?理想情况下,如果椭圆包含在矩形中,则意味着椭圆的原点位于左上角。
答案 0 :(得分:1)
新的Libgdx ShapeRenderer
API(当前的夜晚,无论在v0.9.8之后的任何版本中都会包含ellipse drawing method,因此您可以忽略此答案的其余部分。 ShapeRenderer
方法在其他方面也发生了变化(例如,ShapeType
现在只有Filled
,Line
或Point
。
对于那些坚持使用旧API的人来说,你应该能够通过确保缩放发生在原点周围来解决失真问题。这是一个标准的OpenGL实践(所以它有点迟钝,但它们遵循OpenGL的领先优势)。请参阅Opengl order of matrix transformations和OpenGL: 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();