javascript - 在 Three.js 中无法让尾部摇摆(动画)?

标签 javascript three.js

嘿,如果有人可以帮我制作这个对象的动画:

上下移动| 左-右旋转 | a 查找 | z 向下看

原始文件链接:http://www.aacctrust.org/anim/anim.htm

JSON 模型文件(带有动画 tail-wag):

http://wikisend.com/download/654748/wolf.json

问题是 json 模型文件已提供有关尾部动画的必要详细信息。狼的尾部应该是摇动的。 但事实并非如此,我已经尝试了一切但没有帮助。

代码有问题还是我没有从 Blender 正确导出。

下面是代码:

<html>

<head>
    <style>
        body { margin: 0; }
    </style>
</head>

<body>  
<canvas id="myCanvas"></canvas>


   <script src="three.js"></script>

    <script>

     var scene = new THREE.Scene();
     var canvas = document.getElementById("myCanvas");
     renderer = new THREE.WebGLRenderer({ canvas: canvas });
     var camera = new THREE.PerspectiveCamera( 75, (canvas.width / canvas.height) , 1, 10000 );
     var clock  = new THREE.Clock(),mixer;
     var forest,wolf,animation;            
     var fwd,bck,lft,rgt,up,down = 0 ;
     var action = {};

    camera.fov *= 0.3;
    camera.updateProjectionMatrix();            

    renderer.setSize( window.innerWidth, window.innerHeight);
    document.body.appendChild( renderer.domElement );
    renderer.setClearColor (0x22222222, 1);

    camera.position.z = 28;

    var material = new THREE.MeshPhongMaterial( { map:       THREE.ImageUtils.loadTexture('wolf_uvcons.png') } );
    // Wolf Texture Above # Forest Uses Local Materials @Blender

    var loader = new THREE.JSONLoader();

    loader.load('forest.json', function(geometry, materials) {
               forest = new THREE.Mesh(geometry, new   THREE.MeshFaceMaterial(materials));
               forest.scale.x = forest.scale.y = forest.scale.z = 0.25;
               forest.rotateX( Math.PI / 2 );forest.rotateZ( Math.PI  );           //load :env:
                forest.translation = THREE.GeometryUtils.center(geometry);
                scene.add(forest);
        });




    loader.load('wolf.json', function(geometry, materials) {
       wolf = new THREE.SkinnedMesh(geometry,material);
       wolf.scale.x = wolf.scale.y = wolf.scale.z = 0.25;                  //load wolf
       wolf.translation = THREE.GeometryUtils.center(geometry);
       scene.add(wolf);
       wolf.add(camera);
       wolf.translateY(-27); /// Bring it down
       wolf.translateZ(100); /// Bring it down

      action.idle  = new THREE.AnimationAction(geometry.animations[ 0 ]);         
      action.idle.weight  = 1;

  // Create animation mixer and pass object to it
      mixer = new THREE.AnimationMixer(wolf);
      mixer.addAction( action.idle );

      });


    var light = new THREE.AmbientLight(0xFFFFFFFF,1);
    scene.add(light);
    var pointLight = new THREE.PointLight( 0xffcccc,0.41 );
    pointLight.position.set( 0, 100, 3 );
    scene.add( pointLight );
    var pointLight1 = new THREE.PointLight( 0xff0000,0.81 );
    pointLight1.position.set( 100, 200, 3 );
    scene.add( pointLight1 );

    function moveWolf()
    {

        if (fwd==1)
        { wolf.translateZ(-1);}
        if (bck==1)
        { wolf.translateZ(1);}
        if (lft==1)
        { wolf.rotateY(Math.PI/200)}
        if (rgt==1)
        { wolf.rotateY(-Math.PI/200);}
        if (up==1)
        { camera.rotateX(Math.PI/200);}
        if (down==1)
        { camera.rotateX(-Math.PI/200);}

      }

    function animate() {

    requestAnimationFrame( animate );
    moveWolf();
    render();

    var delta = clock.getDelta();
    var theta = clock.getElapsedTime();

    if ( mixer ) { mixer.update( delta ); }
 }

 function render() {
    renderer.render( scene, camera );
  }

   animate();
</script>

<script>
document.onkeydown = checkKey1;
document.onkeyup = checkKey2;

function checkKey1(e) {

e = e || window.event;

if (e.keyCode == '38') {
    // up arrow
    fwd=1;
}
else if (e.keyCode == '40') {
    // down arrow
    bck=1;
}
else if (e.keyCode == '37') {
   // left arrow
   lft=1;
}
else if (e.keyCode == '39') {
   // right arrow
   rgt=1;
}
else if (e.keyCode == '65') {
   up=1;
}
else if (e.keyCode == '90') {
   down=1;
}
}


function checkKey2(e) {

e = e || window.event;

if (e.keyCode == '38') {
    // up arrow
    fwd=0;
}
else if (e.keyCode == '40') {
    // down arrow
    bck=0;
}
else if (e.keyCode == '37') {
   // left arrow
   lft=0;
}
else if (e.keyCode == '39') {
   // right arrow
   rgt=0;
}
else if (e.keyCode == '65') {
   // right arrow
   up=0;
}
else if (e.keyCode == '90') {
   // right arrow
   down=0;
}

}
</script>

</body>
</html>

最佳答案

更新:

在等待回复的过程中我进行了一次 self 探索之旅;)

并找到了一个几乎可以接受的解决方案,步骤如下:

  1. 文件 >> 导出 >> Wavefront (OBJ)

  2. 确保选中“动画”选项。

  3. 单击导出(导出时请在单独的文件夹中进行,因为根据帧数,文件可能会很大。)

  4. 复制 Blender > Python > Bin 目录中的文件夹。

  5. 将转换器从 Three.js utils OBJ for python3 复制到 Blender > Python > Bin 目录。

  6. 在管理模式下启动命令提示符并运行以下命令:

python objtothirdjs_conv_python3 -i meshdirname\meshname_000001.obj -o output.js -m "meshdirname\meshname_*.obj"

输出动画将是变形动画,并且需要对混合器进行一些更改才能播放变形动画。

关于javascript - 在 Three.js 中无法让尾部摇摆(动画)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37026641/

相关文章:

Javascript替换,带逗号的字符串

javascript - 计算 Three.js 投影中的顶部、左侧、宽度、高度

javascript - 试图多次加载 Angular

javascript - 从当前选项卡上下文打开一个新选项卡(何时关闭弹出窗口)?

javascript - 检测div何时为 "unloaded"

javascript - 使用 React 将提交的表单值保存在 JSON 文件中

javascript - 如何获取 Three.js 模型的特定高度的顶点?

javascript - 使用JavaScript创建三个Js标签方法

node.js - 我可以使用 draco 编码器和 node.js 来压缩 glb 文件吗?

javascript - Three.js 不可见平面不适用于 raycaster.intersectObject