THREEJS使用MMD

1,197 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情

实现

参考example:

threejs.org/examples/#w…

MMDLoader:

threejs.org/docs/index.…

MMDAnimationHelper:

threejs.org/docs/index.…

首先,我们先初始化场景,摄像机,渲染器,光照,轨道控制器等,然后我们使用mmdloader加载mmd模型,我们需要一个模型的路径和他的动作路径,还需要一个处理mmd的MMDAnimationHelper

mmd2.png

let helper = new MMDAnimationHelper();
const modelFile = 'mmd模型路径';
const vmdFiles = [ '动作数据路径' ];
const loader = new MMDLoader();
loader.loadWithAnimation( modelFile, vmdFiles, function ( mmd ) {
          mesh = mmd.mesh;
          helper.add( mesh, {
          animation: mmd.animation,
	  physics: true
} );

当我们仿造着example执行以上代码时,发现并没有效果,还需要引入ammo物理引擎,这块不是很清楚,等以后了解后再来修改。使用ammo。

<script src="./public/js/ammo.wasm.js"></script> 
  Ammo().then(function(AmmoLib)
  {
    Ammo=AmmoLib;
    init();
  })

mmd1.gif 我们可以看到可爱的初音就动起来了,也可以把初音的model换成其他人物

接下来我们来添加声音可以参考www.webgl3d.cn/Three.js/

  let audio = new THREE.Audio(listener);
  let audioLoader = new THREE.AudioLoader();
  audioLoader.load('音频文件地址', function(AudioBuffer) {
  audio.setBuffer(AudioBuffer);
  audio.setLoop(true); 
  audio.setVolume(0.5); 
  audio.play(); 
})

也可以按照 example里那么写

const modelFile = 'models/mmd/miku/miku_v2.pmd';
const vmdFiles = [ 'models/mmd/vmds/wavefile_v2.vmd' ];
const cameraFiles = [ 'models/mmd/vmds/wavefile_camera.vmd' ];
const audioFile = 'models/mmd/audios/wavefile_short.mp3';
const audioParams = { delayTime: 160 * 1 / 30 };
helper = new MMDAnimationHelper();
const loader = new MMDLoader();
oader.loadWithAnimation( modelFile, vmdFiles, function ( mmd ) {
mesh = mmd.mesh;
helper.add( mesh, {
animation: mmd.animation,
physics: true
} );

//loader.loadAnimation( cameraFiles, camera, function ( cameraAnimation ) {
//helper.add( camera, {animation: cameraAnimation} );
new THREE.AudioLoader().load( audioFile, function ( buffer ) {
const audio = new THREE.Audio( listener ).setBuffer( buffer );
helper.add( audio, audioParams );
scene.add( mesh );
ready = true;
}, onProgress, null );
//}, onProgress, null );
, onProgress, null );

function onProgress( xhr ) {
if ( xhr.lengthComputable ) {
const percentComplete = xhr.loaded / xhr.total * 100;
console.log( Math.round( percentComplete, 2 ) + '% downloaded' );
}
}

但此时,我们可能仍然听不见声音,可以打开浏览器设置一下,打开网站设置,将声音设置为允许就可以听到声音了。

mmd3.png

mmd4.png

mmd5.png 如果要添加摄像机运动则可以将上述的loader.loadAnimation写入。

最后

由于个人水平有限,也没用过MikuMikuDance,对这个也没有理解很到位,只能做到基本使用,等能力足够时,再对文章进行修改。欢迎了解过的大佬再评论区再介绍一下。8月31日是初音的生日,祝世界第一公主殿下15周年生日快乐。

封面模型为Asoul虚拟女团 身高一米吧的嘉然,可在模之屋下载

www.aplaybox.com/details/mod…【MMD模型来自@A-SOUL_Official,模型版权归@A-SOUL_Official所有】

封面动作数据为《我们快出发》MMD动作数据

本数据是虚拟偶像【泠鸢yousa】与【嘉然Diana】的合作曲目《我们快出发》的MMD动作数据 由【冰糖IO】进行配布发放。