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());
错误不再出现但动画不播放。
模型有两个动画,但只能播放原来的第一个空闲动画。
这个问题通过重新创建ModelInstance和AnimationController解决了。每次加载动画后,我都必须重新创建这些对象。
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);
我使用 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());
错误不再出现但动画不播放。
模型有两个动画,但只能播放原来的第一个空闲动画。
这个问题通过重新创建ModelInstance和AnimationController解决了。每次加载动画后,我都必须重新创建这些对象。
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
方法 copyAnimation 将是 public.
然后我们可以在从资产加载新动画后直接将它添加到我们的 ModelInstance。
assetManager.load(animation, Model.class);
assetManager.finishLoading();
Model animModel = assets.get(animation, Model.class)
modelInstance.copyAnimations(animModel.animations);