⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 群系统3.mel

📁 MAYA的MEL编程
💻 MEL
📖 第 1 页 / 共 2 页
字号:
  }
}
//上面这段代码对每一组小车使用for循环进行遍历。在第一个循环中,每个导引小车被连接到所有的跟随小车,在第个循环中
//每个跟随小车被连接到所有的导引小车。保存脚本并再次清除场景。单击MEL图标并观察结果。这次会得到更细致的效果
//当导引小车靠近时,每个跟随小车开始跟随导引小车,如果它们落在小车的影响距离之外,它们将以自己的方式运动。
//现在需要将跟随小车的场连接到跟随小车,导引小车的握手连接到导引小车,以使得能够得到与例3中所找不到的相同的
//避让行为。需要另一个嵌套循环完成这个工作。在脚本中紧接着上面的循环输入下面的代码:
//connect same type vehicles to each other.Disconnect vehicle from itself
for ($i=0;$i<LvNumber;$i++)
{
//connect leaders to leaders
  for($j=0;$j<$LvNumber;$j++)
  {
  connectDynamic -f ("vehicleLForce_"+$i) ("rigidVehicleL_"+$j);
  }
connectDynamic -delete -f ("vehicleLForce_"+$i) ("rigidVehicleL_"+$i);
}
for($i=0;$i<$FvNumber;$i++)
{
//connect followers to followers
  for($j=0;$j<$FvNumber;$j++)
  {
  connectDynamic -f ("vehicleFForce_"+$i) ("rigidVehicleF_"+$j);
  }
connectDynamic -delete -f ("vehicleFForce_"+$i) ("rigidVehicleF_"+$i);
}
//最后,必须断开(-delete)连接到自身的力场,以使得小车不会试图排斥自己。在空上例子中,如果不断开这些场也不会有什么明显的
//效果,但是在使用动力学引擎时,确保不存在没有物理意义的连接通常是一个好的做法,因为这样的连接可能会导致无法预期
//的结果。现在会看到小车的运动变得相当自然,它们沿着自己的运动,相互避让并跟随导引小车。
//在主脚本中添加全局力的函数
//在目前这个当口,需要检查$gForce变量以决定是否调用makeGforces()。需要执行全局过程makeGforces(),以保证在
//Hook up fields部分的代码中连接全局力时,它们是存在的。首先,需要检查在中该选项是否被选中。在针对小车数量的
//switch语句之后,将下面的行添加到代码中
if($gforces==1) makeGforces;//check global forces option
//Basic vehicle model type:follower
//现在将为createCrowd()过程添加一个由crowdSystem()过程传入的整型参数。编辑createCrowd()过程的定义以接受这个新的参数:
global proc createCrowd(int $vNumber,int $gforces)
{
//在crowdSystem()过程中添加$gforces,具体如下:
button -edit -command ("createCrwod $vNumber $gforces;deleteUI crowdWin;") $buttion1;
}
//现在需要在循环中添加当$gforces被设置为1(即用户打开全局场选项)时,连接全局场的代码。在Hook up fields代码部分添加
//connect global forces to both types of vehicles if option is on
if ($gforces==1)
{
string $compass[4]={"N","S","E","W"};
  for($i=0;$i<$LvNumber;$i++)
  {
     for($c=0;$c<size($compass);$c++)
     {
     connectDynamic -f ("Gforce"+$compass[$c]) ("rigidVehicleL_"+$i);
     }
  }
  for($i=0;$i<$FvNumber;$i++)
  {
     for($c=0;$c<size($compass[$c]);$c++)
     {
     connectDynamic -f ("Gforce"+$compass[$c]) ("rigidVehicleF_"+$i);
     }
  }
}
//这段代码是在前面所使用的嵌套循环的变体,只是在其中创建了一个4包含个主要方向的数组$compass,并使用这些字符串来构造每一个场的名称
//测试全局力的选项
//需要再次测试该脚本,以确保全局力选项能够正确控制场的创建和连接,这些场实现全局力。保存该脚本并单击搁板上的MEL
//图标。当对话框出现时,打开Global Forces选项并单击Create按钮。移动滑块以利用全局场沿不同方向推动小车。如果希望
//查看是否所有场连接都是正确的,选择Window>>Relationship Editors>>Dynamic Relationships..菜单项。
//添加主启动过程
//这里希望为脚本添加一个主过程,它将提供两个功能。首先,它将初始化一个全局字符串数组,其中将包含脚本启动时在MAYA
//界面中所选中对象的名称列表。稍后,将添加这些被选中对象成为障碍物的代码。其次,主过程将添加判断窗口是否已经存在
//的测试语句。如果该窗口已经存在,就说明该脚本前一次执行所创建的旧窗口仍然处于打开状态,并且先前的群系统也可能
//存在。在madeGlobalForce过程后,将下面的代码添加到脚本中:
//main
//____
global proc crowdMain()
{
global string $collectObjects[];//Initialize global string that all procs can see
  if (`window -exists crowdWin`)//Check to see if window is open
  {
  confirmdialog -t "Already running!" -m "Please close Crowd System window and create a New Scene";
  }
  else
  {
  $collectObjects=`ls -sl`;//collect objects that are selected
  crowdSystem;//Run crowdSystem proc
  }
}
//在该窗口已经处于打开的情况下,使用confirmDialog提供一条错误信息。在用户按下confirm按钮后该脚本将退出。如果希望在不运行该脚本
//的情况下看到错误提示对话框,将下面折代码剪切并粘贴到脚本编辑器中,并按下回车
confirmDialog -t "Already running!" -m "Please close Crowd System window and create a New Scene";
//为在过程之间共享数据而创建保存所选中对象列表的全局变量$collectObjects常常不是一个好的做法,通常,将数据作为过程
//的参数来传递是一个更好的选择。然而,在大型的脚本中,将在代码中很多地方都需要访问的、类似初始选取列表这样的数据
//作为全局变量来使用是合理的。因为现在希望使用脚本的入口点为crowdMain()过程,需要在搁板按钮MEL脚本中将对crowdSystem()
//的调用替换为对crowdMain()的调用。
//为脚本添加collectObstacles过程
//现在为脚本添加一个新的collectObstacles过程,该过程在对话框中obstacles特性被打开的情况下,会使得所有被选中对象成为障碍
//物。在createCrowd过程后,加入下面的代码
cycleCheck -e off;
//Build obstacles
//_______________
global proc collectObstacles()
{
  global string $collectObjects[];
  //Re-declare global array for obstacles
  if (size($collectObjects)==0)
  {
  warning "No obstacles objects were selected.";
  }
  else
  {
    for($i=0;$i<size($collectObjects);$i++)
    {
    rigidBody -passive -name ($collectObjects[$i]+"RigidB"+$i) -b 2.0 ($collectObjects[$i]);
    }
  }
}//End of collectObstacles proc
//上面的过程首先声明全局变量$collectObstacles,以使能在该过程的代码中访问该变量。接着,该过程遍历在$collectObstacles
//变量中所列出的对象,并将这些对象转变为刚体对象,以使得小车能够与它们进行碰撞。rigidBody命令自动将新的刚体对象连接到
//crowdSolver对象,因为它仍然是当前求解器。同时,也将添加脚本运行时,在没有选中任何对象的条件下会显示的一条警告
//信息:warning "No obstacle objects were selected."
//该警告信息通知用户在界面中Obstacles On选项已经被选中,但没有任何对象被选中,并被存储到$collectObstacles数组中
//该警告不会停止运行该脚本,而只会在MAYA界面右下角的状态行中打印该警告信息。将warning命令行剪切并粘贴到脚本编辑
//器中,看看它能产生什么效果。
//在场景中添加对象并运行脚本
//下面在场景中放置一些对象并测试Obstacles选项。创建一个新场景并在其中放置几个polyCube对象。可以将Cube放置在
//任何喜欢的位置,但是记住小车将会被分布在X轴和Z轴坐标为-120和120之间的区域内。选中这些Cube并单击MEL按钮。
//注意:有时候,可能会因为有两个或多个小车被放到一个障碍物中,或者被放到另一个小车中而看到一条构造信息。由于
//障碍物和小车会相互排斥,这个问题在几帧之内将会自己得到纠正。这个问题是由于使用rand函数来放置小车,并在放置之前
//没有检查它们是否相交所导致的结果。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -