morph 原理实现

【PE教学】超超超初心者向PE入门Part1 - 基本原理

  (2013-08-16 17:31:18)
标签: 

mmd

 

教学

 

杂谈

分类: 教学

应群里要求自己也写了一点比较浅显的PE入门教学。因为本人研究的并不深入,只是根据自己自学时的经验总结的比较基本的东西~~希望能给刚刚入门的新手一点帮助就最好了~~注意纯属自己摸索总结+学习来的,各种不专业+不准确,请自行掌握参考的尺度。而且超级啰嗦_(:з」∠)_...有什么问题错漏欢迎指正补充,互相学习(゜∀゜)~~

 

一、PE是什么

PE通常是PMDEditorPMXEditor的简称,为極北P桑开发并无偿公开的软件。

MMD模型多为PMD格式或PMX格式。PMDEditor可以编辑这两种格式的模型,PMXEditor则以编辑PMX格式为主。PE为功能非常强大的模型修改软件,可以实现模型的形状、贴图、骨骼、权重、物理、表情等等的改变。甚至可以实现简单形状的建模。该软件的模型兼容性也比MMDMMM大得多。因此一般进行改模,以及自建模后的权重物理方面的工作都是使用该软件进行的。

顺带一提,PMX格式是PMD的扩展(或称为进化吧)。目前MMD支持的是PMX2.0。本文也以PMX2.0格式模型为主。

 

二、模型的基本原理

开始PE的操作之前先来说说最基础的模型原理吧方便起见就先以PE的面板为序来介绍一下。

(这里要说的不是高深的计算或者物理运动原理,而是最最基础的模型的组成、运动的方式。一是这对新人来说是最基本但又是不太容易直接得到的知识,二是本人也没研究到那么高深_(:з」∠)_ 如果想知道更深层的东西请不要大意的自行搜寻+求师,然后分享我一下hiahiahia

 

1. 顶点&

首先一个模型是由很多顶点构成的(这不是废话么)

  morph 原理实现_第1张图片



上图是PE中关于顶点和面的面板。

 

一个顶点其实包含了很多信息。包括它所在的X,Y,Z轴的位置,它在所有顶点中的排序(称为index),它的法线,它的UV位置信息,以及它的权重信息。

XYZ轴的位置和顺序就不说了。

法线是在3D技术中着色时用来计算光照和纹理效果的,初级应用可以暂时不用管它~

UV位置简单点说就是这个点在它贴图上的位置。一个3D的模型,如何给它加上二维平面贴图呢?可以想象成将一个纸盒子剪开铺平,变成了一个平面形状。在这个平面上画画之后再折叠粘贴起来的话,这个纸盒子就有贴图了~而为了避免混淆,这个画画的二维平面坐标就不用XY轴了,而用U(横轴)和V(纵轴)来代替。这样通过点在UV平面上的位置,就可以决定它们围成的面里面是贴图的哪部分图案了。

 

morph 原理实现_第2张图片

比如上图是贴图的话,这三个点的UV位置在1,2,3白点的位置,那么它们围成的面就是红色。如果改变点3UV位置到点4那里的话,它们围成的面就会有红蓝两种颜色了。(好吧还有一条黑线)

权重信息是指这个顶点要跟随哪根骨骼运动如何做运动。这里就涉及到非常重要的一个概念:模型的运动是因为构成它的顶点运动了。乍看起来这句好像是废话,但是请不要忘记这条最基本的原理。

一个点目前有以下几种权重变形方式:

l  BDEF1:是指这个顶点只跟随一根骨骼运动。换句话说的话,也就是点A赋上了骨骼a100%权重。于是骨骼a怎么动点A就怎么动,而其他骨骼的运动不会影响点A的位置。

l  BDEF2:是指这个顶点跟随两根骨骼运动。这是比较常见的一种权重方式。例如点A赋了骨骼a50%权重,骨骼b50%权重。意思就是ab各分了一半对点A的控制权。当骨骼a运动而骨骼b不动时,点A虽然会动,但因为b还在原地,所以点A只动一半的位置。当然也可以给点Aa25%b75%,这样它就更听b的话一点。但是两者相加一定是100%,因为点A只能听两个人的话,这就是BDEF2

l  BDEF3BDEF4:同理,是指这个顶点跟随三根、四根骨骼运动。原理与前者一样,只是同时受控于多跟骨骼而已。同样,所有控制它的骨骼权重加起来也是100%

l  SDEF & QDEF:是比较高级的计算方式,可以模拟球形关节的变形,同样算法也比较复杂。当使用这种权重方式的顶点比较多时,就会显得更占资源了。对于新手和初级模型的话,可以暂先忽略这种权重方式。有一定基础的时候可以尝试在关节处使用此种权重方式,就会看出效果了。

OK于是顶点基本就是这样了。这些顶点再构成了边和面,形成了整个模型。

另外关于面还有两点要提的:

l  三角面:在PE中,所有面会自动转换成三角面。或许是因为以三角面为单位进行渲染效率最高。如果你自制了模型可能会发现,建模时的四边形面在PE中会自动转换成两个三角面。

l  平面法线:和顶点类似,面也有法线这个属性。面的法线是垂直于面的矢量,简单来讲可以看成是面的朝向。例如一个面的法线是指向上的话,那么这个面就是上为正面下为反面,反之亦然。

 

2. 材质

PE中,一个模型是以“材质”为单位分类成几部分的。

 

morph 原理实现_第3张图片

这是PE中的材质面板。

首先什么是材质呢?其实顾名思义,材质其实就是模型的“材料/质地”,决定了模型的颜色、纹理、透明度、反射光的程度等等。PE中的所有材质,也就是一个模型中所使用到的所有“材料质地”的信息。而其中每一个材质,可以认为是代表着使用了这种材料的顶点&面的集合。于是这一个个材质就把整个模型“肢解”了。

举例来说,在某个模型中,比如我把头和手的部分拿出来,赋上材质1作为皮肤的颜色。那么在PE的材质面板中就可以看见材质1,它代表了模型的头和手。如果将材质1删掉,就会发现模型的头和手被删掉了。注意材质只涉及模型的顶点和面,删除或修改材质对模型的骨骼、刚体等是不会有影响的。

多数模型的材质都有命名,这样方便分辨它代表了模型的哪一部分,例如上面图中有“发”、“颜”等。有些模型中没有特别命名,只显示了材质1234,这样就要通过单独显示相应的部分来判断每个材质具体是指什么地方了。具体方法在后面PE的操作中会讲到。

在这里多提一点。。。PE将模型“肢解”的方式为材质,这和建模软件可能不同,刚刚学习建模的时候可能容易混淆。以水杉举例。假如说为了建模方便,你做的上衣是一个obj,裤子是另一个obj。同时你建了一个材质叫“衣服”,然后把上衣和裤子都赋上了衣服这个材质。那么这个模型导入PE之后,上衣和裤子就会划归到一个部分了,因为它们用的是同一个材质。同理,如果你的上衣是一个obj,但是你建了两个材质叫“袖子”“上衣”,然后给袖子部分赋上了袖子材质,其他部分赋上的上衣材质。那么尽管在水杉中整个上衣是一个整体,但在导入PE后会分为两个部分(袖子&衣服主体)。

 

3. 骨骼(bone

骨骼是可以让模型动起来的关键。它本身是不可见的。可以想象一个3D模型是你捏出来的粘土小人,本身不能动。但是如果你用铁丝做个骨骼状的支架埋在里面,并且可以让铁丝动起来的话(MMD中就是用动作数据“操纵”了骨骼动起来),那么小人也就跟着动了。

 

morph 原理实现_第4张图片

这是PE中的骨骼面板。

关于骨骼可以延伸的东西非常多。这里先只介绍一下最基本的东西~之后再分步介绍。

① 首先请记得,模型是被骨骼带动的,而不是模型带动骨骼运动。还记得之前提到的顶点的权重么?一个顶点,把它的控制权给了某几根骨骼后,这几根骨骼一动这个顶点也就随之做出反应了。而模型是由顶点构成的。因此当模型的腿的顶点全都改变了位置之后,你就会看见这个人物的腿动起来了。所谓动作数据,其实就是记录的每一个关键帧上模型的骨骼所处的位置。载入动作之后,骨骼就会在适当的时间跑到适当的位置,它控制的顶点也就跟着跑,于是形成了模型的动作。

由此可以得知,假如你的模型出现了猎奇的形状,比如说一抬胳膊头发跟着乱飞而且形状奇葩,很多情况是由于权重设定不对。因为那些乱飞的顶点并没有跟着正确骨骼做正确的运动,把模型拉扯的很猎奇。

② 骨骼的亲子关系:

骨骼本身并不是一个矢量,换句话说它其实并没有方向也没有长度,和印象中人的骨骼不同。如果你单独新建了一个空白骨骼,你会发现它在PE中显示出来就只是一个圆点(或方点)。但是骨骼可以有亲子关系,代表了骨骼的联动关系。

所谓亲子关系,其实可以想象成树状结构。树的主枝叫亲骨,顾名思义就是父辈【爸爸】;主枝上的从枝叫子骨,顾名思义是小辈【儿子】。主枝(亲骨)动的时候,从枝(子骨)就会跟着动;而反过来子骨自己动的话,对亲骨是没影响的。这就是最基本的亲子关系。一根树枝只可能有一根主枝,但是却可能伸出多根从枝。同样,一根骨骼只能有一个亲骨,但是可能有多个子骨。

PE中,如果一个骨骼有它的子骨,那么在显示时就会从它所在位置的点伸出一个尖角来,指向它的子骨。于是你会看到模型中许多骨骼是长条状的,真的和埋在粘土人中的铁丝一样。而事实上这并不是骨骼的长度,只是因为起点那里的骨骼有子骨在终点那里而已。同理,这根骨骼运动时也并不是说这根“棍子”在运动,而是起点的骨骼一动,它的子骨就跟着它动,看起来像是一根棍子一样罢了。

 


morph 原理实现_第5张图片

morph 原理实现_第6张图片

③ 骨骼的几种类型

这里不是准确严格的分类哦,只是我自己大致归纳一下,仅供大家参考一下有个感官印象就可以了。。。还是以最基本的特点为主。

l  旋转骨骼:就是说这个骨骼可以原地转动,一般不可以平移。大多骨骼都是这个类型,比如胳膊。大家在MMD中试一试会发现肩骨和臂骨都是只可以转动的,不能沿XYZ轴平移。这类骨骼在PE中显示为蓝色圆点。

l  移动骨骼:与旋转骨相对的,移动骨骼就是可以平移的骨骼。比如全亲骨,在MMD中会发现它就可以沿XYZ轴移动。当然移动骨与旋转骨是不冲突的,一个骨骼可以同时既能旋转又能移动,比如全亲骨就是这样。这类骨骼在PE中显示为蓝色方点。

l  IK骨骼:IK骨是一种比较特殊的骨骼。前文中说到,亲骨是会带动子骨运动的,但是子骨不能影响亲骨运动。而IK则可以实现通过子骨的运动来带动亲骨运动,相当于一种反向运动方式。这是3D界一个划时代意义的机制,通过这样的方式可以更好的模拟实际运动。在MMD中试试可以看出,模型的脚是不能由腿来决定位置的,却要反过来去拖动足IK骨骼的位置,而腿自动就会随着运动了。

IK的具体计算方式比较复杂,出于IT专业的感觉总觉得像是嵌套循环之类。。。由于计算步骤繁多,一个模型中IK骨如果过多了可能在一定程度上影响性能。一般的模型只有腿脚有IK,有些模型会有臂IK,以及一些其他IK比如领带、头发等。对于新手来说需要设置IK的话可以直接参照其他模型。

IK骨在PE中显示为橙色。

l  不可见骨骼:有些骨骼是非表示的,往往是起辅助作用的骨骼。最常见的叫“~先”的骨骼,一般是作为一条骨骼链的末尾,是最末端骨骼的子骨。这类先骨的作用一般是使骨骼显示更方便理解一点。比如手首先,其实手首骨只是在手腕处的一个圆点而已,加上这个手首先作为子骨的话,手首骨就可以伸长至整个手掌,操作时候就会方便理解很多。

非表示骨在PE中默认不显示,可以打开显示开关。显示时为灰色。

 

4. 表情(morph

模型的变形方法除了利用骨骼之外,还有一种就是利用表情。

 

morph 原理实现_第7张图片

上图是PE中的表情面板。

表情使模型产生变化的原理,其实就是先将模型的一部分通过移动顶点等等方式变成自己想要的样子,之后PE将这个变化记录下来保存为一种表情。这样在MMD中拖动该表情时,软件就将模型转换为变化之后的样子,这中间的过渡阶段是自动形成的。具体的例子下面根据表情的类型分别来说。

目前表情有5种类型:

① 顶点表情

是最常见的表情类型,原理是将模型现有的顶点移动。比如说,我们有一个模型是由3个顶点组成的三角形:

 

morph 原理实现_第8张图片

我们新建一个表情叫表情1,然后在这个表情里,我们把模型的顶点A移一个位置,变成:

 

morph 原理实现_第9张图片

保存一下,PE就会记录下A这个顶点的变化矢量(也就是变化值+方向)。这样在MMD中,移动表情1滑块时就会看到A顶点从原来的位置移动到新位置了。

通过这个原理,我们在新表情中通过移动顶点来做出人物张嘴、闭眼等的样子。这样这个表情就可以实现让人物闭眼或张嘴的变形结果了。

*这里注意,PE记录的并不是A点的最终位置,而是变化量。这样也就可以理解为什么表情可以叠加了。比如表情a为眉毛向上,表情b为眉毛向左,你会发现两个表情叠加可以使眉毛向左上方移动,这是因为实现了两种表情的变化量相加,而不是用其中任一种表情的最终结果来替代原顶点位置。

 UV表情

刚才的顶点表情是移动了顶点在XYZ轴上的位置,而这个UV表情就是移动了顶点在UV轴上的位置。也就是说,UV表情并不是模型形状上的变化,而是纹理贴图中的变化。

比如还是这个三角形模型,以及它对应的贴图:

morph 原理实现_第10张图片UV贴图->morph 原理实现_第11张图片

我们新建一个UV表情,在这里面我们把A点在贴图上的位置变化一下:

 

morph 原理实现_第12张图片

于是在使用这个表情时,我们会发现这个三角形本身没有变形,但是上面的图案变了:

 

morph 原理实现_第13张图片

③ ボーン表情(骨骼表情)

顾名思义,骨骼表情是对骨骼进行变形的。其实它的原理就和通过骨骼来带动模型是一样的。

比如模型的骨骼是这样的:

 

morph 原理实现_第14张图片

我们新建一个骨骼表情,在这里把左上臂的这根骨骼(左腕)沿Z轴转-30度。

 

morph 原理实现_第15张图片

保存之后,我们试一下,可以看到这个表情的结果是这样:

 

morph 原理实现_第16张图片

因为骨骼转动了,所以胳膊随之垂了下来。

通过这种方法,可以将常用的某些小姿势用骨骼表情的方式保存,这样使用表情就可以让模型做出相应动作,达到方便的效果。这只是实用中的一个栗子。

④ インパルス(脉冲表情)

字面上直接翻译是脉冲表情啦,不知道真正的官方名称是啥。。。其实我还木有时间仔细研究这个_(:з」∠)_  PMX2.0并不支持インパルス表情,因此有该表情的模型在MMD中尚不支持。与前两种表情相对的,这种表情针对的是刚体的变化。可以实现刚体的力矩等方面的设定。

⑤ 材质表情

顾名思义就是针对材质的表情,是直接对已有材质实现变化,例如改变某种材质的透明度、颜色加成等等。具体的操作方法在后面的PE操作中再详述,这里我们先举个栗子来了解一下它的实现原理。

例如我们新建一个表情来改变眼睛的颜色:

 

morph 原理实现_第17张图片

这里添加的是目这个材质,也就是模型的眼睛。选中该材质的名字后点击红框里的编集,可以看到调节面板。

 

morph 原理实现_第18张图片

可以看出这里有两种演算形式,一种乘算一种加算。这是什么意思呢?其实很简单,就是做乘法或加法。在这个面板里你填入的值去乘以或加上这个材质本身设定的值。

比如我们选择的是乘算,面板里数值都是1的话,这个表情的结果就是没有任何变化,因为无论什么值x1都还是原来的值。而如果选择加算,面板里数值都是0的话,也是同理,表情不会有任何变化。

现在我们的miku眼睛是绿色:

   morph 原理实现_第19张图片

我们在刚才的编集窗口中,这样设定一下:

 

morph 原理实现_第20张图片

这个意思是,将贴图原本的色调中,红色色调的值乘以2(即红色翻倍)、绿色色调乘以0(即去掉了绿色调)、蓝色色调乘以0.5(即蓝色减半)。出来的效果就是这样的:

 

morph 原理实现_第21张图片

于是miku的眼睛变成了红色。

保存之后,这个表情的作用就是使miku的眼睛从绿色变成红色。

 

5. 表示椊

因为刚好PE下个面板就是这个所以先解释一下好了~~什么是表示椊呢?

MMD中你会看到,在帧窗口有模型的骨骼、表情等名字:

 

morph 原理实现_第22张图片

而表示椊就是决定了模型在MMD中的这个位置显示什么、不显示什么。

 

morph 原理实现_第23张图片

看,完全是一一对应上的。

因此表示椊并不是决定了模型都有什么,而是决定了现有的骨骼/表情中哪些要显示出来。那些不需要显示的,直接在表示椊的某个分组中删掉就可以了。

 

6. 刚体 &Joint

 

morph 原理实现_第24张图片

这两个还是结合在一起说比较好~~

现在我们知道,有了模型的顶点,再有了骨骼和适当的权重,这个模型就已经可以动起来了。再加上表情的丰富,一个模型其实基本可以拿去蹦舞或者作颜艺了。那么刚体和Joint又是干什么的呢?

MMD中试试你可以看到,当模型不开物理演算的时候,它虽然仍可以动但是总是很不自然。比如衣服不会飘,头发不会甩。。。而打开物理演算之后,衣服、头发会随着人物跳动而呈现出现实中甩动的效果。这就是MMD的物理演算体系,可以更逼真的展现模型的运动。而刚体和joint就是用来使模型具备这种效果的。

一个模型没有刚体时,就是MMD中没有打开物理演算时的效果。如果想模拟头发飘动的感觉,只能手动调节每根头发骨骼的位置来模仿头发飞起来的状态,可想而知那简直不是人干事儿。。。于是我们引进了刚体。刚体就好像一个有质量和体积的真实物体。刚体是可以自动从高空掉下来的,因为它有质量;刚体与刚体之间也是可以互相碰撞的,因为它们有体积。此外它们还有一些自身的系数比如摩擦力等。

不过怎么把这样的东西联系到模型身上呢?是通过骨骼。可以看到PE界面上每个刚体都要设关联骨骼的。刚体都是直接作用于骨骼的,它们要么是随着骨骼走,要么是带着骨骼走。注意它们并不会直接对模型的顶点产生影响,而是通过对骨骼的影响,骨骼再用权重控制顶点位置,从而实现模型的变形。

于是想象一下,我们把这些东西串一串系在头发骨骼上,它们就会拉扯着头发始终向下垂;当人物转动的时候,因为这些串会被甩起来,头发也就会跟着甩起来了。

 

首先具体讲一下刚体:

刚体主要可以分为两种:

① 跟随骨骼型(ボーン追従):

也就是跟随着骨骼而动的刚体。可以想象成套在棍子上的易拉罐,棍子是骨骼,它怎么动易拉罐就跟着怎么动。乍一看好像没啥自主权嘛!嗯,它的作用是给了棍子一个体积,这样两个插了易拉罐的棍子就可以互相碰撞了,于是就会产生弹开等反应。

②物理演算型:

与骨骼跟随型相反,这是带着骨骼动的刚体。这时候它仍然是易拉罐,而骨骼是穿在易拉罐中的绳子,易拉罐一荡起来就带动了绳子跟着荡,于是模型的对应顶点就动起来了。这种刚体作用是模拟头发、衣服等等现实的物理运动。由于自身有质量等属性,就可以和现实中一样会向下垂,运动时会被甩起来等等,从而带着骨骼跟着做出物理运动。

【表问我第③种物理+位置结合,我还木有仔细研究_(:з」∠)_

 

下面我们先顺着界面往下看。形状那里有球形、箱形和胶囊形三种,就仅仅是刚体的形状而已。根据实际情况可以自行选择最合适的形状,尽量模拟出现实的体积的样子。

Size/姿势那里设定的是刚体的位置,怎么摆放等信息。

Group是刚体的分组信息。在左边的刚体窗口中,可以看到每个刚体前面还有两个小色块:

 

morph 原理实现_第25张图片

第一个色块是刚体的类型信息,浅绿色是指跟随骨骼的刚体,橘红色是指物理演算刚体,浅黄色指物理+骨骼位置结合刚体。而第二个色块就是分组了,同一颜色的刚体是属于同一组的。

那么为什么要分组呢?可以想想,假如所有的易拉罐之间都要撞来撞去也是很麻烦的事。比如说裙子往往是有几圈刚体围起来的,假如它们之间还要撞来撞去就很容易把裙子挤成抽搐的样子。。。这怎么办呢?就可以把它们划成一个组(group),同属一组的刚体是一家人,相互之间不可以闹矛盾~于是它们之间就不会有碰撞反应,就好像空气一样互相可以穿插的。但是如果遇到的是其他组的刚体就还会向正常一样和其他组碰撞。

不过当模型复杂起来之后,你会发现光是这样分组还不够。有时候还需要设定几个组为同盟,让他们的成员之间也不互相碰撞。于是在选择组的界面下方有非冲突组的设定,就是为了完成这样的功能。

右下方物理演算参数设定的是刚体的质量、反弹力等方面的信息。

 

现在我们基本知道刚体是什么了,那么Joint又是什么呢?Joint是刚体与刚体之间的联结点,可以将“易拉罐”系在一起。方便起见很多时候我们称呼它为J点。

为什么会需要J点呢?

首先我们知道,跟随骨骼类型的刚体是跟着骨骼动的,相当于运动的源头是骨骼。对于它们来说骨骼就是它们的领队,只要依附着骨骼就可以了。好像易拉罐虽然有重量,但是插在棍子上就不怕掉下去。而物理演算刚体呢,则是骨骼的领队,它们自己是没有可以依附的对象的。而这些刚体自身又有重量,所以不管它们的话就会掉一地,而骨骼也跟着掉一地。。。这样的刚体要怎么控制它们不掉在地上呢?就要用J点将它们粘在其他刚体上才可以。

于是就很好理解这样两条原则了:

1. 跟随骨骼的刚体不一定需要有J点,但是物理演算刚体必须有J点将它与其他刚体连接。

2. 物理演算刚体可以通过J点直接连在跟随骨骼的刚体上(就如同将一个易拉罐系在另一个插了根棍子的固定易拉罐上);也可以连在其他物理演算刚体上(例如串成一条空易拉罐的链子),但这条链最终必须至少有一个是连在跟随骨骼刚体上的(也就是这串易拉罐必须要系在一个固定的地方,否则还是会掉在地上)。

 

7. SoftBody

SoftBody即柔体,比起刚体可以更逼真的模拟实际的物理运动。目前MMD尚不支持。

 


至此一个PMX模型的基本构成就差不多了。后面再详细介绍PE的界面操作。。。。(或许又要等一阵子_(:з」∠)_不过有了这些基本知识后应该很多东西就容易理解多了,大家可以看看其他PE教学的帖子~~)

你可能感兴趣的:(pbr)