使用三个 js 无法正常运行 FBX 动画

Posted

技术标签:

【中文标题】使用三个 js 无法正常运行 FBX 动画【英文标题】:FBX animations not running properly with three js 【发布时间】:2018-01-30 09:22:24 【问题描述】:

我在某些 fbx 模型上遇到动画问题。例如,如果我有一个持续 20 秒的动画,模型将保持静止 19 秒,然后所有更改将在最后一秒左右发生。在其他 fbx 模型上,动画可以正确运行。 我用来运行动画的代码如下: loader.load 回调是:

var clock = new THREE.Clock();
var mixers = [];

function(object)
        object.position.set(0,0,0);
        object.mixer = new THREE.AnimationMixer(object);
        mixers.push(object.mixer);
        console.log(object);
        for (var a = 0; a < object.animations.length; a++)
            var action = object.mixer.clipAction(object.animations[a]);
            action.play();
            console.log(action);
        



        scene.add(object);
        animate();
    

而动画代码是:

function animate() 
    requestAnimationFrame(animate);
    for(var i = 0; i < mixers.length; i++)
        mixers[i].update(clock.getDelta());
    
    render();
    stats.update();


function render() 
    if (mixer) 
        mixer.update(clock.getDelta());
    
    renderer.render(scene, camera);

有什么想法吗?谢谢!

【问题讨论】:

【参考方案1】:

根据经验,我可以告诉您,fbx ascii 导出过程(至少对于 Autodesk Maya 而言)并不总是提供任何一个

    在 Maya 或 中设置的正确开始和结束时间 提供了一组 Threejs 无法正确导入的数字。

你最终得到的是——正如你所描述的——动画中有很多时间什么都没有发生。据我所知,它通常在结尾处,但它当然也可能在开头。

您可以手动修复 fbx 文件,但添加一个函数将开始时间设置为第一帧的时间可能更容易(如果第一帧有问题,则从第二帧开始)。

我在某处有此代码,让我找到它,然后我会将其添加到此答案中。

【讨论】:

我遇到了同样的问题。当我从 Maya 导出时,动画需要一个接一个地排列,这样它们就不会全部重叠。例如剪辑 1 1-10、剪辑 2 11-33 等。将所有剪辑放入从第 1 帧开始的差异轨道会导致所有动画相互叠加,所以这不是一个选项(除非我不知道正确的导出工作流)。所以我想唯一的选择是创建一个函数来在剪辑的起始帧开始动画。知道怎么做吗?我要自己试一试,但想知道你是否有那个脚本。谢谢! 希望您已经找到答案 - 最初错过了您的帖子。 根据您的最终目标,您可以设置不同的剪辑开始播放的偏移量,方法是使用某些剪辑以延迟开始使用 animation.startAt() 或者您可以尝试分别启动每个剪辑,触发通过使用以下事件将它们从上一个剪辑的末尾移开:mixer.addEventListener('finished', function(e) ...);这些细节可以在这里找到:threejs.org/docs/#api/en/animation/AnimationAction

以上是关于使用三个 js 无法正常运行 FBX 动画的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Unity 中从 .fbx 文件创建 .anim 文件?

如何在three.js中为.fbx模型应用纹理?

UE4在运行时导入动画

两个 Three-JS 对象如何在同一页面同时运行和动画?

为啥我无法从搅拌机导出 fbx 文件中的动画?

Three.js 对模型多个动画切换展示(fbx)