我正在开发Libgdx中的3D(2.5D)应用程序。 我发现贴花对于这个目的非常有用。
在我的应用程序中应该有包含动态文本的图层,现在我想知道通过贴花绘制文本的最佳方法是什么。
目前我的实现基于将BitmapFont绘制到FBO,然后我获得FBO纹理并在DecalBatch.flush()之前将其绑定到Decal。
我认为这可能不是最有效的方式,但无法找到更好的方法。
我的应用程序可以包含放入3D世界的大量文本“图层”,因此可能将每个BitmapFont绘制到FBO,并将FBO纹理绑定到Decal不是最好的方法。
你们有更好的主意吗? 这样做最有效的方法是什么?
提前Tnx!答案 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。