Threejs实现PMD模型眨眼说话等功能

        上个章节通过加载PMD模型和VMD的动作播放MMD的动画,这节通过js控制让模型实现眨眼,说话。我们还是拿上个模型来操作,首先是创建好Threejs的场景,包括灯光,相机,渲染器等。

 initScene(){
      this.scene = new THREE.Scene();
      this.clock = new THREE.Clock();
      const gridHelper = new THREE.PolarGridHelper( 30, 0 );
      this.scene.add(gridHelper)
    },
    initCamera(){
      this.camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 10000);
      this.camera.position.set(100,100,100);
      this.camera.lookAt(0,0,0);

      this.listener = new THREE.AudioListener();
      this.camera.add( this.listener );
      this.scene.add( this.camera );
    },
    initLight(){
      //添加两个平行光
      const directionalLight1 = new THREE.DirectionalLight(0xffffff, 1.5);
      directionalLight1.position.set(-300,-300,600)
      this.scene.add(directionalLight1);
      const directionalLight2 = new THREE.DirectionalLight(0xffffff, 1.5);
      directionalLight2.position.set(600,200,600)
      this.scene.add(directionalLight2);
    },
  initRenderer(){
      this.renderer = new THREE.WebGLRenderer({ antialias: true });
      this.container = document.getElementById("container")
      this.renderer.setSize(this.container.clientWidth, this.container.clientHeight);
      this.renderer.setClearColor('#FFFFFF', 1.0);
      this.container.appendChild(this.renderer.domElement);
    },
    initControl(){
      this.controls = new OrbitControls(this.camera, this.renderer.domElement);//创建控制器
      this.controls.enableDamping = true;
      this.controls.maxPolarAngle = Math.PI / 2.2;      // // 最大角度
      this.controls.target = new THREE.Vector3(0, 0, 0);
      this.camera.position.set(100, 100, 100);
      this.camera.lookAt(0, 0, 0);
    },
    initAnimate() {
      requestAnimationFrame(this.initAnimate);
      this.renderer.render(this.scene, this.camera);
    },

然后添加模型,这里不用通过loadWidthAnimation来加载,因为这里不用播放动画,而是直接用load的方法加载,加载好模型后添加到scene场景中。

 initBox(){
      this.helper = new MMDAnimationHelper();
      const loader = new MMDLoader();
      let _this = this
      loader.load( '/static/animal/miku_v2.pmd',function(object){
        let mesh = object;
        _this.scene.add(mesh)
      },null,null)
    },

此时场景中的模型如图:

下面需要添加说话和眨眼的动画了,在模型中有个morphTargetInfluences属性morphTargetInfluences 是一个数组,用于控制模型的形态目标(morph targets)或称为“混合形状”的权重或影响。简单的说就是可以动态控制点的移动形成动画效果,所以我们在加载模型后需要获取到这个数组,不过大家在实践的时候要注意下自己用的模型有没有这个属性以及属性值分别控制的是什么,如果没有合适的模型可以私信我,我把我用的这个模型给你。

_this.face = mesh.morphTargetInfluences

获取到数组后,在动画函数中不断调整值来实现动画效果,比如实现眨眼,那就是要修改一个参数,不断变大,当眼睛闭上时,再延迟一点时间不不断变小把眼睛睁开,这里我直接放代码。

smellEyeAction(){
      if(this.smellEye.show) {
        if (this.face[8] > 1) {
          if (this.smellEye.duration > 20) {
            this.smellEye.duration = 0
            this.face[8] = 0
          } else {
            this.smellEye.duration = this.smellEye.duration + 0.1;
          }
        } else {
          this.face[8] = this.face[8] + 0.02;//笑闭眼
        }
      }
    },

说话的效果和眨眼类似,不过说话嘴型是变化较快,且没有太多规则的,所以这里用随机数,让控制嘴巴的点随机变化,

    talkAction(){
      if(this.talk.show) {
        if(this.talk.duration >20){
          this.talk.duration = 0;
          this.face[24] = Math.random() * 0.6
          this.face[25] = Math.random() * 0.6
          this.face[26] = Math.random() * 0.6
        }
        this.talk.duration = this.talk.duration + 1;
      }
    },

最终要在渲染动画中调用它,为了防止模型没加载出来之前执行,这里加上一点判断,确定数组存在了再执行,最终的效果如下:

MMD眨眼和说话

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 使用three.js加载mmd模型的动画很简单,首先你需要使用MMDLoader.js加载MMD模型,然后将加载的模型添加到three.js的场景中,最后使用animationMixer来播放mmd模型的动画。 ### 回答2: 使用Three.js加载MMD模型动画需要以下步骤: 1. 导入Three.js库:在HTML文件中导入Three.js的库文件,确保正确引用并加载。 2. 创建场景和渲染器:使用Three.js创建一个场景对象和一个渲染器对象。 3. 加载模型和动画:使用Three.js提供的Loader类可以加载MMD模型文件(通常是.pmd或.pmx格式)。使用MMDLoader库可以加载模型的骨架和动画数据。可以从Three.js的官方GitHub库中下载和使用这个库。 4. 设置模型材质和贴图:根据需要设置模型的材质和贴图,可以根据模型文件中的贴图路径加载贴图,并设置给模型的材质对象。 5. 创建摄像机和光源:使用Three.js创建一个适当的摄像机和光源,以确保正确的渲染效果。 6. 动画控制:创建一个AnimationMixer对象,将模型和动画数据传递给它,并使用AnimationMixer的update()方法定期更新模型的动画。 7. 渲染循环:在每一帧中,使用渲染器的render()方法将场景和摄像机渲染到屏幕上,并在每一帧中更新动画。 8. 添加互动控制:根据需要添加鼠标或键盘控制,以便用户可以与模型进行互动。 9. 调整渲染效果和性能:根据需要调整渲染效果和性能,例如添加阴影、光照效果等,或者优化资源加载和内存使用。 10. 完成:完成以上步骤后,就可以在浏览器中加载和显示MMD模型的动画了。 总结:使用Three.js加载MMD模型的动画需要导入Three.js库、创建场景和渲染器、加载模型和动画、设置材质和贴图、创建摄像机和光源、控制动画、渲染循环、添加互动控制,最后调整渲染效果和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

baker_zhuang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值