libGDX 使用贴花到面向 3d 的相机绘制文本

libGDX draw a text using a decals to 3d facing camera

我有一个绘制贴花的工作代码:
初始化:

Decal decal = Decal.newDecal(1, 1, 
new TextureRegion(new Texture(Gdx.files.internal("2d/gui/badlogic.jpg"))) );
            decal.setPosition(10, 10, 10);
            decal.setScale(3);
            decals.add(decal);

绘制方法:

for (int i = 0; i < decals.size; i++) {
        Decal decal = decals.get(i);

        decal.lookAt(stage3d.getCamera().position, stage3d.getCamera().up);

        batch.add(decal);
    }
batch.flush();

我有一个用于在 3d 中编写文本的工作代码:
绘制方法:

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

但是我很难制作一个对开的文字。

谢谢

我不会尝试 Decal 方法,因为它不是为文本设置的。 SpriteBatch 已经为文本设置好了。

(Decal 方法理论上可以执行得更好,因为您不需要为每个文本字符串单独绘制调用。但是,您必须推出自己的 BitmapFont 和 BitmapFontCache 版本与 Decals 兼容。当然,如果您这样做了,您可以提交一个拉取请求并将其添加到 libgdx。)

SpriteBatch 代码看起来很眼熟。 :) 基本上您需要做的是修改 textTransform 矩阵,使其旋转一个对象以面对相机。 SpriteBatch 设置为绘制面向 Z 方向的扁平物体。所以你需要旋转一个Z向量来面对相机。

首先,您需要一个可以重复使用的 Vector3。

private static Vector3 tmpVec3 = new Vector3();

然后你想找到从文本中心指向相机的向量。我假设您在此处将文本的 3D space 位置存储在名为 textPosition 的 Vector3 中:

tmpVec3.set(camera.position).sub(textPosition); 
//tmpVec3 is now a vector pointing from the text to the camera.

现在您可以定位对象的矩阵,然后像这样旋转它以面向相机:

textTransform.setToTranslation(textPosition).rotate(Vector3.Z, tmpVec3);

现在您可以像在您发布的代码中那样使用 textTransform。确保将 BitmapFont 的对齐方式设置为 HAlignment.center,否则文本将围绕文本字符串的左端而不是中心旋转。您可能还想将 integer 参数设置为 false 以进行 3D 绘图。