【COM3D2Mod 制作教程(2)】Mod 底层原理
【COM3D2Mod 制作教程(2)】Mod 底层原理
Mod 是什么?
Mod 一词想必你已经听过很多次了,因为很多游戏都可以装 Mod,而 Mod 可以为游戏增添一些额外的乐趣。但在 COM3D2 这款游戏中,Mod 和常规的意思并不一样,常规的 Mod 在这里叫做插件,两者不能混为一谈。
Mod 是一种官方功能
一种用于增加额外的人物卡及其装扮的方法。
在 COM3D2 中 Mod 是一项官方功能,这是很特殊的一点,实际上官方所有的角色装扮和我们自己所做 Mod 本质是一样的,所以它的作用也有了明确表示:一种用于增加额外的女仆及其装扮的方法。
我们外部之所以也能做 Mod,是因为围绕着下方两个文件夹展开了,官方会自动加载这两个文件夹下的文件,这两个文件夹也分别代表着两种功能方向。
Mod 文件夹:
用于增加女仆装扮选项,但相关文件在游戏中仅有加载功能,所以无法直接制作,制作时需要额外借助第三方工具。
Preset 文件夹:
用于储存女仆身体信息,包括体型面部的参数,是游戏内置的捏人系统,虽然用 Mod 文件夹也可实现类似的功能,但难度过大一般不考虑。
可见 Mod 由 Mod 和 Preset 两种文件组成,但因为 Preset 的内容在课程中的占比非常小,所以后续的 Mod 都默认指 Mod 文件夹的这部分。
Mod 可能被插件扩展
可以提供更多额外功能,但存在兼容性问题。
原版的 Mod 功能是比较弱的,所以一些技术玩家为此专门开发了一些插件,这些插件使得 Mod 可以额外加载一些文件,比如声音,剧本等(COM3D2.MaidLoader),更炫酷的材质效果(COM3D2.NPRShader.Plugin),额外的体型参数(CM3D2.AddModsSlider.Plugin)等等。
其中一些插件非常重要,以至于没有他们部分装扮将无法制作,再加上玩家一般都会通过 CMI 或类似的插件整合包安装插件,所以你基本可以默认玩家的游戏环境是带有这些插件的,但要注意这终究是第三方提供的功能,不一定百分百兼容,再考虑受众范围的问题,所以部分插件还是建议保守使用。
Mod 的运行原理
我们知道 Mod 就是实现装扮功能,所以让我们先不考虑 Mod,考虑如何自己实现人物装扮的效果。
人体模型实现
人形模型绑定上人形骨架即可。
首先装扮是穿在角色身体上的,所以必须先考虑这些这些身体是如何做的,如果你有完成前置要求的任务,那这个问题应该相当简单,就是捏个人型模型在绑上一套人形骨架就行。另外为了实现动画的复用,一般多个角色的骨架都会使用同一套,即便略有区别那也是能向下兼容的那种。
装扮模型实现
单独的装扮模型但绑上和人体模型相同的骨架即可。
人体模型有了,现在我们要给他做一个能够替换和拆卸的衣服,很显然这样的衣服和人体一定不能是同一个模型,可我们需要让衣服和人体一起运动。我们知道模型是受骨架控制而运动的,而且不同模型依旧可以绑上相同的骨架,所以只要骨架一样就能同时控制装扮和身体,于是就有了种穿上衣服的感觉。也因此对装扮便只有了骨架的要求,模型得以随意替换。
体型变化实现
把人体模型和装扮的胖瘦都捏一份,通过形态键计算过渡。
体型的变化是显然通过网格变化体现的,但游戏不是建模软件也不可能现场改模型,所以必须有成熟便利的功能自动修改网格形状。骨骼就是一种,但这种实时计算的方式不可控,而要严格保证网格变化前后是符合要求的方法就是形态键,但形态键的缺点是必须提前确定变化前后的形状,所以要做两遍,人体模型和装扮模型都要。
结论
Mod 的本质其实就是特制的 3D 模型而已。
我们知道 Mod 是和装扮有关,所以第一点和我们没关系,我们只要用官方的人体模型就行,但这也指明了我们制作装扮时所要绑定的骨架。而第三点太麻烦了,所以我们可以不考虑体型变化。那有关的只有第二点,而这一点说明了装扮实现的原理,也即 Mod 的原理。
模型的组成原理
上述我们谈到 Mod 就是 3D 模型,那如何把这个 3D 模型放到游戏内?使用 FBX 这些格式肯定不可能的了,COM3D2 是 Unity 开发的,Unity 内部有着自己的格式,但你也别怕,因为模型的本质在哪都是一样的,我们可以先看看在 Blender 中模型是如何构成的。
模型文件构成
- 随意创建一个正方体,通过右上角的大纲视图可以看到它由物体和网格组成。
- 接着我们可以为物体添加材质,材质中有一个节点功能,它的专属编辑面板在 Blender 中叫 Shading,换成名词就是着色器(Shader).
- 材质的面板上可以设置各种参数,包括被称作纹理的图片。
我为什么用这些名称称呼他们?通过大纲视图的 Blender 文件模式,你可以看到在 Blender 中就是这样称呼的(见下图标记处)。
模型文件拆分
传统的单文件模式(FBX 这类格式),会把上述所有资源都打包在一起,但这不利于资源文件的复用和定制,所以最终到游戏引擎中会将各个资源分开储存,也即我们上述提到的那五种基本资源,简单描述一些他们各自的功能。
物体
保存着父子关系,变换信息(位移旋转等),以及对网格和材质的引用信息。
网格
点线面信息,包括 uv,权重,顶点色等。
材质
表明所用的着色器,以及使用着色器时使用的资源(纹理)和参数。
着色器
一段代码,用于指导电脑如何去绘制我们的屏幕画面。
纹理
图片文件
Mod 的组成原理
你总算可以知道 Mod 里的文件都是干啥的了,所以现在请直接掏出一款现有的 Mod 做参照,因为下文所讲述的内容将会和 Mod 文件一一对应。
先让我们查看 Mod 制作 Wiki 的左侧的文件类别(上图),可以确定 Mod 的基本文件共有 5 种(最后一个不是文件类型),具体按功能可以分为以下三类(你不需要在意具体分类,对学习 Mod 制作来说这是无所谓的)。
为什么不做上图中最后一个日文标签的文件说明?因为那个不是文件类型,而是 menu 文件中一个属性,用于指明装扮类别(如指明装扮是头发,上衣,裤子等)。后续编写 menu 文件时,我们通常是直接对官方 menu 文件进行修改而不是从头创建,所以不需要去特别记忆。
模型文件
- model 文件(模型点线面信息)
- mate 文件(如何绘制点线面)
- tex 文件(绘制时用到的贴图)
广义理解的 3D 模型文件,可以想成被拆分存储的 FBX。
这部分应该不需要过多解释了,就是上文“模型文件”两节提到的那些,这些文件凑成了一个基本模型所需的所有数据,具体到 COM3D2 中还进行了一定简化,结合上文对比下图你就知道对应关系和含义了,注意文件之间存在依赖关系。
flowchart RL
object["物体
Object"]
mesh["网格
Mesh"]
material["材质
Material"]
shader["着色器
Shader"]
texture["纹理
Texture"]
subgraph Model文件
object
mesh
subgraph Mate文件
material
end
end
subgraph tex文件
texture
end
mesh-->object
material-->object
shader-->material
texture-->material
可以看到 model 文件中包含 mate 文件,所以 model 中用到的 mate 是不需要单独导出文件的,只要一个 model 文件即可。(由于刚出教程时我没发现这个问题,所以后面可能会让你导出,但你完全可以无视。如果修改了mate,也是直接重新导出model文件即可)
着色器是内置在游戏中的,所以没有单独导出的文件,但着色器是由材质引用的,所以之后我们需要在材质中写明着色器信息。
COM3D2 文件
- menu 文件
对应游戏内装扮菜单,告诉游戏如何使用模型文件。
现在我们有模型了,但如何告知 COM3D2 去使用它呢?这就需要 menu 文件。menu 是一个由多个键值对组成的文件,他直接对应着女仆编辑菜单中的菜单项,所以理所当然的它必须要知道一些基本的菜单信息,比如装扮名,装扮描述,装扮类别图标等。他的功能相当强大,以至于指定“点击该菜单项为女仆穿上特定模型文件”这一功能只是他的可选项之一,其他还能做到比如,调整颜色,隐藏部位,特定时刻更换材质球模型(常见如插入时内裤改为半脱状态)等操作。
Unity 文件
- pmat 文件
透明模型专用,用于处理绘制顺序问题。
这个文件只包含了一个整数值和一个材质球名称,他决定了使用该材质球的模型绘制顺序,具体顺序为其整数值的正序排列。为什么需要控制绘制顺序?因为计算机绘制画面是按材质球为单位一层一层覆盖上去的,所以材质球绘制的先后顺序可能会对画面产生影响。在不透明物体中,这点不重要,因为有一个叫深度值的东西会帮我们避免错误覆盖,但在透明物体中就存在问题了,因为透明的性质导致绘制时必须要先知道前一个颜色才行,所以先后顺序必须确定。比如我们通常都是先看到裙子再看到内裤,所以如果裙子是半透明的,那必须要让计算机先画上内裤,然后再画上裙子才行。
为什么我按如上方式进行文件分类?这是站在 Unity 的角度来分类的。模型文件都是由外部工具制作再导入 Unity 的,是构成完整模型的必要资源;COM3D2 文件则是 COM3D2 独有,是游戏开发者自定的文件;而 pmat 则确实是 Unity 自身的资源,是在 Unity 中进行编辑的。
其他文件
不在教程范围内
实际上除了上述几种文件之外,游戏或插件还额外提供了一些文件类型,但考虑难易度和兼容性,教程中不会使用也不会教授,如有需求可自行去了解。
总结
这章主要讲述了 COM3D2 的 Mod 运行原理及其文件构成,偏理论课程,所以看起来会比较枯燥困难,但实际制作中会更轻松的一些,比如上述的很多文件,到时我们是不需要从头创建的,即使是建模环节也是通过移植第三方模型来解决。下一章我们将正式开始搭建制作环境,并了解 Mod 文件是如何制作出来的。
【COM3D2Mod 制作教程(2)】Mod 底层原理的更多相关文章
- JavaScript是如何工作的: CSS 和 JS 动画底层原理及如何优化它们的性能
摘要: 理解浏览器渲染. 原文:JavaScript是如何工作的: CSS 和 JS 动画底层原理及如何优化它们的性能 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 这是专门探索 J ...
- NGUI所见即所得之深入剖析UIPanel,UIWidget,UIDrawCall底层原理
NGUI所见即所得之深入剖析UIPanel,UIWidget,UIDrawCall底层原理 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 之 ...
- HashMap的底层原理(jdk1.7.0_79)
前言 在Java中我们最常用的集合类毫无疑问就是Map,其中HashMap作为Map最重要的实现类在我们代码中出现的评率也是很高的. 我们对HashMap最常用的操作就是put和get了,那么你知道它 ...
- springAop:Aop(Xml)配置,Aop注解配置,spring_Aop综合案例,Aop底层原理分析
知识点梳理 课堂讲义 0)回顾Spring体系结构 Spring的两个核心:IoC和AOP 1)AOP简介 1.1)OOP开发思路 OOP规定程序开发以类为模型,一切围绕对象进行,OOP中完成某个任务 ...
- Activiti工作流学习笔记(三)——自动生成28张数据库表的底层原理分析
原创/朱季谦 我接触工作流引擎Activiti已有两年之久,但一直都只限于熟悉其各类API的使用,对底层的实现,则存在较大的盲区. Activiti这个开源框架在设计上,其实存在不少值得学习和思考的地 ...
- Dash文档制作教程
前言 什么是Dash 面向程序员的文档库(Mac) 代码片段管理工具 这是强烈推荐给每天在各种API文档中摸爬滚打的程序员们的神器. 为什么要自己制作文档 官方的源中没有相关文档 文档在离线下体验更好 ...
- 24个 HTML5 & CSS3 下拉菜单效果及制作教程
下拉菜单是一个很常见的效果,在网站设计中被广泛使用.通过使用下拉菜单,设计者不仅可以在网站设计中营造出色的视觉吸引力,但也可以为网站提供了一个有效的导航方案.使用 HTML5 和 CSS3 可以更容易 ...
- 10个优秀的 HTML5 & CSS3 下拉菜单制作教程
下拉菜单是一个很常见的效果,在网站设计中被广泛使用.通过使用下拉菜单,设计者不仅可以在网站设计中营造出色的视觉吸引力,但也可以为网站提供了一个有效的导航方案.使用 HTML5 和 CSS3 可以更容易 ...
- 10个实用的 CSS3 按钮效果制作教程
人们往往喜欢那些有更多互动元素的网站,因此现在很多设计师专注于他们的 CSS3 技能.这是因为 CSS3 技能可以帮助他们在很大的程度上实现所需的吸引力.这里分享的10个优秀的 CSS3 按钮效果制作 ...
- 20个漂亮 CSS3 按钮效果及优秀的制作教程
在这篇文章中,我们编译了一组有用的 CSS3 动画按钮教程和引人注目的实验.正如我们都知道的,CSS3在网页设计方面是最重要和最关键的,可以使您的网站对访客更具吸引力和互动性.你可以学习这些教程和试验 ...
随机推荐
- Visual Studio 2017 rc 资源文件 预处理 宏 无效
在属性c++下的预处理宏不会影响rc资源文件的,需要对rc资源文件单独设置. 右键rc资源文件,点击属性,在预处理器定义添加需要的宏
- VTK vtkAssembly 拾取
在有vtkAssembly的拾取中,vtkAssembly的Pickable决定子Actor能否被拾取.跟子Actor的Pickable没有关系
- 鸿蒙UI开发快速入门 —— part11: 鸿蒙计算器开发实践
1.前言 经过我们前面10章的学习,我们基本上可以开发出一个简单的APP了,为了巩固学习的内容,我们先开发一个计算器APP来连个手(文末有源代码),界面如下: 包含基本的计算器运算功能 支持一键清空, ...
- 鸿蒙UI开发快速入门 —— part07:组件状态管理之@Prop/@Link装饰器
1.前言 我们在上一章学习了@State装饰器,@State装饰器的作用范围仅仅在当前组件,接下来,我们讨论如何从父组件中传入参数到子组件,让子组件随着父组件的状态发生变化.本章将要介绍的就是:@Pr ...
- idea中yaml文件中文乱码问题解决
idea打开yaml,或是properties文件,出现中文乱码. 解决步骤: 打开notepad++ ,新建iso-8859-1编码的空文件 将乱码文件通过notepad++直接打开,把正常显示的代 ...
- PM-企业数字化转型,数据治理是关键
企业数字化转型是大势所趋,通过数据治理.数据平台建设.数据分析与建模,把数据变成服务,使数据能在企业内顺畅流动起来,为企业带来巨大的价值.数据是企业数字化转型的重要基础. 数据能创造价值,但数 ...
- 出现警告信息 Please enter a commit message to explain why this merge is necessary,
Please enter a commit message to explain why this merge is necessary, # especially if it merges an u ...
- 【XML】学习笔记第四章-schema
Schema 概述 作用 与DTD相比Schema的优势 基础命名空间: 模式 引用方法 通过xsi:noNamespaceSchemaLocation引入 通过xsi:shemaLocation引入 ...
- HarmonyOS Next 入门实战 - 关系型数据库、smartdb
SQLite数据库 HarmonyOS的关系型数据库基于SQLite 导入模块 import { relationalStore } from '@kit.ArkData'; 实现步骤: 获取RdbS ...
- Qt开发经验小技巧261-265
代码中判断当前Qt库是32位还是64位,用QSysInfo::WordSize=32/64. QTreeView控件设置左侧branch图标大小,无法通过qss设置,万能大法查看源码得知控制宽度最后取 ...