Threejs加载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 = thisloader.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 );

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

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 );

然后再来看下效果

MMD动画2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3031871.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Bpmn.js使用(仅查看版)

Bpmn.js使用&#xff08;仅查看版&#xff09; 下载 npm install bpmn-js创建一个 Dom 节点来挂载画布元素。 <a-tabs v-model:activeKey"activeKey" change"tabsChange"><a-tab-pane key"1" tab"审批记录"><a-tabl…

【二叉树】Leetcode 二叉树的锯齿形层序遍历

题目讲解 103. 二叉树的锯齿形层序遍历 算法讲解 这道题其实是和N叉树层序遍历是一样的&#xff0c;只不过是要求每一次的遍历的方向不一样&#xff1b;注意&#xff1a;这一次的使用的队列不能够是queue了&#xff0c;因为需要从后往前遍历容器&#xff0c;所以就可以使用v…

[已解决]ModuleNotFoundError: No module named ‘einops‘

&#x1f60e; 作者介绍&#xff1a;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff0c;视频号&#xff1a;AI-行者Sun &#x1f388; 本文专栏&#xff1a;本文收录于《AI实战中的各种bug…

腾讯互娱面经,希望别凉

面试题详解 Go接口 接口在Golang中扮演着连接不同类型之间的桥梁&#xff0c;它定义了一组方法的集合&#xff0c;而不关心具体的实现。接口的作用主要体现在以下几个方面&#xff1a; 多态性: 接口允许不同的类型实现相同的方法&#xff0c;从而实现多态性。这意味着我们可…

Macbook2024电脑必备系统优化软件CleanMyMacX

随着时间的推移&#xff0c;你可能会发现你的MacBook运行速度变慢&#xff0c;甚至在执行一些基本任务时也会感觉到卡顿。这不仅影响了工作效率&#xff0c;也大大降低了使用体验。特别是当你运行大型应用程序&#xff0c;比如视频编辑软件或图形设计工具时&#xff0c;卡顿现象…

SpringSecurity + JWT实现登录认证

前置基础请参考&#xff1a;SpringSecurity入门-CSDN博客 配置&#xff1a; pom.xml <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.0.5</version></p…

Oracle到PostgreSQL的不停机数据库迁移

1970 年&#xff0c;数据库之父 Edgar Frank Codd 发表了“数据的关系模型”论文&#xff0c;该论文为往后的关系型数据库的发展奠定了基础。1979 年&#xff0c;基于关系模型理论的数据库产品 Oracle 2 首次亮相&#xff0c;并在过去的三四十年时间里&#xff0c;横扫全球数据…

制作跳动的爱心网页效果

html <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>跳动的爱心</title> <link rel&q…

Java入门基础学习笔记7——Intellij IDEA开发工具概述、安装

之前的开发工具存在一些问题&#xff1a; 文本编辑工具&#xff1a;记事本、NotePad、EditPlus、Sublime...编写代码的时候没有错误提醒、没有智能代码提示、需要自己进行编译、执行、功能不够强大。 集成开发环境&#xff08;IDE&#xff1a;Integrated Development Environm…

U盘文件剪切丢失怎么办?揭秘原因并给出恢复方法

在日常生活和工作中&#xff0c;U盘已成为我们不可或缺的数据存储和传输工具。但有时候&#xff0c;我们在对U盘中的文件进行剪切操作时&#xff0c;会遇到文件丢失的情况。这种突如其来的数据消失往往会让人感到惊慌和困惑。那么&#xff0c;为什么U盘剪切时文件会丢失呢&…

【声呐仿真】学习记录2.5-DAVE项目部分文档大纲

【声呐仿真】学习记录2.5-DAVE项目 一、Dave Models 模型Vehicle Models 航行器模型New Underwater Vehicle 新型水下航行器Dave ROV ModelsDave Glider ModelsManipulator Models 机械臂模型UUV Simulator Examplesrexrovrexrov2desistek saga roveca_a9Light Autonomous Unde…

互动科技如何强化法治教育基地体验?

近年来&#xff0c;多媒体互动技术正日益融入我们生活的各个角落&#xff0c;法治教育领域亦不例外。步入法治教育基地&#xff0c;我们不难发现&#xff0c;众多创新的多媒体互动装置如雨后春笋般涌现&#xff0c;这些装置凭借前沿的科技手段&#xff0c;不仅极大地丰富了法制…

排序1——直接插入排序,希尔排序,选择排序,堆排序

1.排序的概念及其运用 1.1排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录…

【MySQL】——课程平台的创建设计

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

Three.js基础练习——渲染一个立方体

1.学习内容参考了 three.js入门教程--零基础也能学会_threejs菜鸟教程-CSDN博客 本章内容包含渲染立方体&#xff0c;并配合ui工具食用~ 2.效果图 import * as THREE from three import * as dat from dat.gui import { OrbitControls } from three/addons/controls/OrbitC…

在Tiled中制作动画瓦片图

什么是瓦片图&#xff1f;瓦片图是指用图块把游戏场景评出来 工具安装链接&#xff1a;Tiled | Flexible level editor 资源下载教程 资源下载&#xff1a;Mystic Woods - 16x16 Pixel Art Asset Pack by Game Endeavor 解压后得到一些资源 新建图块集合 Tiled的安装就不介绍…

H3C DHCP快速配置指南

1 配置DHCP服务器动态分配IPv4地址 1.1 简介 本案例介绍配置接口工作在DHCP服务器模式&#xff0c;实现动态分配IPv4地址的方法。 1.2 组网需求 如1.2 图1所示&#xff0c;公司将交换机做为核心交换机&#xff0c;现在需要在核心交换机上划分3个VLAN网段&#xff0c;Ho…

从零开始写 Docker(十四)---重构:实现容器间 rootfs 隔离

本文为从零开始写 Docker 系列第十四篇&#xff0c;实现容器间的 rootfs 隔离&#xff0c;使得多个容器间互不影响。 完整代码见&#xff1a;https://github.com/lixd/mydocker 欢迎 Star 推荐阅读以下文章对 docker 基本实现有一个大致认识&#xff1a; 核心原理&#xff1a;…

FTA、ETA和FMA相互融合——FMEA软件

免费试用FMEA软件-免费版-SunFMEA 在实际工作中&#xff0c;故障树分析&#xff08;FTA&#xff09;、事件树分析&#xff08;ETA&#xff09;和故障模式、影响及危害性分析&#xff08;FMECA&#xff09;是相互补充、相互关联的分析工具&#xff0c;它们在保障系统安全性和可…

Docker常用镜像安装

1. mysql 1.1 安装 获取镜像 docker pull mysql:8.0.30创建文件挂载目录 创建容器并运行 docker run -p 3306:3306 --name mysql8 \ -v /home/docker/mysql8/log:/var/log/mysql \ -v /home/docker/mysql8/data:/var/lib/mysql \ -v /home/docker/mysql8/mysql-files:/va…