分类: 三维动画 |
3dsmax8的表情控制教程(1)
——逸心 编写 2006/03/18
半夜写教程我容易吗?请不要随便转载和发表,谢谢!
图片显示不清的请点击观看大图。
想像上图一样,用一个控制器方便的控制几种表情的变化吗?请跟我一步一步来。
首先你要做出像下图一样的6个表情目标,分别是起左嘴角(left_up)、起右嘴角(right_up)、微笑(smill)、左嘴角往下(face_ld)、右嘴角往下(face_rd)、两边嘴角都往下(face_dd),表情目标的名称我都已经标注在模型的头上。
为标准头添加morpher修改器,并且将所有目标加进通道。调整各通道的数值,表情应该会有变化,只不过不太直观,而且表情通道太多的话,通道列表就显示不全了,调节起来会很麻烦。做好这步后,往下进行。
在前视图中人头旁边创建一个矩形和圆形,再加一个文字作为控制器的名字放在下面。矩形的长宽都是5,如下图所示。
将圆形和方形居中对齐后,按住"Alt"键的同时在圆形上点右键,在右键菜单中选择freeze
Transform,如下图。
随后可以看到圆形的position控制器多了一个Zero Pos
XYZ控制器,如下图。
这样做的结果是,如果你想快速让圆形返回最初位置(方形中心),你可以按住"Alt"键的同时在圆形上点右键,在右键菜单中选择Transform
To Zero。圆形马上回到原位。这时表情应该也回到标准状态。
为了在移动圆形的时候不至于移到方形外面,我们可以给它限制一个运动范围。max8的新功能中有一个limit限制控制器可以帮助我们很快完成这个工作。
如下图所示,在X Position上点右键,在弹出的菜单中选assign
contrller...,然后在列表中选择Float Limit,点OK完成。
不好,又出现一个面板!放松,像下图一样,把上限和下限的数值指定好,就可以关掉它了。为什么取这两个数值?我们知道在max中,x轴向右为正方向,z轴向上为正方向,圆形在原位的时候坐标为0,所以向左或向下移动时,它的x/z位移就会是负值。因为方形的边长是5,圆形正好在它的中心,所以圆形向上下左右移动的时候,最左到最右的距离和最上到最下的距离都是5,因此它在x、z轴向上的位移都在-2.5—2.5之间。
同样对Z Position指定float
limit控制器,数值同上。设定好后如下图所示。
下面来让圆形的移动控制表情!
在max里面可以使用几种方式让一个物体的变化来驱动另一些物体的变化,这里因为涉及到的运算比较复杂,所以只能选择表达式控制器,用圆形的位置来驱动表情数值。
首先选中已经有morpher修改器的人头,在trackview轨迹视图中找到morpher下面的left_up通道,点右键,在菜单中选择assign
controller...,在控制器列表中选择Float
Expression表达式控制器,如下图:
现在弹出来一个表达式的对话框。不要担心,表达式只会用一些逻辑判断和初中数学的知识,不难,关键是要找出物体之间的联系,并把这种联系用规范的语句写出来。
首先我们要确定驱动者用什么来驱动,也就是先找变量。表达式里的变量有两种,scalar是标量,只有一个数值(可以带正负),比如温度、时间、长度、高度、角度等等;Vector是矢量,用多个轴向上的坐标来代表空间中某点的位置或者旋转量和缩放值,一般会用[-3,34,25]这种形式来表示。max里的position、rotation、scale就是矢量,而X
position、Y rotation、Z
scale这些前面带有具体轴向的数值就是标量。
现在我们需要两个数值,分别是圆形在x和z轴上的数值,那肯定是标量,因为有具体轴向嘛!
先在Name后面的栏里填入xp,注意这时Scalar前面有个黑点,处于选中状态,点一下Create,这样就会在Scalar栏里出现xp这个标量。同样创建zp这个标量。然后在Expression栏里写表达式:
if(xp>0,40*xp*zp/2.5,0)
式子的意思是:如果xp>0,那么表情数值为40*xp*zp/2.5,其实还可以简化成16*xp*zp,不过为了方便计算,我就保留了这个形式,因为当xp、zp达到最大也就是圆圈在右上角的时候,数值为40*2.5*2.5/2.5=100,即角色完全呈现left_up的表情。这里我对zp没有假设是否为正,因为即使它为负值的话,最后结果得到负值,表情也不会有变化。
注意:表达式里面所有字符都要是英文状态下输入,尤其要注意标点符号不要用错,否则会出错或者没反应。
下面我要把xp指定给圆形在x轴上的位置:点亮xp,找到Assign to
Controller这个大按钮,按下去,然后在列表里找到Circle01的Transform项目,点开前面的加号,一直到看到
X position:Float
Limit位置,把它点一下,让它变黄,好,点OK结束!
用同样方法,把zp指定给圆形的Z position:Float Limit。
这时候向右上角移动圆圈,应该会看到角色的左嘴角往上翘了。
那么剩下的重复工作就交给你了,下图中所有的xp、zp都是指定给圆的X
position:Float Limit和Z position:Float
Limit。右嘴角上翘的表达式如下:
if(xp<0,-40*xp*zp/2.5,0)
smill微笑表情的表达式如下图。这里要增加p、q两个标量。q、p是代表左、右嘴角上翘的数值,p数值在0到100变化时,q此时肯定是0,小圈的xp值是-2.5到0,smile的数值s与p正好是s=100-p的关系,同理小圈的xp在0到2.5时s=100-q。最终整合起来就是s=100-p-q,如果小圈的zp值=0,x=0,此时为初始表情,smile值也应为0。故s=0.4*zp*(100-p-q)。
0.4*zp*(100-p-q)
p代表右嘴角上翘的通道数值,如下图:
q代表左嘴角上翘的通道数值,如下图:
Face_rd 左嘴角向下的表达式:
if(xp<0,40*xp*zp/2.5,0)
Face_ld 左嘴角向下的表达式:
if(xp>0,-40*xp*zp/2.5,0)
face_dd 两边嘴角都往下的表达式:
-0.4*zp*(100-d-b)
这里也要增加两个标量b、d,分别代表Face_rd和Face_ld通道的数值。
我们设置的工作到此结束,现在移动小圆圈,就可以非常直观而且方便的控制角色的表情。我们还可以添加其他的控制系统来控制其他的面部动画,而且还能用脚本语言来同时设置几个小圆的位置来达到特定的表情,我将在后面的教程中进行讲解。
前一篇:max脚本好难啊