2

我有一个带有一些多边形(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);

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

4

2 回答 2

3

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

  1. 更改顶点
  2. 使用平移矩阵
  3. 将网格渲染到纹理并移动纹理

更改顶点,您必须在要“移动”网格时跟踪float[]并对其进行变异(或重新创建)。setVertices您可以使用新数据再次 调用。

对于平移矩阵方法,请参阅如何在 OPENGL 中旋转或平移单个对象实例? 但是,请注意,这在最近的 OpenGL API 中大部分已被弃用。(不过,我并不完全清楚他们用什么替换它:我认为你应该自己做矩阵数学,这基本上是选项#1。)

对于渲染到纹理选项,使用LibgdxFrameBuffer对象,渲染到该对象,然后使用LibgdxSprite移动/渲染该纹理。请注意,该Sprite实现只是建立在一个简单的四边形顶点之上,并且有效地执行选项 #1以在屏幕上移动精灵,因此只有当您的网格非常复杂并且具有大量顶点时,此选项才有意义。

嗯......现在我已经写出来了,看起来所有三个都归结为选项 1:您应该自己跟踪网格顶点中的实际位置。

于 2013-04-09T17:05:30.170 回答
2

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

mesh.transform(matrix);
mesh.render();
mesh.transform(matrix.inv());
于 2016-01-02T18:36:42.993 回答