LibGDX: 向现有 3d 模型添加新动画

LibGDX: add new animation to existed 3d model

我使用 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.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());

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

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

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

我觉得这样不好。 它看起来像是 LibGDX 中的错误。

我想听听专家对这个问题的看法。

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

的 pull request

方法 copyAnimation 将是 public.

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

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

modelInstance.copyAnimations(animModel.animations);