如何在Maya场景中保存Python变量?
例如,我在Maya的脚本编辑器中创建变量x,然后保存场景。当我重新打开Maya并重新打开已保存的场景时,x变量不再存在。
有可能吗?
答案 0 :(得分:3)
是的,使用脚本节点,使用optionVar或将变量存储在属性中。
场景持久性应该用节点构建。事实上,Maya中的所有内容都应该是节点或由节点树构建。奖励是如果您将计算作为节点,那么maya将自动为您处理所有内容。这就是渲染引擎例如存储数据的方式。它们注册一个特殊节点并从节点读取数据。
需要问这个问题,"如何在Maya场景中保存Python变量?",表明你确实应该构建一个节点解决方案。这有一些例外,它们与应保存为optionVars的一般用户GUI首选项有关。
玛雅实际上并没有强制你做得很清楚。你可以自由地做任何你想做的事情,理智与否。因此,使用场景保存 scriptjob 将环境快照存储到自动运行的脚本节点是可能的,有点可疑。这是不希望的,因为通常使用全局变量对于代码是不期望的。它也有点不可靠,因为用户可以禁用自动运行on scriptNodes ,原因很简单。
玛雅作为一项规则并不像大多数人乍一看直觉所期望的那样工作。就像您在代码中编写的文本不是您的计算机通常执行的文本,而是编译后的代码是执行的。对于我在这种情况下可以做的事情,编译器有一些余地,并且通常会抛弃一些东西。因此,在代码中,根据代码中的文本内容而不是构建它构造的结构来考虑它并不是真的很合理。
在Maya中,您应该构建的结构是节点。除此之外还有两个额外的用例,它们是:
这两个只能专门阅读节点。 Mayas对象辅助功能本质可以非常有效地隐藏用户的事实,但这实际上是希望你做的。使用Maya时,此范围之外的任何内容都不会受益。因此,无论何时使用maya,您都希望利用节点。可以把它想象成你在自己的编程语言之上使用第二种语言。这是Maya的实际语言。
让我们从一个天真的方法开始,为网格随机化点位置(注意我避免使用术语对象,因为Maya没有这样的概念):
import maya.cmds as cmds
import random
def randomize_points(scale):
sel = cmds.polyListComponentConversion(ff=1, fe=1, fuv=1, fvf=1, tv=1)
sel = cmds.ls(sel ,fl=1)
for item in sel:
cmds.move((random.random()-0.5)*scale,
(random.random()-0.5)*scale,
(random.random()-0.5)*scale,
item, r=1)
它有效,但有三个不足之处:
在运行之前,你无法知道它的样子。
你可以撤消艰难的测试和撤消。也许您还需要随机种子变量?
无法指定随机性的配置文件。
(这个就在这里,所以你可以很容易地运行我可以使用许多蟒蛇噪声实现之一的代码。但我会解决这个问题。)
代码在意义上是直截了当的,用户会在GUI中做什么。但究竟发生了什么?变化在哪里?简单地说,答案是2倍,他们去调整数组(最有可能),或对象位置数组。但是有一种更好的方法可以使用Maya原语来操纵类似的行为。输入节点。
首先你需要购买点节点,哪些节点实际上可以提供噪音功能?事情是这里似乎没有很多竞争者。尽管有一个节点基本上是你自己的变形,那就是粒子节点。所以这就是你用粒子节点,一些噪音和一些属性攻击问题的方法:
......继续......
答案 1 :(得分:-1)
以下是在maya文件中保存python变量的简单示例。
允许在Maya文件中保存变量X,X的值为100。
我们不希望看到这个错误:
# Error: NameError: name 'x' is not defined #
在Maya文件中保存变量在保存Maya文件之前执行此代码。
import maya.cmds as cmds
var_node = cmds.scriptNode(scriptType=1, name='CustomVariable', beforeScript='python("x = 100")')
cmds.scriptNode( var_node, executeBefore=True )
再次打开文件并执行:
print x