LibGDX:为现有的3D模型添加新动画

时间:2017-11-03 09:51:33

标签: java animation 3d libgdx blender

我使用libgdx渲染3d模型。 首先,我从资产中加载我的模型:

assetManager.load(name, Model.class);
assetManager.finishLoading();
Model model = assets.get(name, Model.class)

我的模型带有一个空闲动画。下次我创建动画控制器并开始使用动画渲染模型。

ModelInstance modelInstance = new ModelInstance(model);
AnimationController controller = new AnimationController(modelInstance);   
controller.setAnimation(modelInstance.animations.first().id, -1);

渲染方法

controller.update(Gdx.graphics.getDeltaTime());
modelBatch.begin(cam);
modelBatch.render(model, environment);
modelBatch.end();

效果很好,动画播放。

当我尝试加载并运行下一个动画时,问题就开始了。

assetManager.load(animation, Model.class);
assetManager.finishLoading();
Model animModel = assets.get(animation, Model.class)

modelInstance.model.animations.add(animModel.animations.first());
System.out.println("animation size "+modelInstance.model.animations.size); // prints 2

controller.setAnimation(modelInstance.model.animations.get(1).id, -1);

然后发生错误

com.badlogic.gdx.utils.GdxRuntimeException: Unknown animation: acrobat
W/System.err: atcom.badlogic.gdx.graphics.g3d.utils.AnimationController.obtain(AnimationController.java:158)atcom.badlogic.gdx.graphics.g3d.utils.AnimationController.animate(AnimationController.java:349)
at com.badlogic.gdx.graphics.g3d.utils.AnimationController.animate(AnimationController.java:331)
at com.badlogic.gdx.graphics.g3d.utils.AnimationController.animate(AnimationController.java:303)
at com.snaappy.ar.game.MyGameRenderer$5.run(MyGameRenderer.java:768)
at com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame(AndroidGraphics.java:488)
at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1562)
at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1262) 

看起来该动画尚未添加到ModelInstance。

接下来我尝试直接将动画添加到 ModelInstance

modelInstance.animations.add(animModel.animations.first());

而不是

modelInstance.model.animations.add(animModel.animations.first());

错误不再出现,但动画未播放。
模型有两个动画,但只能播放最初的第一个空闲动画。

通过重新创建 ModelInstance AnimationController 解决了这个问题。每次加载动画后,我都必须重新创建这些对象。

modelInstance.model.animations.add(animModel.animations.first());
ModelInstance modelInstance = new ModelInstance(modelInstance.model);
AnimationControllercontroller = new AnimationController(modelInstance);   

我认为这不好。 它看起来像LibGDX中的一个错误。

我想听听关于这个问题的专家意见。

1 个答案:

答案 0 :(得分:0)

我发现了一个比添加动画后每次创建新ModelInstance更好的解决方案。
看看我对LibGDX https://github.com/libgdx/libgdx/pull/4972的拉取请求

方法 copyAnimation 将是公开的。

然后我们可以在从资产加载新动画后直接将它添加到我们的ModelInstance中。

assetManager.load(animation, Model.class);
assetManager.finishLoading();
Model animModel = assets.get(animation, Model.class)

modelInstance.copyAnimations(animModel.animations);