2

我在 Maya 中制作了一个 3D 树,需要 MEL 代码在 for 循环中运行并生成所需数量的树。有什么方法可以将 Maya 中制作的模型转换为可以重建树的 MEL 代码?

我不能只是复制它,因为脚本需要从头开始生成树。不幸的是,我清除了我的历史记录,因为它很乱,所以我正在寻找一种方法来生成仅给出几何图形的 MEL 代码。

4

1 回答 1

2

有点遗憾,您删除了历史记录。如果你没有,那么你可以在历史树中构建一个脚本。但一切都没有丢失,我仍然会解释你如何做到这一点,以防你在某个时候重新创造历史。

历史的复杂性从来都不是真正的问题,至少在建模时是这样。我建议在您确定没有用之前不要删除任何历史记录。拥有 1000 个节点的历史不会以任何方式减慢您的速度,因为其中大部分都处于非活动状态。一旦你进入动画,它只是一个问题,即使那样它也不一定是一个问题。由于历史删除有点破坏性,因此在删除大范围历史时保存场景是个好主意。所以经验法则不要删除历史记录并使用冻结转换操作,除非它真的有必要(并且可能你从来没有真正这样做过)。

另一个旁白:复制东西仍然有效,除非像这种情况下存在人为限制。此限制唯一有效的情况是这是家庭作业(在这种情况下,您可能希望证明您愿意遵循指示)。复制不会以任何方式减损最终结果。复制是 mel(并且所有 maya ascii 文件都是 mel 之类的)。

方法一:(清除历史时)

您可以将问题减少到正常的索具操作。你要做的是用骨骼、集群和可能的混合形状来装配你构建的树。然后在每个复制操作中随机化你的装备的通道。这里的巧妙之处在于,脚本可以很容易地用不同的基础树进行扩展,或者几乎任何东西,只需制作新的独立装备。

这里的好处是您现在还可以轻松地为被风吹动的树等设置动画。

这可能感觉像是在任务范围之外的东西。然而,优秀的 MEL 程序员并不会真正分离任务。使用节点做某事与用代码编写所有内容一样有效,如果不是更有效的话。这样的事情展示了对 Maya 使用和 Maya 编程的真正透彻理解。另一方面,并​​非所有用户都如此开明(大多数不是)。

Maya 中的一切都是或至少应该是一个装备。(对此的辅助是你的 mel 应该努力构建一个 rig 或者你应该使用 API 来制作节点)

方法二:(清除历史时)

将你的结果分成几部分。然后使用L 系统(如基于规则的生成器)随机化块位置。当整个事物都可以使用 L 系统生成时,使用带有手工建模部件的 L 系统似乎违反直觉。但是 clunking 允许构建一个非常简单的 l 系统。最终结果还以某些可能更令人愉悦的方式保留了原作的艺术完整性。

这个和方法 3 稍有不同的版本是在模型中制作 2-3 个重叠的分支集,然后随机删除分支以进行变化。

方法3:(清除历史时)

作弊,好吧,我实际上会争辩说,在CG中没有作弊之类的东西。只需复制同一棵树,改变它的旋转和比例。并为您的模型随机化新的着色器(交换不同的叶子纹理不同的颜色等)。结合少量的索具方法可以完全隐藏只有一棵树的事实。副本不必那么精确,它们可以用格子或其他东西来塑造。这实际上非常有效,大多数人不会注意到。

方法四:(不清除历史时)

当您手动建模某些东西时,maya 会非常有效地记录这一点。历史可以毫不费力地变成脚本。最好的秘密。如果您将这种场景保存为 maya ascii,那么 maya ascii 文件(几乎)只是 mel,您可以通过向流中添加变量以将其检测到 mel 来重复此操作。请注意,并非所有工具都构建有意义的历史记录,因此点调整应该在集群上完成,而不是手动点调整,最终在形状调整数组中。

也可以使用 mel 脚本自动构建 mel,该脚本检查节点中的连接和值以在代码中重现事物。好消息是您可以轻松地引入仪器。这是一个非常旧版本的代码作为赠品(例如,您需要处理着色器和 inputComponents):

/* jooConvertNodeNetworkToMelLadder.mel  0.0

  Authors:     Janne 'Joojaa' Ojala
  Testing:     Has known bugs, code deprecated, no bug reporting
  Licence:     Creative Commons Attribution-ShareAlike 3.0 Unported
  About:

  A deprecated early version of code generation it has some bugs and
  is nowhere near perfect but you can have this code for the heck of
  it. Main thing missing is that it does not check for selection 
  sets for nodes so you need to make those manually.

  Install Instructions:

  copy jooConvertNodeNetworkToMelLadder.mel to your maya script 
  directory

  Usage:

  Select node and run jooConvertNodeNetworkToMelLadder from mel 
  commandline.

  Deprecated at 31.12.2006
*/

proc string generateAttrib(string $node, string $createNode,
                           string $attrib,string $varName){
  string $return="";
  if (getAttr($node + "." + $attrib) != 
      getAttr($createNode + "." + $attrib))
    $return = ("  setAttr (" +
                $varName + "+\"." + $attrib+"\") "+
                getAttr($node + "." + $attrib) + ";\n");
  return $return;
}

proc string doOneNode(string $nodeOrig,string $connections[]){
  string $hist[]=`listConnections    -c 1 -p 1 $nodeOrig`;
  string $return="";
  $type=`nodeType $nodeOrig`;
  $varName=("$"+$nodeOrig);
  $createNode=`createNode $type`;
  $return=("  "+$varName+"=`createNode -n "+$nodeOrig+" "+$type+"`;\n");
  if ($type != "mesh") {
      for ($attrib in `listAttr -settable -multi -w -scalar $createNode`){
          $return += generateAttrib($nodeOrig, $createNode,
                                    $attrib, $varName);
      }
  }
  delete $createNode;

  for ($i=0;$i< size($hist);$i=$i+2){
    if (size(`connectionInfo -dfs $hist[$i]`)){
      string $node,$port,$type,$nodeOrig,$portOrig;
      $node=`match "[^.]*" $hist[$i+1]`;
      $port=`match "[.].*$" $hist[$i+1]`;
      $nodeOrig=`match "[^.]*" $hist[$i]`;
      $portOrig=`match "[.].*$" $hist[$i]`;
      $connections[size($connections)]= 
      ("  connectAttr -f ($" + 
        $nodeOrig + "+\"" + $portOrig + "\") ($" +
        $node+"+\""+$port+"\");");
    }
  }

  return $return;
}

global proc jooConvertNodeNetworkToMelLadder()
{
  print "\n// jooConvertNodeNetworkToMelLadder result:\n{\n";
    string $a[]={};
    for ($node in `listHistory`)
    print(`doOneNode $node $a`);
    print $a;

  print "}\n";
}

但这就是我所有的时间,希望这会有所帮助。

于 2014-04-21T13:49:34.970 回答