Maya绑定案例:摆动、扭曲、拉伸(样条IK高级扭曲、表达式)
做一个拉伸旋转的效果
目录
一 基础模型搭建
1 创建立方体
2 创建骨骼
3 骨骼蒙皮
二 摆动效果
1 创建样条IK手柄
2 给线蒙皮
3 控制器 控制 大关节球:P
三 扭曲效果
1 上色
2 打开局部旋转轴
3 样条IK高级扭曲
四 拉伸效果
1 测量长度
2 表达式
3 优化表达式 y=x√
4 优化表达式 y= x^n
一 基础模型搭建
1 创建立方体
上下两个大盒子 相当于控制器,中间的小盒子相当于模型身体
2 创建骨骼
x 吸附创建骨骼 (让骨骼在一条直线上,骨骼的关节点在盒子中心)
3 骨骼蒙皮
选中骨骼和小盒子,蒙皮
测试
二 摆动效果
1 创建样条IK手柄
会在骨骼链的中间创建一条线,当我们去改变这根线的形状的时候,就会改变骨骼的样子
选中曲线
右键 控制顶点,测试
2 给线蒙皮
创建2个关节球,调大点区分,吸附过去
选中这两个关节球 和 样条IK手柄的线,蒙皮
测试
3 控制器 控制 大关节球:P
就是上面那个大盒子 控制 上面那个大关节球:P
下面那个大盒子 控制 下面那个大关节球:P
测试
三 扭曲效果
1 上色
(为中间的立方体的一面上色,方便后面观察 扭曲效果)
打开渲染编辑器 hypershade,修改颜色为蓝色
选择模型 中间的5个立方体的 其中一个面
为当前选择指定材质
效果
2 打开局部旋转轴
菜单栏--显示--变换显示--局部旋转轴
中间 显示--全部
3 样条IK高级扭曲
选中样条IK handle, 属性编辑器--IK解算器属性--高级扭曲控制
√ 启用扭曲控制
世界上方向类型:对象旋转上方向(开始/结束) → 跟着物体的旋转走
正向轴:小立方体指向控制器的轴
上方向轴:旋转的方向(看下 骨骼小坐标轴,左右旋转,用x或z都行,这里用x)
上方向向量:骨骼 上方向轴 对应的 世界上方向对象 的轴 用向量表示(小立方体x轴对应的下面的控制器大立方体是x轴正向,用1表示写在第一列方框处)
上方向向量2:骨骼 上方向轴 对应的 世界上方向对象2 的轴 用向量表示(小立方体x轴对应的上面的控制器大立方体是x轴正向,用1表示写在第一列方框处)
上方向向量 三列分别代表XYZ, 正向轴用1表示,负方向轴用-1表示
世界上方向对象:根骨骼 对应的控制器 名称 (下面大立方体的名称)
世界上方向对象2:骨骼末端 对应的控制器 名称 (上面大立方体的名称)
测试
四 拉伸效果
拉伸效果之前用的节点编辑器做的,这次用表达式做
1 测量长度
先创建一个节点
在下面的mel窗口输入命令
createNode curveInfo;
成功创建
大纲视图--展示--不勾选 仅DAG对象
大纲视图--展示--勾选 形状
用连接编辑器连接 创建的节点 和 样条IK的曲线 来测量长度
窗口--常规编辑器--连接编辑器
样条IK曲线的 worldSpace 和 curveInfo 的 inputCurve 连接
纲视图 双击 curveInfo,属性编辑器里 就能看到 曲线的长度,初始长度7.553
把曲线拉长,显示测量的弧长变了
2 表达式
现在要控制骨骼的高度 来控制高矮,即缩放Y
控制骨骼的胖瘦 用 缩放X 和 缩放Z
//高矮
//骨骼1 的缩放y = 测量长度 / 初始长度
joint1.sy= curveInfo1.arcLength/7.553;
//胖瘦
//骨骼1 的缩放X和缩放Z = 初始长度 / 测量长度 (就是高矮的倒数,scaleX可以简写为sx)
joint1.scaleX= 7.553/curveInfo1.arcLength;
joint1.scaleZ= 7.553/curveInfo1.arcLength;
7段骨骼的公式如下 (注意每行后面有分号)
joint1.scaleY= curveInfo1.arcLength/7.553;
joint2.scaleY= curveInfo1.arcLength/7.553;
joint3.scaleY= curveInfo1.arcLength/7.553;
joint4.scaleY= curveInfo1.arcLength/7.553;
joint5.scaleY= curveInfo1.arcLength/7.553;
joint6.scaleY= curveInfo1.arcLength/7.553;
joint7.scaleY= curveInfo1.arcLength/7.553;joint1.scaleX= 7.553/curveInfo1.arcLength;
joint2.scaleX= 7.553/curveInfo1.arcLength;
joint3.scaleX= 7.553/curveInfo1.arcLength;
joint4.scaleX= 7.553/curveInfo1.arcLength;
joint5.scaleX= 7.553/curveInfo1.arcLength;
joint6.scaleX= 7.553/curveInfo1.arcLength;
joint7.scaleX= 7.553/curveInfo1.arcLength;joint1.scaleZ= 7.553/curveInfo1.arcLength;
joint2.scaleZ= 7.553/curveInfo1.arcLength;
joint3.scaleZ= 7.553/curveInfo1.arcLength;
joint4.scaleZ= 7.553/curveInfo1.arcLength;
joint5.scaleZ= 7.553/curveInfo1.arcLength;
joint6.scaleZ= 7.553/curveInfo1.arcLength;
joint7.scaleZ= 7.553/curveInfo1.arcLength;
窗口--动画编辑器--表达式编辑器
创建
加完表达式后属性这里变成紫色了
测试
3 优化表达式 y=x√
现在想要做类似于这种函数的变化
函数名称是sqrt() , 新的表达式 如下:
joint1.scaleY= curveInfo1.arcLength/7.553;
joint2.scaleY= curveInfo1.arcLength/7.553;
joint3.scaleY= curveInfo1.arcLength/7.553;
joint4.scaleY= curveInfo1.arcLength/7.553;
joint5.scaleY= curveInfo1.arcLength/7.553;
joint6.scaleY= curveInfo1.arcLength/7.553;
joint7.scaleY= curveInfo1.arcLength/7.553;joint1.scaleX= sqrt(7.553/curveInfo1.arcLength);
joint2.scaleX= sqrt(7.553/curveInfo1.arcLength);
joint3.scaleX= sqrt(7.553/curveInfo1.arcLength);
joint4.scaleX= sqrt(7.553/curveInfo1.arcLength);
joint5.scaleX= sqrt(7.553/curveInfo1.arcLength);
joint6.scaleX= sqrt(7.553/curveInfo1.arcLength);
joint7.scaleX= sqrt(7.553/curveInfo1.arcLength);joint1.scaleZ= sqrt(7.553/curveInfo1.arcLength);
joint2.scaleZ= sqrt(7.553/curveInfo1.arcLength);
joint3.scaleZ= sqrt(7.553/curveInfo1.arcLength);
joint4.scaleZ= sqrt(7.553/curveInfo1.arcLength);
joint5.scaleZ= sqrt(7.553/curveInfo1.arcLength);
joint6.scaleZ= sqrt(7.553/curveInfo1.arcLength);
joint7.scaleZ= sqrt(7.553/curveInfo1.arcLength);
修改表达式:选择过滤器,按表达式名称,找到刚才的表达式,修改好,点 编辑
测试,会有一种拉橡皮筋的感觉
4 优化表达式 y= x^n
y= x^n 函数名称是pow()
()里第一个参数是x,第二个参数是n
新的表达式如下:
joint1.scaleY= curveInfo1.arcLength/7.553;
joint2.scaleY= curveInfo1.arcLength/7.553;
joint3.scaleY= curveInfo1.arcLength/7.553;
joint4.scaleY= curveInfo1.arcLength/7.553;
joint5.scaleY= curveInfo1.arcLength/7.553;
joint6.scaleY= curveInfo1.arcLength/7.553;
joint7.scaleY= curveInfo1.arcLength/7.553;joint1.scaleX= pow(sqrt(7.553/curveInfo1.arcLength),1);
joint2.scaleX= pow(sqrt(7.553/curveInfo1.arcLength),1.5);
joint3.scaleX= pow(sqrt(7.553/curveInfo1.arcLength),2);
joint4.scaleX= pow(sqrt(7.553/curveInfo1.arcLength),3);
joint5.scaleX= pow(sqrt(7.553/curveInfo1.arcLength),2);
joint6.scaleX= pow(sqrt(7.553/curveInfo1.arcLength),1.5);
joint7.scaleX= pow(sqrt(7.553/curveInfo1.arcLength),1);joint1.scaleZ= pow(sqrt(7.553/curveInfo1.arcLength),1);
joint2.scaleZ= pow(sqrt(7.553/curveInfo1.arcLength),1.5);
joint3.scaleZ= pow(sqrt(7.553/curveInfo1.arcLength),2);
joint4.scaleZ= pow(sqrt(7.553/curveInfo1.arcLength),3);
joint5.scaleZ= pow(sqrt(7.553/curveInfo1.arcLength),2);
joint6.scaleZ= pow(sqrt(7.553/curveInfo1.arcLength),1.5);
joint7.scaleZ= pow(sqrt(7.553/curveInfo1.arcLength),1);
修改表达式后,测试