文件引用提示
 
 
 

使用文件引用可以管理复杂的场景层次。若要从文件引用获得最大益处,请使用下列提示以确保更高效的工作流。同样,对名称空间的基本了解将有助于工作流。有关详细信息,请参见名称空间

文件引用的文件和节点命名

为父场景和被引用文件预先规划文件和节点命名约定是很重要的,并将极大地有助于在生产环境中成功实现文件引用。特别是规划确保:

文件引用的文件格式

使用文件引用时,以 Maya ascii 文件格式 (.ma) 保存文件是首选的。可以在喜爱的文本编辑器中打开和编辑 Maya ascii 文件,而且如果文件或文件的某些组件未按预期加载,这些 Maya ascii 文件更易于进行疑难解答。

注意

建议在使用文件引用时,不要引用其他文件格式(例如 dxf、obj、wire 等)的文件。如果可能,请通过加载文件并以 .ma 格式重新保存,将文件转化为自身 Maya 格式。

文件引用的文件路径

文件引用仅支持绝对路径和包含环境变量的路径。使用文件引用时,不支持相对路径名称。由于环境变量是显式的并可针对每个用户的文件结构进行自定义,所以它可以用作相对路径的极好替代。

相对路径(不支持):

scenes/street.ma

绝对路径(支持):C:/projects/cityscene/scenes/street.ma

环境变量路径(支持):$myProject/scenes/street.ma

有关环境变量的详细信息,请参见使用 Maya.env 设定环境变量

有关详细信息,请参见在引用编辑器中编辑引用路径

文件层次集合

如果计划在生产环境中使用文件引用,请考虑团队的工作流实践(建模师、装配师、动画设计师、材质等)以及确定场景层次之前的项目总体要求。

通常,应以自下而上的方式引用文件(即,将小型项目引用到较大的项目中)。使用该自下而上的结构可以轻松加载或卸载场景中用户不需要的任何分段。例如,在创建一个城市父场景时,应首先将门和其他相关组件引用到一个建筑物文件中。然后将该建筑物引用到街道文件中,然后再将街道文件引用到城市父场景中。

构建角色时,请将模型引用到装备文件中。然后将装备文件引用到将设置角色的动画的环境中。这样可以确保将对装备的更改正确传播到可能使用该角色的所有环境文件。

数据过滤

将许多文件引用到一个场景中时,数据量可能会快速变得很复杂而难于管理。“大纲视图”(Outliner)“Hypergraph”概述编辑器具有过滤选项,使用这些选项可以限制显示的数据量。

使用“显示层”(Display Layer)编辑器可以按字母顺序对层进行排序,这将有助于组织。

导出文件引用

如果法线场景变得比最初预期的更为复杂,可以提取法线场景的分段作为被引用文件。通过使用“将当前选择导出为引用”(Export Selection as a Reference)命令,可以选择场景的特定组件,然后将这些组件导出为单独的被引用子场景文件。会自动引用导出的被引用子场景文件,并会将其加载到当前打开的场景中。不可能通过使用文件引用来使用“将当前选择导出为引用”(Export Selection as a Reference)命令。

以这种方式创建文件引用有一个很吸引人的好处:场景的每个区域都处于正确的世界空间位置,且在引用到父场景中时不需要重新定位。

实例化文件引用

通过进一步减少场景中的数据量,对象的实例化可用于帮助进行场景管理。例如,如果街道场景中充满路灯,那么可以引用一次路灯文件,然后剩余的路灯会进行实例化。如果未加载路灯文件,那么场景中的所有路灯将会由于它们与原始路灯文件的实例化关系而消失。

如果有一个引用文件并实例化了该文件内的一个对象,稍后移除了该引用文件,那么将在父场景中移除该对象的全部两个版本。变换节点将被留在该实例的父场景中后面的位置。如果父场景中的用户已将其他更改应用于该实例,该节点将保留。

如果父场景包含已实例化的对象,请不要重命名节点或者更改被引用文件中的层次。这样的更改将使实例消失;Maya 将查找一个不再存在的对象。Maya 的实例化是基于名称的。通过在引用文件中重命名对象,可以使原始对象离开,这样父场景就无法再找到它。

注意

代理将仅实例化活动的文件引用。如果已实例化文件引用并已切换代理,将不会显示实例。

文件引用定位器

需要在场景视图中通过其组节点移动文件引用时,文件引用定位器选项很有用。每当卸载引用时,定位器还充当引用的可视提示。仅当选中“分组”(Group)选项时,定位器选项在“引用选项”(Reference Options)窗口中才可用。定位器选项将被引用文件的内容在定位器下分组,用引用节点名称进行注释。通过在定位器上单击鼠标右键,然后从上下文相关菜单中选择,可以加载或卸载场景内的引用。

有关详细信息,请参见“文件 > 创建引用(File > Create Reference.)”。

编辑被引用文件

父场景文件可能会受到在该层次的被引用子场景文件级别所进行的编辑的负面影响。也就是说,如果在子场景文件级别更改了节点名称和连接,那么在父场景级别所进行的编辑可能会变得无法解析。有关其他负面影响的一些示例,请参见修改文件引用

移除不需要的引用节点编辑

可能存在需要从引用节点移除不需要的编辑的情形。例如,在父场景中工作时,已经从一个文件引用应用并移除动画。已完成动画,但现在要确保在最终版本中不应设置动画的属性上不存在任何不需要的 setAttr 编辑。

若要移除不需要的编辑,必须执行下列操作:

示例:移除特定类型的所有编辑

该示例显示了如何确定与引用到当前打开的场景中的文件相关联的引用节点的名称。

  1. 在场景视图中,从需要确定其引用节点名称的被引用文件中选择一个对象。
  2. “通道盒”(Channel Box)中,确定选定对象的对象名称。在该示例中,对象的名称是 world:planetPlanet 是对象的名称,而 world 是指定给它的名称空间。
  3. “命令行”(Command Line)中,键入以下字符串,以确定与该对象相关联的引用文件名称:
    reference -q -f world:planet
    

    Maya 会显示引用文件的目录路径和名称。在该示例中,引用文件名称是 world

  4. 接下来,键入以下字符串为父场景内的 world 引用文件确定引用节点名称:
    file -q -rfn world.ma
    

    Maya 会显示引用节点的名称,如下所示:

    worldRN
    

确定了引用节点的名称之后,必须立即卸载引用文件,以便移除引用编辑。

  1. 通过使用引用编辑器或通过键入以下字符串,卸载场景中的引用文件:
    file -unloadReference worldRN
    
  2. 查询引用节点上的所有 setAttr 编辑,以便了解已对引用进行了哪些修改。
    reference -editCommand “setAttr” -rfn worldRN -q
    
  3. 键入以下字符串从引用节点移除所有 setAttr 编辑。
    file -cleanReference worldRN -editCommand “setAttr”
    

    会从引用节点 worldRN 移除 setAttr 编辑。

  4. 通过使用引用编辑器或者键入以下字符串,可以重新加载引用文件:
    file -loadReference worldRN
    
    注意

    通过在其文件名上添加唯一的副本号,会将已在父场景中引用的文件的后续引用与首次引用区分开来。例如,随后每次引用名为 world.ma 的文件时,会将该文件在父场景中命名为 world.ma{1}、world.ma{2} 等等。

避免使用默认着色器

如果引用了一个文件,在该文件中改变了默认着色器 (lambert1),那么这些更改会被父文件的默认着色器所取代。若要避免该情况,请在子文件中创建一个新着色器并指定该着色器,而不是使用默认着色器。

共享着色器网络

如果在启用共享着色网络的情况下,将文件引用到当前场景中,则会将被引用场景中的着色网络与当前场景中的着色网络(包括任何引用的着色网络)合并到一起。需要在整个场景中使用相同的着色网络(包括引用)时,这样可避免创建重复的着色网络。

仅当着色网络相同时,才能共享着色网络。从着色组向上游移动时,仅当其中包含的所有节点都具有相同的名称和类型时,Maya 才会认为两个着色网络是相同的。

着色网络中的每个节点的名称和类型必须相同,才能共享该着色网络,而不会考虑每个节点中的实际值。因此,对于子场景中具有一个值(例如,蓝色)的节点和父场景中具有不同的值(例如,红色)的节点,只要其名称和类型相匹配,就会认为它们是相同的。

但是,某些着色网络无法进行共享。这些着色网格有:

如果其中任何项目显示在着色网络中,那么在启用共享着色网络的情况下引用文件时,将不会共享该网络。

也不会共享存在于着色网络下游的任何项目。仅会共享着色网络上游的那些项目。

注意

所有对共享的被引用节点的编辑都存储在一个公用的共享引用节点上。仅可以通过使用“移除引用”(Remove Reference)菜单项从“引用编辑器”(Reference Editor)删除共享引用。会为已共享的所有引用保留共享引用节点,且仅当已移除最后一个共享引用时,才会移除共享引用节点。

除非在共享之前,在每个要共享的着色网络上创建了相同的属性,否则添加到后续共享的着色网络的动态属性可能会丢失。

共享显示层

如果在启用共享显示层的情况下,将文件引用到当前场景中,则会将被引用场景中的显示层与当前场景中的显示层(包括任何引用的显示层)合并到一起。需要在整个场景中使用相同的显示层(包括引用)时,这样可避免创建重复的显示层。

Maya 使用显示层名称来确定如何将被引用显示层添加到当前场景中。如果父场景中已存在一个显示层名称,那么在引用指定给子场景中的一个名称相同的显示层的任何对象时,会将这些对象添加到原始父显示层中。

如果子场景包含一个在父场景中不存在的显示层,在引用子场景时,就会在父场景的“显示层”(Display Layer)编辑器中出现子场景中的显示层。如果随后从父场景中移除这些子场景,那么也会从“显示层”(Display Layer)编辑器中移除其关联的显示层。

会将共享显示层自动放置在默认名称空间中。

注意

所有对共享的被引用节点的编辑都存储在一个公用的共享引用节点上。仅可以通过使用“移除引用”(Remove Reference)菜单项从“引用编辑器”(Reference Editor)删除共享引用。会为已共享的所有引用保留共享引用节点,且仅当已移除最后一个共享引用时,才会移除共享引用节点。

未知引用节点

将包含引用的 Maya 6.5 版本之前的文件转化为更高版本的 Maya 文件时,可能会创建名为“_UNKNOWN_REF_NODE_”的引用节点,并且/或者可能会将某个特殊的“_UNKNOWN_REF_NODE_”条目添加到现有引用节点。

该节点类型用于存储 6.5 之前所做的任何编辑,直到能应用这些编辑为止。

已加载场景中的所有引用之后,应该立即应用所有编辑,并且 _UNKNOWN_REF_NODE_ 区域和节点应消失。如果存在任何无法应用的编辑(例如,已重命名或删除的原始引用文件中的节点),_UNKNOWN_REF_NODE_ 将保留在文件中。

如果需要移除这些引用节点,可以通过查询 _UNKNOWN_REF_NODE_ 并删除它来移除。也就是说,使用“引用编辑器”(Reference Editor)无法删除该特定节点类型。在“脚本编辑器”(Script Editor)中:

delete “_UNKNOWN_REF_NODE_”

文件引用优化和错误

默认情况下,如果引用了同一个文件两次,那么在文件打开时,Maya 将复制现有节点,而不是从磁盘中重新读取它们。有时,使用文件引用的内置多重引用优化功能可能会导致错误。MAYA_FORCE_REF_READ 环境变量会禁用文件引用优化,并会强制在任何情况下都显式读取引用文件。在某些情况下,这会修复 Maya 的行为,否则会对 Maya 的行为错误地进行求值。

有关详细信息,请参见常规变量

文件引用辅助对象脚本

会将许多文件引用辅助对象脚本作为“Maya Bonus Tools”的一部分进行提供。“Bonus Tools”是一些很有用的 Maya 脚本和插件的免费集合,可从 Autodesk 网站 (www.autodesk.com/maya-bonustools) 下载。

从 Autodesk 网站下载“Bonus Tools”

  1. 在 Maya 中,从“Web”中选择“帮助 > 下载 Bonus Tools(Help > Download Bonus Tools)”。

    可能需要注册才能获得访问 Autodesk 网站某些区域的权限。完成安装后,会立即在 Maya 内 Bonus Tools 自己的下拉菜单中显示“Bonus Tools”

名称空间的非法字符处理

先前,对于 Maya 2010 及更低版本,如果在节点名称或名称空间中遇到字符“<”和“>”,则会将其转化为“_”。会移除所有前导无效字符,并将所有其他字符转化为下划线。

例如,在 Maya 2009 中:

namespace -add "<foo>"
// Result: foo_
createNode transform -n "<bar>"
// Result: bar_
namespace -add "foo<bar>"
//Result: foo_bar_

对于 Maya 2011 及更高版本,仍会移除节点名称中的字符“<”和“>”,并会将其转化为“_”。但是对于名称空间的名称,Maya 会将这些字符之间的所有内容视为占位符名称空间。因此,如果正在使用这些字符并依靠 Maya 去更正它们,则应更新代码。例如,在 Maya 2012 中:

namespace -add "<foo>"
// Result: <foo>
createNode transform -n "<bar>"
// Result: bar_
namespace -add "foo<bar>"
//Result: foo_bar_

文件引用和渲染层

在包含渲染层的场景中使用文件引用时,请确保在导入文件引用并保存场景文件时,当前层是 masterLayer。如果选定层是 masterLayer,那么渲染层以及文件引用和保存会更加稳定。

相关主题