从带有collada的blender导出时,动画材质颜色在three.js中不起作用

时间:2017-03-24 07:09:07

标签: three.js blender collada

我正在尝试模拟物体上闪烁的光线,因此我正在制作材质颜色的动画。然后我通过collada导出器将blender模型导出到three.js中。

为了演示这个问题,我创建了一个带有单个立方体的模型,我将颜色从红色变为绿色再变为红色。我也稍微移动了立方体。

在第0帧,我将立方体设为红色,没有位移: enter image description here

在第12帧,我把它变成绿色并取代它: enter image description here

当我在搅拌机中播放动画时,我看到颜色变化和立方体位移。但是,当我用collada将它导出到three.js时,立方体会移动,但它保持一种颜色(我导出它时活动的立方体的颜色,例如它可以是红色或绿色,但总是一个颜色)。我created a plunker证明了这个问题。我的collada代码基于three.js collada pump示例。以下是用于加载模型的代码:

  factory.loadColladaModel = function () {
    console.log(`now in loadColladaModel`);
    var loader = new THREE.ColladaLoader();
    loader.options.convertUpAxis = true;

    var promise = new Promise( (resolve, reject) => {
      loader.load( 'color_animation.dae', (collada) => {
        console.log(`now in collada load closure`);

        let model = collada.scene;
        factory.scene.add(model);
        factory.animations = collada.animations;
        model.scale.x = model.scale.y = model.scale.z = 5.0;

        for ( var i = 0; i < factory.animations.length; ++i ) {
          var animation = factory.animations[ i ];

          var kfAnimation = new THREE.KeyFrameAnimation( animation );
          kfAnimation.timeScale = 1;
          factory.kfAnimations.push( kfAnimation );
        }

        resolve('loaded');
      })
    })

    return promise;
  }

为了获得three.js动画材质(颜色)变化以及动作,我该怎么做?我确实在collada文件的'animation'标签下看到了颜色条目,所以我认为collada支持它。我看到了这个prior question,有人必须设置morphTargets才能让材料工作。我是否也需要做这样的事情? morphTargets只用于运动,还是用于颜色?

three.js r84 搅拌机2.78b

非常感谢。

1 个答案:

答案 0 :(得分:0)

它基本上看起来像three.js ColladaLoader根本不支持素材动画(它只支持位置和旋转动画)。我通过查看collada loader返回的原始数据结构来确定这一点。注意对象0 如何对应于位置动画具有 sids (字符串ID)和键等对象1 ,它对应于素材动画,没有sid或键。虽然材质动画数据位于原始collada文件中,但ColladaLoader解析器根本无法读取它,因此没有彩色动画。

js console

显然,每个mrdoob的Collada装载机"kind of deprecated"(截至2016年5月)。有一个ColladaLoader2,它应该是ColladaLoader的下一个版本,但是我尝试了它,它似乎根本不支持任何动画。我一直在阅读collada loader,实际上这是一种老化的格式,基本上看起来就像未来的增长一样是死路一条(?)

不幸的是,我已经尝试过obj,json和stl加载器,而collada加载器是迄今为止最好的。我目前正在调查gltf格式,它基本上看起来像下一代collada(例如来自Khronos组的新版和改进版)。我发现this discussion非常有用。基本上,几年前有一个三人用户编写了他自己的ColladaLoader,但他后来放弃了Collada并且现在支持glTF。

更新:我尝试了 GLTFLoader GLTF2Loader 加载器,但遗憾的是它们在半复杂场景(具有20个对象和310个面的场景)上失败。它看起来像一个有前途的格式。我只是认为在测试导出器和测试加载器之间,它目前还不太稳定。当我用一个简单的立方体进行测试时,我几乎能够使用格式(不是材质动画)来制作动画。

看起来我现在必须留在Collada,只是在javascript中进行素材动画。