我在Maya中创建了一个3D树,需要MEL代码在for循环中运行并生成尽可能多的树。有没有办法将Maya中制作的模型转换为可以重建树的MEL代码?
我不能只复制它,因为脚本需要从头开始生成树。不幸的是,我清除了我的历史,因为它很乱,所以我正在寻找一种方法来生成给定几何的MEL代码。
答案 0 :(得分:2)
您删除历史记录有点不幸。如果你没有,那么你可以在历史树中创建一个脚本。但一切都没有丢失,我仍然会解释你如何做到这一点,以防你在某些时候重新制作历史。
至少在建模时,历史的复杂性从来都不是问题。我建议不要删除任何历史记录,直到你确定它没用。拥有1000个节点历史记录不会以任何方式减慢速度,因为大多数节点都处于非活动状态。一旦你进入动画,它只是一个问题,即使它根本不是一个问题。由于历史删除有点破坏性,因此在删除大部分历史记录时保存场景是一个好主意。因此,经验法则不会删除历史记录并使用冻结转换操作,除非它确实是必要的(并且可能您实际上从未实际执行此操作)。
另一方面评论:复制内容仍然有效,除非在这种情况下存在人为限制。此限制有效的唯一时间是这是否是作业(在这种情况下,您可能希望证明您愿意遵循指示)。复制不会以任何方式减损最终结果。复制是mel(并且所有maya ascii文件都是各种各样的。)
您可以将问题减少到正常的装配操作。你所做的就是用树骨,簇和可能混合的形状装配树。然后在每次复制操作中随机化您的装备的通道。这里的巧妙之处在于,只需创建新的独立装备,脚本就可以通过不同的基础树或几乎任何东西轻松扩展。
这里的奖励是你现在也可以轻松地为被风吹过的树等动画。
这可能感觉像作业范围之外的东西。然而,一个好的MEL程序员并没有真正分开任务。使用节点执行某些操作与在代码中编写所有内容一样有效,如果不是更有效。这样的事情表明了对maya使用和maya编程的真正透彻理解。另一方面,并非所有用户都是开明的(大部分都没有)。
Maya中的所有内容都是或者至少应该是一个装备。 (对此的辅助是你的mel应该努力构建一个装备,或者你应该使用API来制作节点)
将结果整理成碎片。然后使用基于规则的生成器 L-system 随机化块状位置。当使用L系统生成整个物体时,使用带有手动建模件的L系统可能看起来反直觉。 但是clunking允许构建一个非常简单的l系统。最终结果还在某些方面保留了原作的艺术完整性,可能更令人愉悦。
这个和方法3的略有不同的版本是在模型中制作2-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";
}
但这是我有时间的,希望这会有所帮助。