在Maya场景中保存Python变量

2 投票
2 回答
4364 浏览
提问于 2025-04-18 04:25

我该如何在Maya场景中保存Python变量呢?

比如说,我在Maya的脚本编辑器里创建了一个变量x,然后保存了场景。当我重新打开Maya并加载之前保存的场景时,发现变量x不见了。

这可能吗?

2 个回答

0

这里有一个简单的例子,教你如何把一个Python变量保存在Maya文件里。

我们要把变量X保存到Maya文件中,X的值是100。

而且我们不想看到这个错误:

# Error: NameError: name 'x' is not defined # 

在你保存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
4

是的,可以使用脚本节点,使用选项变量,或者把变量存储在属性里。

一般来说

在Maya中,场景的持久性应该是通过节点来构建的。实际上,Maya中的一切都应该是一个节点,或者是由节点树构成的。好处是,如果你把计算做成一个节点,Maya会自动为你处理所有的事情。这就像渲染引擎存储数据的方式一样。它们注册一个特殊的节点,并从这个节点读取数据。

如果你需要问“如何在Maya场景中保存Python变量?”,这说明你确实应该构建一个基于节点的解决方案。虽然有一些例外,这些例外与用户的图形界面偏好有关,应该保存为选项变量。

Maya实际上并不强制你以合理的方式做事情。你可以随意做,无论合理与否。因此,使用场景保存的scriptjob来存储环境的快照到一个在加载时自动运行的脚本节点是可能的,虽然这有点不太妥当。这和在代码中使用全局变量一样不太好。它也有点不可靠,因为用户可以出于合理的原因禁用自动运行的scriptNodes

关于节点解决方案

Maya的工作方式通常与大多数人直观上预期的不同。就像你在代码中写的文本并不是计算机实际执行的内容,而是编译后的代码才是被执行的。编译器在这个上下文中有一些灵活性,通常会丢弃一些内容。因此,在代码中,考虑文本的样子并不合理,更应该关注它构建的结构。

在Maya中,你应该构建的结构是节点。除此之外,还有两个额外的使用案例:

  1. 导出器(导入器,但由于其性质,它们是绑定到节点的,因为它们针对Maya)
  2. 图形用户界面,用于检查Maya的当前状态或将外部信息带给用户

这两者只能专注于读取节点。Maya的对象辅助功能可以相当有效地隐藏这一事实,但这实际上就是你所做的。任何超出这个范围的事情都无法从使用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)

这个方法是可行的,但有三个缺点:

  1. 你无法在运行之前知道它的样子。

    不过你可以撤销,所以可以测试和撤销。也许你还需要一个随机的种子变量?

  2. 你需要为此构建一个图形用户界面,以便用户可以使用。
  3. 没有办法指定随机性的特征。

    (这个问题在这里是为了让你更容易运行代码,我可以使用许多Python的噪声实现。不过我会修复这个问题。)

这段代码在某种意义上是直接的,因为它做了用户在图形界面中会做的事情。但实际上发生了什么?这些变化去哪里了?简单来说,答案有两个方面,它们要么去调整数组(最有可能),要么去对象的位置数组。但我可以用Maya的基本元素来更好地实现类似的行为。进入节点。

首先,你需要去“节点购物”,哪些节点实际上可以提供噪声功能呢?问题是,这里似乎没有太多选择。尽管如此,有一个节点基本上是让你自己制作变形的,那就是粒子节点。所以你可以用粒子节点、一些噪声和几个属性来解决这个问题:

... 待续 ...

撰写回答