基于 DirectX11 的 MMDViewer 01-简介
这个项目主要是为了 DirectX11 而来,前面做了一个关于 OpenGL 的项目,这次打算使用 DirectX11 来做一个 MMD 的模型浏览器。以前,我使用过 DirectX11 来做过一些项目,但都半途而废了。在做完 Simple2D 后,现在决定使用 DirectX11 来做一个简单的模型浏览器——MMDViewer。
当然,这个项目究竟会怎么样我也不清楚,里面涉及到的很多知识我以前也没有学习过。就像 Simple2D 那样,本来打算花一两周完成的,后来发现它超出了我的知识范围。中间都是不断搜索其他人的文章或源码来完成的,结果完成 Simple2D 时花费了几个月。
项目介绍
类似 Mikumikudance 这个软件,不过功能和效果没有这么好。主要的目的是 DirectX11 的学习,实现功能如下:
1、pmd、pmx 3D模型的显示
2、模型的骨骼动画和摄像机动画
下面是整个项目的类图:

项目大纲:
一、搭建 DirectX11 渲染框架
这部分只是搭建一个简易的框架,渲染出一个立方体即可。考虑到有不太了解 DirectX11 的人,打算在这部分做一个 DirectX11 的教程。其实也不算教程,只是将我学习 DirectX11 的经验分享出来。在第二部分,我会完善这个框架。
二、MMD 模型的解析和渲染
在网络上你很难找到有关 pmd、pmx、vmd 等文件解析的文章,不过幸运的是,你能找到一份解析它们的源码:itsuhane 的 mmd 库。有了3D模型的数据,接下来就使用 DirectX11 进行渲染。为此需要对第一部分的框架进行扩展,包括:纹理的读取、着色器的封装、摄像机的设计。只有将框架搭建好了,才能进行第三部分的内容。
三、骨骼动画和变形(表情)动画
这里包括三个部分的动画:骨骼动画、变形动画和摄像机动画。骨骼动画的实现,依靠读取 vmd 动作数据驱动模型,设计模型骨骼时包括 FK 和 IK,其中 IK 是最难的一部分。变形动画主要是对顶点的操纵,所以设计渲染框架时要将顶点的位置数据和其他数据(法线、纹理坐标、骨骼数据)分开。摄像机动画实现不难,就看你的摄像机怎样设计了。
四、使用 ImGui 制作界面
最后一部分就是建立简单的界面,实现模型的选择等,比较简单。这里选用了 ImGui 库,学习简单。
软件展示

目录(更随文章的更新)
01、基于 DirectX11 的 MMDViewer 01-简介
02、基于 DirectX11 的 MMDViewer 02-创建一个窗口
03、基于 DirectX11 的 MMDViewer 03-渲染管线
04、基于 DirectX11 的 MMDViewer 04-渲染目标视口和多视口
源码下载(更随文章更新):https://github.com/forEmail/MMDViewer
基于 DirectX11 的 MMDViewer 01-简介的更多相关文章
- 基于 DirectX11 的 MMDViewer 04-渲染目标视图和多视口
上篇文章给出了一个简单并且可以运行的渲染框架,接下来将介绍框架中的渲染管线构成. 1.创建渲染管线 在你创建完一个窗口后,接着便要创建渲染管线,使用的函数是 D3D11CreateDeviceAndS ...
- 基于 DirectX11 的 MMDViewer 03-渲染管线
准备工作: 开始搭建框架之前,你需要确保已经进行了 D3D 开发环境的搭建,相关教程可以阅读这篇文章.不了解 DirectX11 的人,这个作者有关 DirectX11 的教程最好阅读一下,虽然文章不 ...
- 基于 DirectX11 的 MMDViewer 02-创建一个窗口
项目的创建和配置: 1.新建一个 Win32 空项目 2.创建源码文件夹.库文件夹和资源文件夹 3.在 VS2013(我使用的 IDE 是 vs2013)配置这些文件夹 这里使用了 $(Solutio ...
- Node.js 教程 01 - 简介、安装及配置
系列目录: Node.js 教程 01 - 简介.安装及配置 Node.js 教程 02 - 经典的Hello World Node.js 教程 03 - 创建HTTP服务器 Node.js 教程 0 ...
- 【转】【SSE】基于SSE指令集的程序设计简介
基于SSE指令集的程序设计简介 作者:Alex Farber 出处:http://www.codeproject.com/cpp/sseintro.asp SSE技术简介 Intel公司的单指令多数据 ...
- Lucene:基于Java的全文检索引擎简介
Lucene:基于Java的全文检索引擎简介 Lucene是一个基于Java的全文索引工具包. 基于Java的全文索引/检索引擎--Lucene Lucene不是一个完整的全文索引应用,而是是一个用J ...
- Python 黑客 004 用Python构建一个SSH僵尸网络 01 简介
用Python构建一个SSH僵尸网络 01 简介 一. 构建一个SSH僵尸网络的流程图: Created with Raphaël 2.1.0手动操作,实现通过SSH连接目标服务器(手动)用 Pexp ...
- Python基于回溯法解决01背包问题实例
Python基于回溯法解决01背包问题实例 这篇文章主要介绍了Python基于回溯法解决01背包问题,结合实例形式分析了Python回溯法采用深度优先策略搜索解决01背包问题的相关操作技巧,需要的朋友 ...
- Linux 时间同步 01 简介
Linux 时间同步 01 简介 目录 Linux 时间同步 01 简介 时间同步 公共NTP服务器地址及IP 系统时间相关文件 时间同步 大数据产生与处理系统是各种计算设备集群的,计算设备将统一.同 ...
随机推荐
- 向requestAnimationFrame的回调函数中传递参数
其实跟setTimeout类似,我们知道传参传的是一个函数,那么我们是不是可以用一个匿名函数来包裹这个函数的执行呢function fn(fc){ console.log('fc:',fc) fc++ ...
- Java并发--如何创建线程
下面是本文的目录大纲: 一.Java中关于应用程序和进程相关的概念 二.Java中如何创建线程 三.Java中如何创建进程 转载原文链接:http://www.cnblogs.com/dolphin0 ...
- bzoj 5334 数学计算
bzoj 5334 数学计算 开始想直接模拟过程做,但模数 \(M\) 不一定为质数,若没有逆元就 \(fAKe\) 掉了. 注意到操作 \(2\) 是删除对应的操作 \(1\) ,相当于只有 \(1 ...
- 基于 task 为 VSCode 添加自定义的外部命令
我们有很多全局的工具能在各处使用命令行调用,针对某个仓库特定的命令可以放到仓库中.不过,如果能够直接为顺手的文本编辑器添加自定义的外部命令,那么执行命令只需要简单的快捷键即可,不需要再手工敲了. ...
- normalizr api 转换类库使用
1. 项目初始化 yarn init yarn add normalizr 项目结构 app.js package.json user.json 2. 使用 a. app.js const userj ...
- apiman 安装&&使用
安装测试基于docker 1. docker image pull docker pull apiman/on-wildfly1 2. 启动 docker run -d -p 8081: ...
- ORM 查询
ORM版学员管理系统 班级表 表结构 class Class(models.Model): id = models.AutoField(primary_key=True) # 主键 cname = m ...
- CentOS yum源设定使用方法的整理(转)
CentOS yum更新了很多版本更新,我本人认为CentOS yum很好使的文件系统,在此向大家推荐CentOS应该是做为服务器的linux的佼佼者.CentOS采用的二进制包是rpm,不过包的依赖 ...
- 关于tab的切换之共用html页面,而引发的页面跳转错乱问题
在一个项目中的同一个模块中,有多个tab(并且多个tab对应的页面结构完全一样),tab的每次切换,不同tab调用不同的接口,利用一个switch进行判断,根据当前的类型去调用不同的接口,返回不同数据 ...
- Python一些特殊用法(map、reduce、filter、lambda、列表推导式等)
Map函数: 原型:map(function, sequence),作用是将一个列表映射到另一个列表, 使用方法: def f(x): return x**2 l = range(1,10) map( ...