CHINADV.COM > BBS » 您尚未 登录 | 注册 | 搜索 | 帮助 | 风格切换 | 无图版 | 登陆邮箱 | 注册邮箱   


论坛首页 -> MAYA -> 明天起我每天会和大家交流并解答关于设置与整理优化场景的相关问题
 XML   RSS 2.0   WAP 
1/18 | 1  2  3  4  5  >| 
      回复   
明天起我每天会和大家交流并解答关于设置与整理优化场景的相关问题
   选项      
上影小猪


头衔:春城无处不飞花春城无处不飞花
该用户目前不在线
精华: 1
发帖: 158
魅力: 0
积分: 1166
在线时间:54(小时)



关于设置的问题,明天起我每天会和大家交流并解答关于设置与整理优化场景的相关问题。和大家交流像灯光连结等垃圾文件,设定与mel等制作经验。我也会翻译一些相关的最新设置与mel等国外教程和大家交流。

 

 


The "Perfect Rig"完美的装备讨论


 


1. 没有一个完美的设定装备
一个设定是根据需要性发展出来的。完美的设定允许动画师来达到故事板中和概念艺术中详细指定的姿势,运动和变形。故事来驱动设定设计,而不是其他途径。


 


2. 复杂的设定不要复杂的来创建
你的设定是为动画是而存在的,而不是你自己。



3.设定使用起来方便快捷
交互作用比其他都重要。如果动画师不能迅速的得到动画反馈,那你的设定就是失败的。你可以给动画是一个选项来关闭设定的某一部分导致交互变慢的地方。在表达式中使用utility节点。他们在设定改变时更加快速且稳定。


  


归结为三个原则


 


Simple简单


Speedy快速


Stable稳定


 


4. 设定要能够拉伸:基本的


 


伸展的基本设定:理论


我们在基本架构上开始。当我们谈论关于模块性,控制的级别和间隔尺度我们已经谈论了关于设定的设计。


我们需要问一个问题:关于设定,什么事情是最重要要去做的呢?在这个卡通动画例子中,我们有以下两部分:


姿势
2D
动画师很容易理解和喜欢他们。他们可以快速的捕捉到那些最重要的姿势。


线型的动作
这不仅是姿势,而是你从那里如何得到姿势。2D动画师很喜欢他们的角色动起来非常干净清晰。他们从真实的着手开始,但他们将其夸张。换句话说,你的角色需要更多的拉伸。


 


那我们如何去做呢?简洁扼要的,我们以一个看上去简单的方式来放缩关节。


  


技术层面的考虑





  • 尽可能整齐的创建关节



  • 这将给我们一个很好的弹性并节省时间


  •  


  • 按照可预言的变形来对齐关节



  • 如果它并没有对齐,控制器的变形将会变得很难



  • 尽可能保持基本的设定装备



  • 你通常可以在你的基本设定上增加更精细的控制级别


  •  


  • 可伸展的设定

伸长的肢体为压缩和伸展提供了一个坚固的基础,这没有什么复杂的,是一个标准的IK肢体,带有效用节点来驱动关节的缩放在IK手柄伸长超出他的默认长度时。在这个场景中,它是非常类似于一个伸长的IK spline,除了这个IK手柄在两个locator之间使用距离,而不是使用弧长来驱动伸展。他更加适合伸展。


 


明天:如何创建一个“可伸展的肢体


1.创建三根关节的骨骼链。重命名shoulder, elbow, wrist


2.为关节链创建一个ik手柄(rp)(shoulderwrist).


3.创建一个locator重命名为startLoc,然后捕捉它到shoulder关节,冻结其信息.


4.创建一个locator重命名为endLoc,然后捕捉它到wrist关节,冻结其信息.


5.创建一个空组null1,然后将其作为startloc的子物体.


6.目标约束null1endLoc.


7.null1下创建一个新的空组null2. 

8.点约束null2endLoc. 

抱歉,好像暂时无法发图


2006-07-18 23:44   
      回复   
RE:明天起我每天会和大家交流并解答关于设置与整理优化场景的相关问题
   选项      
猪手冰凉


头衔:大懒小懒在路上……大懒小懒在路上……
该用户目前不在线
精华: 5
发帖: 7097
魅力: 8
积分: 21549
在线时间:2949(小时)



教程啊。。。哈哈


逝者如斯!~~~~~~哈哈,不亦樂乎?子魂所系,汝好皆懷,受子懷壁,免爾濺血,千古一輕,萬世何重?了吾長歌,天地共韻!~~~
2006-07-19 09:48   
      回复   
RE:明天起我每天会和大家交流并解答关于设置与整理优化场景的相关问题
   选项      
上影小猪


头衔:春城无处不飞花春城无处不飞花
该用户目前不在线
精华: 1
发帖: 158
魅力: 0
积分: 1166
在线时间:54(小时)



下班晚,上海有快下暴雨了。我先来解决朋友们提出的垃圾文件清理。

这个脚本是因为以前的一个项目需要,一个同事特别写的。我把这个脚本提供给大家,稍后,我吃晚饭会来详细说明这个脚本的原理。



附件: 94986662.rar (0 K) 下载次数:123
2006-07-19 19:59   
      回复   
RE:明天起我每天会和大家交流并解答关于设置与整理优化场景的相关问题
   选项      
上影小猪


头衔:春城无处不飞花春城无处不飞花
该用户目前不在线
精华: 1
发帖: 158
魅力: 0
积分: 1166
在线时间:54(小时)



因为maya默认是导入物体时,就与场景中的灯光连结发生关联。原来场景中的灯光连结也保持着,这样就重复了。在操作大场景时,导入物体是十分平常的时。这样灯光连结越积越多,在保存场景时,就需要大量的时间。我曾经遇到过保存文件需要半小时以上的案例。这个脚本原理是找出多余的重复的灯关连结接点。将物体与灯光的连接打断,这样保存时,maya就不用花大量的时间去描述这个关系,节省了大量的时间。(个人理解,可能理解有错,还请指正。)

2006-07-19 20:31   
      回复   
RE:明天起我每天会和大家交流并解答关于设置与整理优化场景的相关问题
   选项      
上影小猪


头衔:春城无处不飞花春城无处不飞花
该用户目前不在线
精华: 1
发帖: 158
魅力: 0
积分: 1166
在线时间:54(小时)



所有的脚本和我写的说明都在下面列出了:


源化该脚本(Souce),就开始执行清理灯光连结的操作,同时给出过程时间和结束反馈。这个//表示该行是注释。


 


global proc jrLightLinksCleanUp()
{
 //`timerX`用来计算共用了多少时间。
 //申明一个浮点变量$startTime,申明一个浮点变量$elaspedTime,申明整数变量$min,申明整数变量$sec。
 float $startTime = `timerX`;
 float $elaspedTime;
    int $min;
    int $sec;
 //申明字符串变量$lightLinker的同时,将场景中类型为lightLinker的节点名称存入字符串变量$lightLinker中。
 string $lightLinker[] = `ls -typ lightLinker`;
 //申明一个整数变量$numOfLinker,并将lightLinker节点的的数量存入整数变量$numOfLinker中。
 int $numOfLinker = size($lightLinker);
 //申明一个整数变量$numOfbadLinks,在执行程序时将坏的lightLinker存入其中。
 int $numOfbadLinks = 0;
 //申明一个整数变量$numOfAllLinks,在执行程序时将最终所有的lightLinker存入其中。
 int $numOfAllLinks = 0;
 //申明字符串变量$linkedPair。
 string $linkedPair[] = {};
 //换行打印"jrLightLinksCleanUp:",然后再换行打印"-------------------------------"。
 print "\njrLightLinksCleanUp:\n";
 print "-------------------------------\n";
 //对于字符串变量$lightLinker中的每一个成员,都执行
    //11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
       for ($i=0; $i<size($lightLinker); $i++)
          {
         //跳出一个进程表来显示进度。
   progressWindow -title  ("Checking '" + $lightLinker[$i] + "' (" + ($i+1) + "/" + $numOfLinker + ") ...")
         -isInterruptable  1 -status  ("查询LightLink中, 请等待... ");
   //如果该窗口被用户点了放弃按钮,那么打断这次的操作,循环结束。
            if ( `progressWindow -query -isCancelled` ) break;
         //申明字符串变量$connections,将与每个lightLinker的连接列出存入字符串变量$connections中。
   string $connections[] = `listConnections -connections  1 -plugs  1 -destination  0 -source  1 $lightLinker[$i]`;
   //申明字符串变量$tmpPair。
         string $tmpPair = "";
         //申明整数变量$numOfcons,将获得的所有与lightLinker有关联的节点数量存入变量$numOfcons。
   int $numOfcons = size($connections);
         //如果有相关的连接存在,例如:lightLinker1.link[0].light  defaultLightSet.message  
         //                            lightLinker1.link[0].object initialShadingGroup.message
         //                            lightLinker1.link[1].light defaultLightSet.message
         //                            lightLinker1.link[1].object initialParticleSE.message
         //                            lightLinker1.link[2].light defaultLightSet.message
         //                            lightLinker1.link[2].object lambert2SG.message
             ////////////////////////////////////独立的独立的独立的独立的独立的独立的独立的独立的独立的独立的独立的独立的独立的独立的
    if (!$numOfcons)
     {
              //如果没有找到相应的灯光连接,那么中断窗口过程,跳出当前的这个循环操作,继续执行循环后的代码
      print ("- Cleaning Up '" + $lightLinker[$i] + "': 没有多余的灯光连接被找到!\n");
      progressWindow -endProgress ;
      continue;
          }
       else
                 {
               //有相关的连接存在,例如:lightLinker1.link[0].light  defaultLightSet.message  
            //                            lightLinker1.link[0].object initialShadingGroup.message
               //                            lightLinker1.link[1].light defaultLightSet.message
           //                            lightLinker1.link[1].object initialParticleSE.message
            //                            lightLinker1.link[2].light defaultLightSet.message
               //                            lightLinker1.link[2].object lambert2SG.message
                  //那么执行打印,告诉用户总共有多少个连接在清理
         print ("- Cleaning Up '" + $lightLinker[$i] + "', All "  + ($numOfcons/2) + " Connections\n");
           }
             ////////////////////////////////////独立的独立的独立的独立的独立的独立的独立的独立的独立的独立的独立的独立的独立的独立的
   //申明整数变量$progress。
   //申明整数变量$percentage。
         int $progress = 0;
   int $percentage = 0;
         //执行窗口进程程序,是否结束根据变量$numOfcons的大小
   progressWindow -edit -title ("'" + $lightLinker[$i] + "' (" + ($i+1) + "/" + $numOfLinker + ")" + ", " + ($numOfcons/2) + " Connections...") -progress $progress -isInterruptable 1 -min 0 -max $numOfcons;
   //申明整数变量$j。
   int $j = 0;
         //当整数变量$j小于整数变量$numOfcons时,检查到对话框被按了放弃,那么打断所有的程序进程。
             //22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
       while ($j<$numOfcons)
         {
       if ( `progressWindow -query -isCancelled` )
                   {
           warning "用户放弃了!\n";
        break;
          }
               //整数变量$numOfAllLinks的数值自增加        
      $numOfAllLinks ++;
               //将整数变量$j的值赋予整数变量$progress
      $progress = $j;
               //整数变量$percentage的值等于整数变量$progress的值乘于100再除以整数变量$numOfcons的值
      $percentage = $progress * 100 / $numOfcons;
               //执行窗口进程程序
      progressWindow -edit -progress $progress -status ("  处理 LightLinks (" + $percentage + "%) ... ");
               //申明字符串变量$LinkIgnoreLit,看是否匹配变量$connections中物体名称,例如link[0],存入字符串变量$LinkIgnoreLit
               //申明字符串变量$LinkIgnoreObj,看是否匹配变量$connections中物体名称,例如link[0],存入字符串变量$LinkIgnoreLit
         string $LinkIgnoreLit = match("(link){0,1}(ignore){0,1}\\[[0-9]+\\]", $connections[$j]);
      string $LinkIgnoreObj = match("(link){0,1}(ignore){0,1}\\[[0-9]+\\]", $connections[$j+2]);
               //如果变量$LinkIgnoreLit和变量$LinkIgnoreObj的名称完全相同,那么执行下面的代码
               /////////////////////////////////33333333333333333333333333333333333333333333333333333333333333333
      if ($LinkIgnoreLit == $LinkIgnoreObj)
                  {
                     //申明字符串变量$tmpPair,将与lightLinker所连接的节点名称存入变量$tmpPair中
      $tmpPair = $connections[$j+1] + ":" + $connections[$j+3];
                     //如果变量$tmpPair中的名字和变量$linkedPair中的名字有相同的那么执行
                     /////////////////////////////////444444444444444444444444444444444444444444444
      if (stringArrayCount($tmpPair, $linkedPair))
                      {
                          //断开lightLinker[$j+1]与lightLinker[$j]之间的属性连接
        //断开lightLinker[$j+3]与lightLinker[$j+2]之间的属性连接
       disconnectAttr $connections[$j+1] $connections[$j];
       disconnectAttr $connections[$j+3] $connections[$j+2];
                         //整数变量$numOfbadLinks自增加(用来记数的)
       $numOfbadLinks ++;
           }
      else
                      {
                          //没有匹配的名字那么将名字载入字符串变量$linkedPair中
        $linkedPair[size($linkedPair)] = $connections[$j+1] + ":" + $connections[$j+3];
           }
                      /////////////////////////////////444444444444444444444444444444444444444444444
                      //整数变量$j加4
          $j += 4;
                    //  print $j;
         }                
       else
                  {
                   //如果变量$LinkIgnoreLit和变量$LinkIgnoreObj的名称不相同,那么执行下面的代码
                      //断开lightLinker[$j+1]与lightLinker[$j]之间的属性连接
                      //整数变量$numOfbadLinks自增加(用来记数的)
                      //整数变量$j加2
       disconnectAttr $connections[$j+1] $connections[$j];
       $numOfbadLinks ++;
       $j += 2;
          }
                   /////////////////////////////////3333333333333333333333333333333333333333333333333333333333333333333
   }
         //22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
      //程序窗口结束
   progressWindow -endProgress;
  }
     //11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
 $elaspedTime = `timerX -startTime $startTime`;
 $min = $elaspedTime/60;
 $sec = $elaspedTime%60;
 print "\njrLightLinksCleanUp摘要:\n";
 print "-------------------------------\n";
 print ("- 删除了总共 " + $numOfbadLinks + " 个多余无用的连接 " + $numOfAllLinks + " 灯光连接. (共耗时: " + $min + " 分钟, " + $sec + " 秒)\n");


 }
jrLightLinksCleanUp;
// end of script



2006-07-19 20:38   
      回复   
RE:明天起我每天会和大家交流并解答关于设置与整理优化场景的相关问题
   选项      
上影小猪


头衔:春城无处不飞花春城无处不飞花
该用户目前不在线
精华: 1
发帖: 158
魅力: 0
积分: 1166
在线时间:54(小时)



      这两天公司项目太紧,加班到很晚。回来后跑步健身,和女友打电话后,再坐到电脑前发贴,已经快凌晨了。下面就发一边我翻译的老外教程,如何做“可伸展的肢体”。

     发教程之前我来说明一下,我在项目中如果碰到这样的要求,我会有三种解决方案:

1。如果角色简单,要求不高,我会用表达式来控制每节骨头的ScaleX的值,或TranslateX的值(要求X轴指向下一关节)。然后计算IK的长度当前移动后得到的长度除以原长,即可以得到一个倍率值,这个倍率值再去乘以每节骨头的ScaleX的值或TranslateX的值就OK了!如果是IKSpline的话,就去计算它的曲线长度。

2。如果角色复杂,那就用节点去连结,这样可以避免再时间划块上倒拉鼠标时,表达式造成的瞬时错误或跳跃。这样的做法是最好的。

3。呵呵,当然是用插件罗!林林总总给你很多选择!但是有一点,你要懂原理,拆开看看,再搭载自己的复杂设定上去完成电影级别的设定,这才是效率。(个人之见)

设定有时工作量是很大的,做设定有时可能需要的就是耐心+规划。

2006-07-20 23:45   
      回复   
RE:明天起我每天会和大家交流并解答关于设置与整理优化场景的相关问题
   选项      
上影小猪


头衔:春城无处不飞花春城无处不飞花
该用户目前不在线
精华: 1
发帖: 158
魅力: 0
积分: 1166
在线时间:54(小时)




图片:

1.创建三根关节的骨骼链。重命名shoulder, elbow, wrist


2.为关节链创建一个ik手柄(rp)(shoulderwrist).


3.创建一个locator重命名为startLoc,然后捕捉它到shoulder关节,冻结其信息.


4.创建一个locator重命名为endLoc,然后捕捉它到wrist关节,冻结其信息.


5.创建一个空组null1,然后将其作为startloc的子物体.


6.目标约束null1endLoc.


7.null1下创建一个新的空组null2. 

8.点约束null2endLoc. 

2006-07-20 23:46   
      回复   
RE:明天起我每天会和大家交流并解答关于设置与整理优化场景的相关问题
   选项      
上影小猪


头衔:春城无处不飞花春城无处不飞花
该用户目前不在线
精华: 1
发帖: 158
魅力: 0
积分: 1166
在线时间:54(小时)




图片:

9.创建一个乘除节点,将设置改为除divide,并且使用null2translateX值赋予multiplyDivide2x通道:


createNode multiplyDivide ;



2006-07-20 23:48   
      回复   
RE:明天起我每天会和大家交流并解答关于设置与整理优化场景的相关问题
   选项      
上影小猪


头衔:春城无处不飞花春城无处不飞花
该用户目前不在线
精华: 1
发帖: 158
魅力: 0
积分: 1166
在线时间:54(小时)




图片:

10.连接null2translationXmultiplyDivide节点的input1X并且设置multiplyDivide1.input2X接受来自null2.translationX的值;


mel命令


connectAttr null2.translateX multiplyDivide1.input1X;


 


11. 创建一个condition节点,并且设置


createNode condition ;


 


12.连接multiplyDivideconditionfirst term。设置为"greater than"


connectAttr multiplyDivide1.outputX condition1.firstTerm;


 


13.连接multiplyDivide节点到conditioncolorIfTrue(判断)


connectAttr multiplyDivide1.outputX condition1.colorIfTrueR;



2006-07-20 23:54   
      回复   
RE:明天起我每天会和大家交流并解答关于设置与整理优化场景的相关问题
   选项      
上影小猪


头衔:春城无处不飞花春城无处不飞花
该用户目前不在线
精华: 1
发帖: 158
魅力: 0
积分: 1166
在线时间:54(小时)




图片:

14.连接conditionoutColorRshoulderelbow关节的scaleX


connectAttr condition1.colorIfTrueR shoulder.scaleX ;


connectAttr condition1.colorIfTrueR elbow.scaleX ;


 


15.点约束ik手柄到endLoc.



2006-07-20 23:55   
1/18 | 1  2  3  4  5  >|