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());

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

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

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 物体材质设置 )

添加新按钮并替换现有按钮并以流畅的动画消失

如何在LibGDX中的表格布局中添加动画?

向现有 JQGRID 添加新列

Symfony2 - 向现有实体添加新字段