我正在尝试模拟物体上闪烁的光线,因此我正在制作材质颜色的动画。然后我通过collada导出器将blender模型导出到three.js中。
为了演示这个问题,我创建了一个带有单个立方体的模型,我将颜色从红色变为绿色再变为红色。我也稍微移动了立方体。
当我在搅拌机中播放动画时,我看到颜色变化和立方体位移。但是,当我用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
非常感谢。
答案 0 :(得分:0)
它基本上看起来像three.js ColladaLoader根本不支持素材动画(它只支持位置和旋转动画)。我通过查看collada loader返回的原始数据结构来确定这一点。注意对象0 如何对应于位置动画具有 sids (字符串ID)和键等对象1 ,它对应于素材动画,没有sid或键。虽然材质动画数据位于原始collada文件中,但ColladaLoader解析器根本无法读取它,因此没有彩色动画。
显然,每个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中进行素材动画。