【问题标题】:Render ellipse using libgdx使用 libgdx 渲染椭圆
【发布时间】:2012-08-05 23:06:16
【问题描述】:

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

【问题讨论】:

    标签: java libgdx


    【解决方案1】:

    新的 Libgdx ShapeRenderer API(当前的 nightlies,在 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 2011-04-15
      • 2016-06-22
      • 2015-07-04
      • 1970-01-01
      • 1970-01-01
      • 2013-01-23
      相关资源
      最近更新 更多