我使用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中的一个错误。
我想听听关于这个问题的专家意见。
答案 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);