如何在 Maya 场景中保存 Python 变量?
例如,我在 Maya 的脚本编辑器中创建变量 x 并保存场景。当我重新打开 Maya 并重新打开保存的场景时,x 变量不再存在。
可能吗?
最佳答案
是的,使用脚本节点、使用 optionVar 或将变量存储在属性中。
一般情况
场景持久化应该是用节点构建的。事实上,Maya 中的所有内容都应该是一个节点或由节点树构建而成。好处是,如果您将计算作为一个节点,那么 Maya 将自动为您处理所有内容。这就是渲染引擎存储数据的方式。他们注册一个特殊的节点并从该节点读取数据。
需要问这个问题,“如何在 Maya 场景中保存 Python 变量?”,这表明您确实应该构建一个节点解决方案。有一些异常(exception),这些异常(exception)与应保存为 optionVars 的一般用户 GUI 首选项相关。
玛雅实际上并没有强制你理智地做事。你可以自由地做任何你想做的事,无论理智与否。因此,可以使用场景保存脚本作业将环境快照存储到加载时自动运行的脚本节点,但这有点可疑。这是不受欢迎的,就像使用全局变量对于一般代码来说是不受欢迎的一样。它也有点不可靠,因为用户可以禁用加载脚本节点的自动运行,这是有充分理由的。
关于节点解决方案
Maya 通常不会按照大多数人乍一看直观期望的方式工作。就像您在代码中编写的文本不是计算机通常执行的内容一样,而是编译后的代码才是执行的内容。编译器对我在这种情况下可以做什么有一点余地,通常会丢弃一些东西。因此,在代码中,考虑文本在代码中的样子,而不是考虑它构建的结构,并不是真正理智的。
在 Maya 中,您应该构建的结构是节点。除此之外还有两个额外的用例,它们是:
- 导出器(导入器,但由于其性质,它们受节点绑定(bind),因为它们以 Maya 为目标)
- 图形用户界面,可内省(introspection) Maya 当前状态或向用户提供外部信息
这两个只能专攻读取节点。 Mayas 对象辅助功能本质上可以非常有效地向用户隐藏事实,但这本质上是您想要做的。此范围之外的任何内容都不会从使用 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,以便用户可以使用它。
无法指定随机性的概况。
(这个在这里,所以你可以轻松运行代码,我可以使用许多 python 噪声实现之一。尽管如此,我会修复这个问题。)
代码很简单,因为 id 执行用户在 GUI 中执行的操作。但到底发生了什么?变化去哪儿了?简而言之,答案是 2 倍,它们要么进入调整数组(最有可能),要么进入对象位置数组。但我有一个更好的方法可以使用 Maya 基元来操纵类似的行为。输入节点。
首先,您需要进行一些节点购物,哪些节点实际上可以提供噪声功能?问题是这里似乎没有太多竞争者。尽管有这个节点基本上是滚动你自己的变形,那就是粒子节点。因此,这就是您使用粒子节点、一些噪声和一些属性来解决问题的方法:
...未完待续...
关于python - 使用 Maya 场景保存 Python 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23317884/