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

使用collada从blender导出时,动画材质颜色在three.js中不起作用,three.js,blender,collada,Three.js,Blender,Collada,我试图在对象上模拟闪烁的灯光,因此我正在设置材质颜色的动画。然后,我通过collada导出器将blender模型导出到three.js中 为了演示这个问题,我创建了一个带有单个立方体的模型,在这个立方体上我将颜色从红色更改为绿色,然后再更改为红色。我还移动了一点立方体 在第0帧,我将立方体设为红色,没有位移: 在第12帧处,我将其变为绿色并稍微置换: 当我在blender中播放动画时,我看到颜色变化和立方体置换。但是,当我将它与collada一起导出到three.js中时,立方体会移动,但它

我试图在对象上模拟闪烁的灯光,因此我正在设置材质颜色的动画。然后,我通过collada导出器将blender模型导出到three.js中

为了演示这个问题,我创建了一个带有单个立方体的模型,在这个立方体上我将颜色从红色更改为绿色,然后再更改为红色。我还移动了一点立方体

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

在第12帧处,我将其变为绿色并稍微置换:

当我在blender中播放动画时,我看到颜色变化和立方体置换。但是,当我将它与collada一起导出到three.js中时,立方体会移动,但它会保持一种颜色(我导出它时处于活动状态的立方体的颜色,例如,它可以是红色或绿色,但始终是一种颜色)。我已经演示了这个问题。我的collada代码基于这个示例。以下是用于加载模型的代码:

  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;
  }
factory.LoadColladModel=函数(){
log(`now in loadColladaModel`);
var loader=new THREE.ColladaLoader();
loader.options.convertUpAxis=true;
var承诺=新承诺((解决、拒绝)=>{
loader.load('color_animation.dae',(collada)=>{
log(`now in collada load closure`);
让model=collada.scene;
工厂.场景.添加(模型);
factory.animations=collada.animations;
model.scale.x=model.scale.y=model.scale.z=5.0;
对于(变量i=0;i
为了让three.js设置材质(颜色)变化和运动的动画,我必须做什么?我确实在collada文件的“animation”标记下看到颜色条目,所以我假设collada支持它。我看到有人为了让材料发挥作用而设定目标。我也需要这样做吗?变形目标是仅用于运动,还是也用于颜色

3.js r84 搅拌机2.78b


非常感谢。

看起来three.js ColladaLoader根本不支持材质动画(它只支持位置和旋转动画)。我通过查看collada加载程序返回的原始数据结构来确定这一点。请注意,与位置动画相对应的对象0如何具有SID(字符串ID)和关键点等。与材质动画相对应的对象1没有SID或关键点。当材质动画数据位于原始collada文件中时,ColladLoader解析器根本不读取它,因此没有颜色动画

显然,Collada装载机符合mrdoob(截至2016年5月)。有一个ColladaLoader2,它应该是ColladaLoader的下一个版本,但我试过了,它似乎根本不支持任何动画。我一直在阅读,事实上,这是一个老化的格式,基本上看起来就像是一个死胡同,就未来的增长而言(?)

不幸的是,我尝试过obj、json和stl加载程序,而collada加载程序是迄今为止最好的。我目前正在研究gltf格式,它基本上看起来像是下一代collada(例如,新的和改进的版本也来自Khronos group)。我觉得很有用。基本上,几年前有一个three.js用户编写了自己的ColladLoader,但后来他放弃了Collada,现在支持glTF

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

看起来我现在必须继续使用Collada,用javascript制作材质动画