在libgdx中移动网格的位置

时间:2013-04-09 15:05:46

标签: libgdx

我有一个带有一些多边形(shapeRenderer)的世界,并希望有一个箭头,当用户改变他的GPS位置时它会移动。我以为我可以用网格做,但我没有找到任何选项将网格移动到另一个位置。

Mesh mesh = new Mesh(true, 6, 0, 
        new VertexAttribute(Usage.Position, 2, "a_position")
);
mesh.setVertices(new float[] { -0.3f, -0.3f,
            0   , 0,
            0f  , 0.7f,
            0   , 0,
            0.3f, -0.3f,
            0f  , 0.7f  });
mesh.render(GL10.GL_TRIANGLE_STRIP, 0, 6);

是否可以选择更改整个网格的位置?或者我可以获得所有顶点以创建具有新位置的新网格吗?

2 个答案:

答案 0 :(得分:3)

(至少)有几种“移动”网格的方法。 Libgdx对此没有特别支持,它与任何OpenGL应用程序具有相同的选项:

  1. 更改顶点
  2. 使用翻译矩阵
  3. 将网格渲染为纹理并移动纹理
  4. 更改顶点,当您想要“移动”网格时,您必须跟踪float[]并对其进行变异(或重新创建)。您可以使用新数据再次调用setVertices

    对于翻译矩阵方法,请参阅How do I rotate or translate individual object instances in OPENGL?但是,请注意,最近使用的是更新的OpenGL API。 (我不清楚他们用什么代替它,但是:我认为你应该自己做矩阵数学,这基本上是选项#1。)

    对于渲染到纹理选项,使用Libgdx FrameBuffer object渲染到该选项,然后使用Libgdx Sprite移动/渲染该纹理。请注意,Sprite实现仅构建在一个简单的顶点四边形上,并且实际上doing option #1可以在屏幕上移动精灵,所以只有当你的网格非常复杂并且有很多时,这个选项才有意义。很多顶点。

    嗯......既然我已经写完了,看起来这三个都归结为选项1:你应该自己跟踪网格顶点的实际位置。

答案 1 :(得分:2)

我知道这是旧的,但我做的是

mesh.transform(matrix);
mesh.render();
mesh.transform(matrix.inv());