注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

豆芽兵的生存探索

因,记录。留下历史,看到未来...

 
 
 

日志

 
 

Maya复制功能小探索  

2013-01-23 18:12:50|  分类: 探索实验室 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

2013年01月23日 - 豆芽兵 - 豆芽兵的生存探索

PS:今天把脚本修改了一下。只要创建一个带动画的物体原始。然后需要复制的原始物体名字修改成不带数字后缀的。(比如Box,不能使用box1)直接使用。就可以做出上图效果了。当然你需要做好材质

今天试验了一个有点意思的。
这是很简单一个层级关系。额,当时在看Hypergraph时想到典型的父子层级关系不就是:月球围绕地球,地球围绕太阳,这样的模型吗。
然后动手建立了一个,一开始还是规则的椭圆运动,然后干脆修改成无规则的运动,最后一想如果每一帧复制一个怎么样呢,好吧,就出现了上图这样的小怪物。但猛看一下,还是会让自己小小兴奋一下的。

1.建立三个物体分别命名:Sun,Earth,Moon。然后摆开。大小是,太阳最大,地球次之,月球最小
2.使用三个Locator1,2,3,分别把三个物体使用Parent约束 给 Locator。 (达到,有“自转,公转”就可以了)
如下图
2013年01月23日 - 豆芽兵 - 豆芽兵的生存探索
 
3.把Locator3中心点移动到地球中心,Locator2中心点移动到太阳上
4.给Locator rotation三个轴,分别写表达式,让太阳能跟着选择
locator1.rotateX =time*8;
locator1.rotateY =time*48;
locator1.rotateZ =time*12;

这样播放一下就能看到物体转动了。可这样,各个星球只是被动的运动。想要有自自转怎么办呢
这就要使用到parentConstraint节点了。
2013年01月23日 - 豆芽兵 - 豆芽兵的生存探索
 locator2_parentConstraint1.target[0].targetOffsetRotateY = time*24
表达式,是让被约束的节点有自身的运动。这在很多地方都能用到。
比如做一个跟随运动时,加上自身随机的运动就可以根据这个节点进行操作

现在播放一下,就能看到物体不仅围绕父级物体运动,还有自身的旋转了。下图这样的效果就要使用上面制作好的物体了。
其实说白了很简单,就是“复制”

如果你不怕麻烦手动的一个个复制key帧是可以达到的。
使用Mel好处就是快速啦。
最下面有我写好的表达式。
你上面基本场景做好后,只要使用下面表达式。
就能在每一帧复制好物体。

想让它生长出来,不是直接复制物体就能得到的。它需要给物体Visibility key上动画。下面表达式已经全部在相应出现的帧key好动画了。
现在只要所有所有复制出来的物体,在第一帧把visibility属性key成off。就能出现如下动画表示的这样很好玩的效果了。
2013年01月23日 - 豆芽兵 - 豆芽兵的生存探索
 
摄像机动画没有弄好,看着有点晕。
//Duplicate tool
//By Dominic
//2012.1.24_v1.0

//Public

int $startFrame = 0;
int $endFrame = 24; //if this value off,use user value,else endframe
int $step = 1;


string $newGroupName = "Dominic";
string $slName[] =`ls -sl`; //must named,like "cube" Or "Cube_".can't like sphere1
string $ListName;


//Funcation_001_copy
//start
playButtonEnd;
//decide off/on
if ($endFrame !=24)
{
int $endFrame = `currentTime -q `;
}
else
{
$endFrame = $endFrame;
}


playButtonStart;
$sl = `ls -sl`;
if (size($sl)==0)
print ("//Must be selected One object!!!");

else
{
$a = $startFrame;//startValue
$b = $endFrame;//endValue
for ($i = $a; $i<$b;$i++)
{

$currentFrame =`currentTime -q`;
if ($currentFrame % $step==0)
{
select -r $sl ;
duplicate -rr;

string $selectedList[] = `ls -sl`;
string $currentObject;
string $name;
for ($currentObject in $selectedList)
{

$name = $currentObject+".visibility";
setAttr $name 1;
setKeyframe $name;
}
}

NextFrame;


}

//Function_002_GroupCopy
//Respectively Group for new copied objects

for ($ListName in $slName)
{

select -cl;
string $slAll[] = `ls -type transform ($ListName +"*") `;

select $slAll;
select -d $ListName;
group -n $newGroupName;
// xform -os -piv 0 0 0;


}

//Function_003_InvisibilityCopy
//invisibility all copy object
for ($ListName in $slName)
{
string $slAll[] = `ls -type transform ($ListName +"*")`;

string $currentObject;

for ($currentObject in $slAll)
{

$name = $currentObject+".visibility";
currentTime $endFrame ;
setAttr $name 1;
setKeyframe $name;

currentTime 0 ;
setAttr $name 0;
setKeyframe $name;


}

}

//Tips
print ("//Thanks for using this tool");
}

Maya复制功能小探索 - 豆芽兵 - 豆芽兵的生存探索
 这图就是使用上面脚本自动创建的

现在有个小问题就是,默认情况复制到当前时间栏最后一帧。要使用自己想要的帧,得修改一下

我这个表达式考虑到的有
1.自动让时间帧从当前设置的初始帧到最后一帧。这样就不需要对不同场景设置,修改不同参数了
2.会判断,你有没有选中物体,如果没有,就直接退出来。哈哈,如果没选中,就要被骂喽。
3.自动复制
4.自动在这一帧设置,当前物体的visibility 值,并key帧。你可以试试变成其它参数。
5.NextFrame如果多写几个,就能让表达式每隔几帧复制一下。默认是1帧。多写几个,可以少复制一点。当然这样写是不合适,可以使用其它方法进行判断修改值。
6.如果到达最后一帧就不再复制了。这个问题其实只有在出现多个NextFrame才会出现。所以这样判断复制步长不好,需要修改


上面写的还不完善,需要进一步修改。
自动复制,功能算是用的比较多的了。上面这么一长串其实很简单,就是一个for循环,然后别的都是争对一些问题加上来的。

在复制若干长度后,会形成一个封闭的球形。从第一个物体就能看出来。嗯,这是另一个要探讨的话题了。

如果设置一个不错材质灯光,应该会得到比较酷的那种超现实效果,谁知道呢,一切因为好玩。

艺术家就是这样的吧,对一个很简单功能进行不断深化,做一些匪夷所思的效果。我承认,自己被这样简单的复制给小小震撼了一下,虽然大脑能想到,但活生生出现在眼前,效果还是不一样的。

探索就是这样,没有什么特别的目的,只是一些测试测试,指不定就发掘出什么宝藏是吧。如果你看到我这个小实验,对你有一些启发,发出来分享分享。
  评论这张
 
阅读(1456)| 评论(1)
推荐

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018