libgdx decal动态文本

时间:2014-06-23 21:52:16

标签: text libgdx decal

我正在开发Libgdx中的3D(2.5D)应用程序。 我发现贴花对于这个目的非常有用。

在我的应用程序中应该有包含动态文本的图层,现在我想知道通过贴花绘制文本的最佳方法是什么。

目前我的实现基于将BitmapFont绘制到FBO,然后我获得FBO纹理并在DecalBatch.flush()之前将其绑定到Decal。

我认为这可能不是最有效的方式,但无法找到更好的方法。

我的应用程序可以包含放入3D世界的大量文本“图层”,因此可能将每个BitmapFont绘制到FBO,并将FBO纹理绑定到Decal不是最好的方法。

你们有更好的主意吗? 这样做最有效的方法是什么?

提前Tnx!

3 个答案:

答案 0 :(得分:2)

通过适当地指定投影矩阵,您可以使用SpriteBatch直接绘制到3D空间。

首先,让Matrix4确定每个文本字符串的位置和旋转。你需要这个的原因是SpriteBatch和BitmapFont没有Z offset的参数。

由于您可以将所有翻译放入Matrix4,因此在调用draw方法时,只需绘制到0,0。

然后,您可以使用每个网格的Matrix4与相机的组合矩阵相乘,然后再将其提交给SpriteBatch。所以你需要一个单独的Matrix4来进行计算。

textTransform.idt().scl(0.2f).rotate(0, 0, 1, 45).translate(-50, 2, 25f);
//Probably need to scale it down. Scale before moving or rotating.

spriteBatch.setProjectionMatrix(tmpMat4.set(camera.combined).mul(textTransform));
spriteBatch.begin();
font.draw(spriteBatch, "Testing 1 2 3", 0, 0);
spriteBatch.end();

答案 1 :(得分:1)

如果 7 年后还有人来回答这个问题,我找到了一种更像我需要的方法。事实证明,Matrix4.rotateTowardDirection() 正是我需要的方法

        /* best to make these static, but whatever */
        Vector3 textPosition = /* the location of the text */;
        Matrix4 projection = new Matrix4();
        Matrix4 textTransform = new Matrix4(); 

        textTransform.setToTranslation(textPosition);
        textTransform.rotateTowardDirection(new Vector3().set(cam.direction).nor(), Vector3.Y);

        projection.set(cam.combined);

        Matrix4 op = spriteBatch.getProjectionMatrix().cpy();
        Matrix4 ot = spriteBatch.getTransformMatrix().cpy();

        // push the matricies
        spriteBatch.setProjectionMatrix(projection );
        spriteBatch.setTransformMatrix(textTransform);

        spriteBatch.begin();
        myFont.draw(spriteBatch, "Testing 1 2 3", 0, 0, 0, Align.center, false);
        spriteBatch.end();

        // pop the matricies
        spriteBatch.setProjectionMatrix(op);
        spriteBatch.setTransformMatrix(ot);

答案 2 :(得分:0)

要获得贴花的旋转行为,您需要先调用平移,然后再旋转textTransform矩阵。

textTransform.idt().translate(-50, 2, 25f).rotate(0, 0, 1, 45);

我对此有点困惑。也许它的历史原因来自Matrix Stack。