Threejs加载MMD

简介: 这篇文章详细介绍了如何在Three.js中加载和使用MMD(MikuMikuDance)模型,包括模型的导入、动画的播放以及与MMD相关的文件格式和操作流程。

MMD全称MikuMikuDance,是一个简单的做动画的程序,做MMD之前先了解下什么是PMD。

PMD(Polygon Model Data)文件是一种用于描述三维模型的文件格式。PMD 文件通常用于 MikuMikuDance(MMD)软件,它是一款在日本非常流行的三维角色动画制作工具。PMD 文件包含了模型的几何形状、材质、骨骼和动画数据等信息,可以被导入到 MMD 中进行编辑和动画制作。PMD 文件是一种比较常见的三维模型文件格式,在虚拟角色创作和动画制作方面得到广泛应用。

之前我以为其他模型和gltf一样,加载进来可以显示,如果有动画可以播放动画,后来在官网看到mmd发现还是有区别的,因为他做好了统一的骨骼模型,然后动作文件是vmd格式分开的,这就意味着可以加载一个模型后选择不同的动作动画,然后实现不同的动画效果,而只需要切换动画就好了,下面引用官网的例子,结合vue来实现一下:

因为是基于Threejs的,所以还是需要创建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);
      if ( this.ready ) {
        this.helper.update( this.clock.getDelta() );
      }
    },

有了这个空间后,需要先引入mmd的加载器,用来加载PMD的模型文件。也包括MMD的动画助手插件用来渲染动画,两个插件加载不分先后顺序,第一个是把模型加载进来,第二个是做出动画效果。

import {MMDLoader} from "three/examples/jsm/loaders/MMDLoader";
import {MMDAnimationHelper} from "three/examples/jsm/animation/MMDAnimationHelper";

有了这两个组件后,就可以开始着手加载模型和动画了,首先,我们创建一个MMDAnimationHelper和MMDLoader的实例,然后利用MMDLoader的loadWidthAnimation方法加载模型和动画,loadWidthAnimation包括多个参数:modelUrl : String, vmdUrl : String, onLoad : Function, onProgress : Function, onError : Function,第一个也就是模型地址,第二个是动作文件地址,第三个是加载函数,第四个是加载进度,如果模型大的话可以在这里获取到加载进度,做成进度条,最后一个是加载错误的处理方法,

 this.helper = new MMDAnimationHelper();
      const loader = new MMDLoader();
      let _this = this

      loader.loadWithAnimation( '/static/tuote/tuote.pmx', '/static/tuote/12.vmd', function ( mmd ) {
        _this.scene.add( mmd.mesh );
        _this.helper.add( mmd.mesh, {
          animation: mmd.animation,
          physics: true
        });
      }, null, null );

然后,你的浏览器上就会出现一个会动的小姑娘,

我们可以用官网例子的方式加上PolarGridHelper,做出脚底光环的效果

      const gridHelper = new THREE.PolarGridHelper( 30, 0 );
      this.scene.add(gridHelper)

接着我们可以加入相机动画,制作比较动感的视觉效果,就像动画中也会有镜头拉近,拉远,等各个角度的变换拍摄,加载好相机动画后就可以看到相机也会不断地切换角度拍摄

      loader.loadAnimation( '/static/animal/wavefile_camera.vmd', this.camera, function ( cameraAnimation ) {
        _this.helper.add( _this.camera, {
          animation: cameraAnimation
        } );
      }, null, null );

这还不够,好看的画面得配上音乐,所以,我们再添加进音乐

      new THREE.AudioLoader().load( '/static/animal/wavefile_short.mp3', function ( buffer ) {
        const audio = new THREE.Audio( _this.listener ).setBuffer( buffer );
        const audioParams = { delayTime: 160 * 1 / 30 };
        _this.helper.add( audio, audioParams );
        _this.ready = true;
      }, null, null );

这样才算一个较为完整的动画效果,
WechatIMG130.jpg
MMD动画

这里不支持上传视频,我就上传个图片了,如果想看动态效果可以私我,我发给你视频

下面我们尝试切换一个动作文件,其实只需要改变动作文件的引用就好了


      loader.loadWithAnimation( '/static/animal/miku_v2.pmd', '/static/tuote/12.vmd', function ( mmd ) {
        _this.scene.add( mmd.mesh );
        _this.helper.add( mmd.mesh, {
          animation: mmd.animation,
          physics: true
        });
      }, null, null );

然后再来看下效果
WechatIMG126.jpg
MMD动画2

这里不支持上传视频,我就上传个图片了,如果想看动态效果可以私我,我发给你视频

相关文章
|
存储 缓存 Linux
free命令详解
`free`命令在Linux中显示内存使用详情,包括总内存(`total`)、已用(`used`,含缓存`buffers/cache`)、空闲(`free`)、共享(`shared`)和可用(`available`)内存。交换空间显示其总量、使用量和剩余量。`-h`选项以易读格式显示,`-m`以MB显示,`-t`显示总和,`-s`定时刷新。例如,`free -ht 5`每5秒更新内存和交换空间的总览。
1052 3
Threejs实现模拟河流,水面水流,水管水流,海面
Threejs实现模拟河流,水面水流,水管水流,海面
4619 0
Threejs实现模拟河流,水面水流,水管水流,海面
|
JavaScript
Threejs实现PMD模型眨眼说话等功能
这篇文章详细介绍了如何在Three.js中实现PMD模型的眨眼和说话等动态效果,通过控制模型的关键帧来模拟面部表情的变化。
1007 0
Threejs实现PMD模型眨眼说话等功能
|
3月前
|
监控 测试技术 数据库
Speedtest-X 部署指南:在 Docker 环境下快速上线测速服务
Speedtest-X 部署指南:在 Docker 环境下快速上线测速服务
847 0
Speedtest-X 部署指南:在 Docker 环境下快速上线测速服务
|
3月前
|
弹性计算 安全 API
阿里云弹性公网IP(EIP)完全对接使用指南:从申请到成本优化
本文提供一份完整的阿里云弹性公网IP(EIP)对接使用指南。EIP是可以独立购买和持有的公网IP地址资源,与ECS实例解耦,支持动态绑定与解绑。文章首先介绍EIP的核心概念与优势,对比固定公网IP的差异。随后详细演示通过控制台申请EIP、绑定ECS实例、配置带宽与计费方式的操作步骤,并提供Python SDK与Terraform的代码示例实现自动化管理。深入讲解EIP绑定NAT网关实现VPC内多实例共享公网出口、加入共享带宽降低带宽成本、以及网卡可见模式等高级场景。在安全管理方面,介绍如何通过RAM进行权限控制、配置安全组规则以及DDoS基础防护。成本优化部分重点分析按量计费与包年包月的选型策
|
8月前
|
SQL JavaScript API
Node.js 24 原生 SQLite 支持
Node.js 24 原生支持 SQLite(`node:sqlite`),无需第三方库即可高效操作数据库。提供同步 API,含 `DatabaseSync`、预编译语句及完整 CRUD 方法,适用于脚本、工具和轻量服务,零依赖、安全简洁。(239字)
950 1
|
人工智能 供应链 搜索推荐
数字孪生与零售业:优化库存与客户体验
数字孪生技术通过在虚拟空间中创建物理实体的镜像模型,实时反映状态和趋势,助力零售业优化库存管理和提升客户体验。在库存管理方面,数字孪生能实现智能预测、动态优化和供应链协同;在客户体验上,则能提供个性化推荐、虚拟试衣间和店内导航等服务,推动零售业向智能化、个性化发展。
|
运维 监控 Kubernetes
【大模型】RAG增强检索:大模型运维的基石
RAG(检索增强生成)是一种结合大模型与外部知识库的技术,通过“先查资料再作答”的流程,解决模型幻觉、知识更新滞后等问题。其核心包括四大模块:文档处理中心、知识检索库、提问处理器和智能应答器。RAG在大模型运维中实现知识保鲜、精准控制和成本优化,同时支持动态治理、安全合规增强及运维效率提升,推动智能运维从“人工救火”向“预测性维护”演进。
2963 10
【大模型】RAG增强检索:大模型运维的基石
|
JavaScript 前端开发 开发者
ThreeJs控制模型骨骼实现数字人
这篇文章讲解了如何使用Three.js通过控制模型的骨骼来实现数字人的动态表现,包括加载模型、获取骨骼信息以及通过编程控制骨骼动作的具体方法。
2313 1

热门文章

最新文章