📄 群系统3.mel
字号:
//添加cancel按钮
//到目前为止,一直都是使用窗口顶端的由MAYA自动提供的关闭框来关闭窗口。为了与MAYA的对话框保持一致,应该在面有的create按钮旁边
//添加一个cancel按钮,该按钮在不改变场景的情况下关闭窗口。另外,因为对话框所执行的操作在中应该只运行一次,所以希望脚本运行之
//后该窗口将会关闭。为了完成这个任务,当cancel按钮被按下时,将使用deleteUI命令告知MAYA关闭该窗口。
//添加更多的小车
//既然已经添加了是创建10还是20个小车的选项。现在来重新设计代码以创建这些小车。不仅需要更改代码以添加用户输入数量的
//小车,而且也要将小车颁布在场景中更广泛的区域里。不管用户选择10还是20,需要在经例3中更广泛的区域中创建它们。
//在那个例子中,是将障碍物放置在X轴的30和-30单位处,以及Z轴20和-20单位处。为了容纳更多的小车,这次将把它们放置在X轴和Z轴120
//和-120单位处。为了添加小车,必须编辑createCrowd()中创建小车的总分。在文本编辑器中,找出创建crowdSolver节点的
//代码行。在表达式总分必须要进行的名称更改工作是令人厌烦的,但是一旦完成它就能够复制并粘贴这部分代码,并将其用
//于导引小车,而只需要更改相应的名称。使用一条switch命令来处理决定小车数量的无线按钮,并根据$vNumber的值10还是20
//为变量$FvNumber和$LvNumber赋予合适的值。在createCrowd()过程中输入下面的新代码
rigidSolver -create -current -name crowdSolver -velocityVectorScale 0.5 -displayVelocity on;
setAttr crowdSolver.allowDisconnection 1;
//Get total number of vehicles from interface options
int $FvNumber;
int $LvNumber;
switch ($vNumber)
{
case 10;
$FvNumber=8;//Followers
$LvNumber=2;//Leaders
break;
case 20;
$FvNumber=16;
$LvNumber=4;
break;
}
//Basic vehicle mondel type:follower
for($i=0;$i<$FvNumber;$i++)
{
polyCube -name ("vehicleF_"+$i) -width 2 -height 2.5 -depth 2;
//add vehicle force field for follower
radial -pos 0 0 0 -name ("vehicleFForce_"+$i) -magnitude 50 -attenuation .3 -maxDistance 8.0;
parent ("vehicleFForce_"+$i) ("vehicleF_"+$i);
//make vehicle a rigid body with random placement
rigidBody -name ("rigidVehicleF_"+$i) -active -mass 1 -bounciness 0 -dmp 1.5 -position (rand(-120,120)) 0 (rand(-120,120))
-impulse 0 0 0 -sio cube -solver crowdSolver ("vehicleF_"+$i)
disconnectAttr ("rigidVehicleF_"+$i+"ry.output") ("vehicleF_"+$i+".rotateY");
disconnectAttr ("rigidVehicleF_"+$i+"rx.output") ("vehicleF_"+$i+".rotateX");
disconnectAttr ("rigidVehicleF_"+$i+"rz.output") ("vehicleF_"+$i+".rotateZ");
//create expression for vehicleF with a random multiplier added to expression
float $randX=rand(-3,3);
float $randZ=rand(-3,3);
$expString = "//set wander motion of vehicle and add random multipliers.\n";
$expString += ("rigidVehicleF_"+$i+".impulseX")+"=sin(time*($randX));\n";
$expString += ("rigidVehicleF_"+$i+".impulseZ")+"=(noise(time))*$randZ;\n\n";
$expString += "//set orientation of vehicle according to the velocity direction.\n";
$expString += "float $fVel"+$i+"[];\n";
$expString += "$fVel"+$i+" =`getAttr rigidVehicleF_"+$i+".velocity`;\n\n";
$expString += "vehicleF_"+$i+".rotateX=0;\n";
$expString += "vehicleF_"+$i+".rotateY=atan2d($fVel"+$i+"[0],$fVel"=$i+"[2]);\n";
$expString += "vehicleF_"+$i+".rotateZ=0;\n";
expression -s $expString -name ("wanderF_exp"+$i) -ae true -uc all;
}//end of follower creation
//这个版本脚本的一个新特性是使用了rand函数来放置跟随小车。同时,这个版本在每个小车的wander表达式中为正弦函数
//选取一个随机乘数,并将该数字插入到wander表达式字符串的创建过程中。这比在表达式中直接引用全局变量$xMult和$zMult
//具有更高的效率,并且会使得仿真运行得更快。
//现在,继续编写导引小车代码。为了创建该代码,可以粘贴创建跟随小车的代码,并为额外的放射场添加一行代码,该放射
//场将导引小车和跟随小车区分开来。当然,也要更改小车的名称使得导引小车名称包括字母L而不是跟随小车中的字母F。在
//表达式中,也将为浮点数组$fVel赋予新的名称,以使得每个跟随小车都有该变量自己的拷贝。将会把这个变量命名为$fVelL<n>[]
//其中<n>是跟随小车的编号。例如,第一个小车的$fVelL变量将被称为$fVelL1[],第二个将被称为$fVelL2[]。
//将添加的另一个新特性是创建作为导引小车层次结构一部分的GlobalLeadForec放射场。它需要具有经以前更细致的效果,因此要规定
//它的影响范围,以将其所产生效果限制在一定距离内的跟随小车上。为了完成这个任务,需要更改attenuation参数,并添加
//一个值为50的maxDistance参数。
//Basic vehicle model type:leader
//______________________________
for ($i=0;$i<$LvNumber;$i++)
{
polyCube -name ("vehicleL_"+$i) -width 2 -height 2.5 -depth 2;
//add vehicle force field for leader
radial -pos 0 0 0 -name ("vehicleLForce_"+$i) -m 50 -att .3 -md 5.0;
parent ("vehicleLForce_"+$i) ("vehicleL_"+$i);
//add leader field
radial -pos 0 0 0 -name ("vehicleGlobalLeadForce_"+$i) -m -1 -att .2 -md 50;
parent ("vehicleGlobalLeadForce_"+$i) ("vehicleL-"+$i);
//Make vehicle a rigid body with random placement
rigidBody -name ("rigidVehicleL_"+$i) -active -mass 1 -b 0 -dmp 1.5 -pos (rand(-120,120)) 0 (rand(-120,120)) -impulse 0 0 0 -sio cube -solver crowdSolver ("vehicleL_"+$i);
disconnectAttr ("rigidVehicleL_"+$i+"ry.output") ("vehicleL_"+$i+".ratateY");
disconnectAttr ("rigidVehicleL_"+$i+"rx.output") ("vehicleL_"+$i+".ratateX");
disconnectAttr ("rigidVehicleL_"+$i+"rz.output") ("vehicleL_"+$i+".ratateZ");
//Create expression for VehicleL with random multiplier added to expression
float $randX=rand(-3,3);
float $randZ=rand(-3,3);
//Change $fVel[] to $fVelL[] in expression
$expString = "//set wander motion of vehicle and add multipliers.\n";
$expString += ("rigidVehicleL_"+$i+".impulseX")+"=sin(time*($randX));\n";
$expString += ("rigidVehicleL_"+$i+".impulseZ")+"=noise(time)*($randZ);\n\n";
$expString += "//Set orientation of Vehicle according to the velocity direction.\n";
$expString += "float $fVelL"+$i+"[];\n";
$expString += "$fVel"+$i+" =`getAttr rigidVehicleL_"+$i+".velocity`;\n\n";
$expString += "vehicleL_"+$i+".rotateX=0;\n";
$expString += "vehicleL_"+$i+".rotateY=atan2d($fVelL"+$i+"[0],$fVelL"+$i+"[2]);\n";
$expString += "vehicleL_"+$i+".rotateZ=0;\n";
expression -s $expString -name ("wanderL_exp"+$i) -ae true -uc all;
}//End of leader creation
//添加从一个过程到另一个过程的整数传递
//在测试该脚本前,需要为createCrowd()全局过程添加一个参数,以允许为该过程传递小车的数量
//createCrowd
//__________
global proc createCrowd(int $vNumber)//pass ints from interface
//同时也需要更改在create按钮命令中对createCrowd的调用。在全局过程crowdSystem()中启动窗口代码段的底部,做如下更改
//Add commands to buttons
button -edit -command ("createCrowd($vNumber);deleteUI crowdWin;") $button1;
//这个更改将把整型变量$vNumber作为一个参数传递给createCrowd()过程。
//测试脚本,在所出现的对话框中单击create按钮,如果一切正常,将会得到相应数量的小车。可能会得到一条警告信息
//"New procedure definition for createCrowd"。这个警告信息告知createCrowd函数的参数已经被更改,如果不是有意要
//这么做,这可能是一个严重的错误。这里是有意进行这样的更改,所以忽略该警告信息。稍后当全局力添加参数以及使用障碍对象
//时会再次出现这种情况。确定10和20这两个选项都能正常运行。麝香在尝试不同选项前创建一个新场景。播放场景,将会
//看到小车在各自wander表达式的控制下四处漫游。
//利用"嵌套"循环将放射场与导引车和跟随车连接起来
//现在需要设立一些"嵌套"循环将场连接到小车。同时也需要从crowdSystem()过程中传递出另一个整数,以告知createCrowd()
//函数创建全局力并连接它们。在Hook up the fields代码部分,删除例3中的代码,并将其替换为下面的代码:
for($i=0;$i<$LvNumber;$i++)
{
//connect leaders to followers,both fields
for($j=0;$j<$FvNumber;$j++)
{
connectDynamic -f ("vehicleLForce_"+$i) ("rigidVehicleF_"+$j);
connectDynamic -f ("vehicleGlobalLeadForce_"+$i) ("rigidVehicleF_"+$j);
}
}
for ($i=0;$i<FvNumber;$i++)
{
//connect followers to Leaders
for($j=0;$j<$FvNumber;$j++)
{
connectDynamic -f ("vehicleFForce_"+$i) ("rigidVehicleL_"+$j);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -