我有一个用于绘制贴花的工作代码:
INIT:
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();
但我制作面对面的文字时遇到了麻烦。
谢谢
答案 0 :(得分:3)
我不会尝试贴花方法,因为它没有设置文字。 SpriteBatch已经设置为文本。
(Decal方法理论上可以表现得更好,因为你不需要为每个文本字符串单独进行绘图调用。但是,你必须滚动自己版本的BitmapFont和BitmapFontCache兼容贴花。当然,如果您这样做,您可以提交拉取请求并将其添加到libgdx。)
SpriteBatch代码看起来很熟悉。 :)基本上你需要做的是修改textTransform
矩阵,使其旋转对象面向摄像机。 SpriteBatch设置为绘制面向Z方向的扁平材料。因此,您需要旋转Z矢量以面向相机。
首先,您需要一个可以重复使用的Vector3。
private static Vector3 tmpVec3 = new Vector3();
然后你想找到从文本中心指向相机的矢量。我假设您在这里名为textPosition
的Vector3中存储文本在3D空间中的位置:
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中绘图。