一半君的总结纸

听话只听一半君

#100 如何在场景文件中保存数值或者字符串,以备在之后打开文件时使用?

有很多种方式可以在 scene 里保存自定义数据. 你只有一点需要知道:

Maya 存在场景文件的所有东西都必须是 dependency graph 的一部分. 所以,你要么存在节点(node)上, 要么存在某个node的属性(attribute)上, 要么把节点之间的连接作为保存的信息.

过去的多年间,Maya用户们总结出了各种解决方法. 各种方法都有其优缺点; 你用的时候可以根据具体情况自行选择.

Custom Attributes

最简单的方法就是随便找个node,创建一个自定义动态属性(custom dynamic attribute). 这个 attribute 可以是数值也可以是字符串,只要是Maya支持的那几种属性之一都可以,你想存什么数据进去都行.

这种方法的缺点就是node可能会被用户不小心删掉. 如果你加数据的node是个 DAG node 那他就会显示在Maya的 Outliner里, Hypergraph里 和 camera views里. 如果用户能选择到他,那他就有可能被删掉.

Note: Maya 5.0 在 API 里新增加了可以锁定 nodes 或者 attributes 的功能,这样他们就变成只读的了.

The “Unknown” Node

另外一个流行的方法是使用 “unknown” node. (我不是乱讲的 – Maya 是可以让你创建一个类型是”unknown”的node的.)

这和上面的 “Custom Attributes” 方法差不多, 区别是这个node不会出现在Maya的 DAG 视图里,所以不会被疲于加班的artist不小心删掉. 缺点是如果需要改动node上的数据就会麻烦点; 你也许会被要求做个单独的UI来给普通用户使用.

// 创建一个 "unknown" node.
string $unknown = `createNode -name "_sceneNotes" "unknown"`;

// 添加两个 attributes.
addAttr -dt "string" -ln "rigComment" $unknown;
addAttr -at "float" -ln "strideDistance" $unknown;

// 给 attributes 赋值.
setAttr -type "string" ( $unknown + ".rigComment" ) "This rig is ready for animating.";
setAttr ( $unknown + ".strideDistance" ) 0.65;

Note: 除了使用名字之外,无法区分两个 “unknown” node . Maya 使用这种 node 类型的目的是,当打开文件时,如果遇到未知的节点类型(比如之前存文件的人使用了某个插件,而你这里没有装),就把从这些插件里来的节点当成”unknown” node,以保持那些从plugin来的node上的已有信息. 所以你如果用这种方法,最好给你自己的 node 起一个独特的名字,而不要用场景里随便一个 “unknown” node.

The Camera Hack

有个常用的防止用户无意中删掉你想保存的信息的方法是,使用 Maya 自带的默认 cameras – persp, top, front 或者 side – 在他们身上添加 custom attribute 来保存你的数据. 这种方法比较安全,因为这些默认 cameras 是只读的, Maya 不准用户把他们删掉.

// 找到 Maya的 默认 camera.
string $camera = findStartUpCamera( "persp" );

// 添加两个 attributes.
addAttr -dt "string" -ln "rigComment" $camera;
addAttr -at "float" -ln "strideDistance" $camera;

// 给 attributes 赋值.
setAttr -type "string" ( $camera + ".rigComment" ) "This rig is ready for animating.";
setAttr ( $camera + ".strideDistance" ) 0.65;

Note: “findStartUpCamera” 命令返回的是 camera的 transform ,不是 shape.

The Custom Node

通过使用 API 来创建自定义节点类型,你可以完全自定义你想用来保存数据的属性. 不过这样这些属性就变成了node定义的一部分,不能被用户改动了. 他们也不能用”addAttr”命令来当作dynamic attributes添加. 只要创建了你的 custom node ,所有他自带的 attributes 就都有了.

这样还有个好处. 你的node的用处不会被搞混, 你也不需要依靠命名规范来找到你的node了.

string $myCustomNodes[] = `ls -type "myCustomNode"`;

The “.notes” Attribute

Maya 4.5 新增加了在Attribute Editor里给每个node添加notes的功能 . 这些 notes 保存在节点的 ‘.notes’ 属性上.

但是这个attribute 是动态添加的, 只有当你给node加notes的时候他才被创建. 如果你是通过命令行添加note,那你得事先测试这个attribute是否存在(不存在的话则需要自行添加).

string $targetNode = "someNodeInYourScene";

// 如果 ".notes" attribute 不存在就添加他.
if ( !`attributeQuery -node $targetNode -exists "notes"` )
{
  addAttr -sn "nts" -ln "notes" -dt "string" $targetNode;
}

// 保存 note.
setAttr -type "string" ( $targetNode + ".notes" )
  "This rig is ready for animating. The stride distance should be 0.65m";

The “fileInfo” Command

Maya 5.0 新增加了一个 MEL command 可以在 scene file 里保存自定义信息.” “fileInfo” 命令可以用来定义 keyword/value 对, 保存在 scene file 里.

// 创建两对 keyword/value .
fileInfo "rigComment" "This rig is ready for animating.";
fileInfo "strideDistance" "0.65";

“value” 在这里只能是 string, 但是当然你也可以把数值当string保存.

The “scriptNode”

如果你想根据保存的信息进行某些操作,那你可以用 “scriptNode” 功能(这个node是保存在场景文件里的). 其功能是当场景文件打开的时候可以自动执行你定义的 MEL commands. 这些命令可以做任何事,比如给某个UI赋初始值,或是打开他自己的UI.

// 下面的 command 会在场景文件打开后弹出一个对话框...
string $command = "confirmDialog -message \"This rig is ready for animating.\" -button \"OK\";";
// ... 并设置strideDistanceUI工具UI上的一个滑条的值.
$command = $command + "if ( `floatField -q -exists strideDistanceUI` ) " +
                      "floatField -e -value 0.65 strideDistanceUI;";

// 创建一个场景打开时运行的 scriptNode 
scriptNode -scriptType 2 -beforeScript $command -name "_sceneConfig";

Blind Data

你还可以使用 blind data 来把自定义数据直接保存到polygon components上, 或者任意 DAG 物体上.

这样做的好处是就算你的geometry被导入或是reference了,你的自定义数据依然跟着走,不会被当前场景中已有的自定义数据干扰.

但是使用 blind data 更复杂, 添加 blind data 的命令比加一个简单属性复杂多了,而且你还得给artist做一个 custom UI ,这样他们才能自己控制,blind data 和历史(construction history)有关, 这意味着你的 dependency graph 会变得更复杂. blind data 的查询有可能很慢 (尤其是对于 selection 和 false colouring mechanism).

Warning! 因为 blind data 本质上还是把信息储存在 attributes 里,所以他有个局限性,无论你是存在 geometry 本身上,还是存在连接到物体上的 polyBlindData nodes 上. Maya的 scene optimizations 的原则之一是,如果当前值是默认值,那就不保存 attributes. 所以, 如果你存 blind data 的时候是默认值, Maya 不会保存这个值. 所以你得记住定义 blind data 的默认值的时候,确保他们肯定 和你将要保存的场景文件里的值不同.

此外: Maya自带的 Blind Data Editor 不是特意专门设计来给你编辑 blind data用的. 他只是给你提供一个例子,用来说明如何创建和修改 blind data – 可以说他只是一个文档的补充,. Alias 自己也说了这个 editor 的功能比较”粗糙” (只是个客套话而已) 对他的功能提升并没有在他们的工作日程表上. blind data 的话题在 Alias’ developer classes比较热门, 因为很多人对Maya自带的这个功能不太明白怎么用.

13 Jul 2004

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: