0

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

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

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

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

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

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

提前Tnx!

4

3 回答 3

2

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

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

既然你可以把你所有的翻译放到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();
于 2014-06-24T14:25:56.060 回答
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);

于 2021-05-30T22:32:55.110 回答
0

要获得 Decals 的旋转行为,您需要先调用 translate,然后再旋转 textTransform 矩阵。

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

我对此有点困惑。也许它在历史上是从矩阵堆栈中推断出来的。

于 2014-09-23T14:29:28.510 回答