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 绘图。
我有一个绘制贴花的工作代码:
初始化:
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 绘图。