我有Collada格式的多个模型(knight.dae& archer.dae)。 我的问题是我无法将它们全部设置为动画(让我们说Idle with是2-3帧)。 当我加载场景时,我或者只获得一个动画模型和一个stil模型(没有动画,没有任何东西,就像他在3ds max中建模一样)。 我知道我的问题是皮肤和变形,但我搜索了很多,没有找到答案,由于我的经验不足,我的尝试到目前为止失败了。 请帮忙!
//animation length of the model is 150(and it hosts 4 different animations)
var startFrame = 0, endFrame = 150, totalFrames = endFrame - startFrame, lastFrame;
var urls = [];
var characters = [];
urls.push('3D/archer/archer.dae');
urls.push('3D/archer/archer.dae');
//here's the loader
loader = new THREE.ColladaLoader();
loader.options.convertUpAxis = true;
for (var i=0;i<urls.length;i++) {
loader.load(urls[i],function colladaReady( collada ){
player = collada.scene;
player.scale.x = player.scale.y = player.scale.z =10;
player.position.y=115;
player.position.z=i*200;
player.updateMatrix()
skin = collada.skins [ 0 ];
//skinArray.push(skin);;
var mesh=new THREE.Mesh(new THREE.CubeGeometry(10,20,10,1,1,1));
player.add(mesh);
characters.push(mesh);
scene.add( player );
});
}
//i added the cube because i use raycaster and it doesnt detect collada obj
// Here is where i try my animation.
function animate() {
requestAnimationFrame( animate );
render();
}
function render() {
update();
renderer.render(scene,camera);
}
function update() {
var delta = clock.getDelta();
delta = delta / 2;
if ( t > 1 ) t = 0;
if ( skin )
{
skin.morphTargetInfluences[lastFrame] = 0;
var currentFrame = startFrame + Math.floor(t*totalFrames);
skin.morphTargetInfluences[currentFrame] = 1;
t += delta;
lastFrame = currentFrame;
}
}
答案 0 :(得分:0)
在开头尝试这样的事情:
var skins = [];
在你的collada回调中,你似乎已经考虑过:
skins.push(collada.skins[0]);
在渲染器中,而不是当前的if(skin)子句:
t += delta;
lastFrame = currentFrame;
var currentFrame = startFrame + Math.floor(t*totalFrames);
for (var i = 0; i < skins.length; i++) {
var skin = skins[i];
if (skin) {
skin.morphTargetInfluences[lastFrame] = 0;
skin.morphTargetInfluences[currentFrame] = 1;
}
}
重点是,你需要循环update()函数中的所有皮肤。我没有仔细检查帧处理代码,因为这不是问题。如果你的皮肤有不同数量的帧,你需要在你的代码中考虑这些(可能使lastFrame,currentFrame等变量与数组相匹配)皮肤阵列)。
答案 1 :(得分:0)
if ( skinArray[0] && skinArray[1] )
{
skinArray[0].morphTargetInfluences[lastFrame] = 0;
skinArray[1].morphTargetInfluences[lastFrame] = 0;
var currentFrame = startFrame + Math.floor(t*totalFrames);
skinArray[0].morphTargetInfluences[currentFrame] = 1;
skinArray[1].morphTargetInfluences[currentFrame] = 1;
t += delta;
lastFrame = currentFrame;
}
我提出了这个代码,它完成了这项工作,但我不喜欢它,主要是因为它感觉它是硬编码的。所以,如果你们中的任何一个人能够提出更优雅的解决方案我会更开心。