LibGDX:向现有 3d 模型添加新动画
Posted
技术标签:
【中文标题】LibGDX:向现有 3d 模型添加新动画【英文标题】:LibGDX: add new animation to existed 3d model 【发布时间】:2018-04-16 00:12:45 【问题描述】:我使用 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 中的一个错误。
我想听听关于这个问题的专家意见。
【问题讨论】:
您能否发布一个小而完整的工作示例来演示该问题? 我觉得已经写得很详细了。 我无法运行您发布的代码。我已经将 libgdx 用于 3d 动画,但我没有遇到与您相同的问题,但是如果我看不到您的代码,很难说您可能做错了什么。如果你展示了你的代码,那么帮助你调试会更容易。不管怎样,祝你好运 从您提供的代码 sn-ps 看来,您正在通过向动画数组添加完全不同的项目来手动修改模型实例。这当然行不通。如果您想使用完全不同的模型,那就这样做吧。 @Xoppa 我在不同的文件中有很多动画。这样做是为了使模型不会加载太久。用户不需要一次所有的动画,他可以通过点击加载当前动画。现在我将 ModelInstance 类移动到我的代码中,并稍微更改 copyAnimations 方法,并在将新动画添加到模型后调用它。它工作正常,但有没有最好的方法来合并来自不同文件的动画? 【参考方案1】:我找到了一个比每次添加动画后都创建新 ModelInstance 更好的解决方案。 看看我对 LibGDX 的拉取请求 https://github.com/libgdx/libgdx/pull/4972
方法 copyAnimation 将是公开的。
然后我们可以在从assets加载新动画后直接将它添加到我们的ModelInstance中。
assetManager.load(animation, Model.class);
assetManager.finishLoading();
Model animModel = assets.get(animation, Model.class)
modelInstance.copyAnimations(animModel.animations);
【讨论】:
以上是关于LibGDX:向现有 3d 模型添加新动画的主要内容,如果未能解决你的问题,请参考以下文章
Windows Universal现有应用程序向SQLite表添加新列
Unity3D使用 FBX 格式的外部模型 ( 向 Unity 中添加 FBX 模型 | 向 Scene 场景中添加 FBX 模型 | 3D 物体渲染 | 3D 物体材质设置 )