In this video tutorial we continue to look at 3D programming in LibGDX. First we look at how to convert a 3D model to work with LibGDX using fbx-conv. We then write the code to display that model and look at displaying animations. The fbx-conv application can be downloaded here.
The data file used in this example can be downloaded here (zip format). If you are interested in learning more about the process of creating the model click here.
The video is available in HD here.
The source code, and an embedded copy of the video, are available below.
Source Code
package com.gamefromscratch; import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Files; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.PerspectiveCamera; import com.badlogic.gdx.graphics.g3d.Environment; import com.badlogic.gdx.graphics.g3d.Model; import com.badlogic.gdx.graphics.g3d.ModelBatch; import com.badlogic.gdx.graphics.g3d.ModelInstance; import com.badlogic.gdx.graphics.g3d.attributes.ColorAttribute; import com.badlogic.gdx.graphics.g3d.loader.G3dModelLoader; import com.badlogic.gdx.graphics.g3d.utils.AnimationController; import com.badlogic.gdx.utils.UBJsonReader; public class ModelTest extends ApplicationAdapter { private PerspectiveCamera camera; private ModelBatch modelBatch; private Model model; private ModelInstance modelInstance; private Environment environment; private AnimationController controller; @Override public void create() { camera = new PerspectiveCamera(75,Gdx.graphics.getWidth(),Gdx.graphics.getHeight()); camera.position.set(0f,100f,100f); camera.lookAt(0f,100f,0f); camera.near = 0.1f; camera.far = 300.0f; modelBatch = new ModelBatch(); UBJsonReader jsonReader = new UBJsonReader(); G3dModelLoader modelLoader = new G3dModelLoader(jsonReader); model = modelLoader.loadModel(Gdx.files.getFileHandle("model.g3db", Files.FileType.Internal)); modelInstance = new ModelInstance(model); environment = new Environment(); environment.set(new ColorAttribute(ColorAttribute.AmbientLight,0.8f,0.8f,0.8f,1.0f)); controller = new AnimationController(modelInstance); controller.setAnimation("Mixamo.com", -1, new AnimationController.AnimationListener() { @Override public void onEnd(AnimationController.AnimationDesc animation) { } @Override public void onLoop(AnimationController.AnimationDesc animation) { Gdx.app.log("INFO","Animation Ended"); } }); } @Override public void dispose() { modelBatch.dispose(); model.dispose(); } @Override public void render() { Gdx.gl.glViewport(0,0,Gdx.graphics.getWidth(),Gdx.graphics.getHeight()); Gdx.gl.glClearColor(1,1,1,1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT|GL20.GL_DEPTH_BUFFER_BIT); camera.update(); controller.update(Gdx.graphics.getDeltaTime()); modelBatch.begin(camera); modelBatch.render(modelInstance); modelBatch.end(); } }
Video
Programming Video Tutorial LibGDX 3D