在libgdx中在球体上绘制文本

我正在尝试libgdx渲染一些fbx模型,我成功地做到了这一点,但我坚持一点。

我在ModelInstance的帮助下渲染一个篮球fbx文件,现在我想在那个篮球上画一个文本。 我可以在篮球上画出文字,但是它的线条不是篮球的一部分。 我希望文字以与该球相同的曲线方式。

这是我如何绘制文本 –

batch = new SpriteBatch(); batch.setProjectionMatrix(camera.combined); FreeTypeFontGenerator generator = new FreeTypeFontGenerator(Gdx.files.internal("font/Lato-Bold.ttf")); FreeTypeFontGenerator.FreeTypeFontParameter parameter = new FreeTypeFontGenerator.FreeTypeFontParameter(); parameter.size = 30; parameter.color = com.badlogic.gdx.graphics.Color.WHITE; parameter.magFilter = Texture.TextureFilter.Linear; // used for resizing quality parameter.minFilter = Texture.TextureFilter.Linear; generator.scaleForPixelHeight(3); BitmapFont aFont = generator.generateFont(parameter); aFont.getRegion().getTexture().setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear); aFont.draw(batch, options.get(i), aBound.getCenterX(), aBound.getCenterY() + textHeight / 2); 

在哪里–Bound – > BoundingBox的模型(即BasketBall)

Solutions Collecting From Web of "在libgdx中在球体上绘制文本"

你想在这里实现的是libGdx稍微复杂。 然而你的方法是不正确的,因为你正在将文本作为一个独立的精灵对象绘制在你的球的顶部。

达到此目的的正确步骤是将文本绘制到纹理上,然后映射并将纹理绑定到球上。

程序可以分为4个部分 –

  1. 设置字体生成和帧缓冲区对象
  2. 设置sprite批处理
  3. 绘制文本,将纹理映射到模型
  4. 渲染模型

作为一个说明,我想提一下,可以使用任何其他纹理,如果你不想实时更新文本,你可以很容易地使用任何你想要的文本预制纹理。

代码如下 –

设置字体生成和帧缓冲区对象

 //Create a new SpriteBatch object batch = new SpriteBatch(); //Generate font FreeTypeFontGenerator generator = new FreeTypeFontGenerator(Gdx.files.internal("font/Lato-Bold.ttf")); FreeTypeFontGenerator.FreeTypeFontParameter parameter = new FreeTypeFontGenerator.FreeTypeFontParameter(); parameter.size = 30; parameter.color = com.badlogic.gdx.graphics.Color.WHITE; parameter.magFilter = Texture.TextureFilter.Linear; // used for resizing quality parameter.minFilter = Texture.TextureFilter.Linear; generator.scaleForPixelHeight(10); //Get bitmap font BitmapFont aFont = generator.generateFont(parameter); aFont.getRegion().getTexture().setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear); //Generate new framebuffer object of 128x128 px. This will be our texture FrameBuffer lFb = new FrameBuffer(Pixmap.Format.RGBA4444,128,128,false); 

设置sprite批处理

 //Set the correct resolution for drawing to the framebuffer lFb.begin(); Gdx.gl.glViewport(0,0,128,128); Gdx.gl.glClearColor(1f, 1f, 1f, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); Matrix4 lm = new Matrix4(); //Set the correct projection for the sprite batch lm.setToOrtho2D(0,0,128,128); batch.setProjectionMatrix(lm); 

最后将文本绘制到纹理上

 batch.begin(); aFont.draw(batch,"Goal!",64,64); batch.end(); lFb.end(); 

将纹理映射到模型

 //Generate the material to be applied to the ball //Notice here how we use the FBO's texture as the material base Material lMaterial = new Material(TextureAttribute.createDiffuse(lFb.getColorBufferTexture())); //Since I do not have a sphere model, I'll just create one with the newly //generated material ballModel = mb.createSphere(1.0f,1.0f,1.0f,8,8,lMaterial, VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal | VertexAttributes.Usage.TextureCoordinates); //Finally instantiate an object of the model ballInstance = new ModelInstance(ballModel); 

渲染模型

 mBatch.begin(mCamera); mBatch.render(ballInstance); mBatch.end(); //Rotate the ball along the y-axis ballInstance.transform.rotate(0.0f,1.0f,0.0f,0.5f); 

结果

将文本渲染到球体libGDX