1

我一直在尝试在 Maya 中使用实例化几何体,但不了解创建简单场景所产生的节点关联:

import maya.cmds as cmds

polyCubeTemplate = cmds.polyCube(n="polyCubeTemplate", w=0.1, h=0.4, d=0.4)
cmds.setAttr("polyCubeTemplate.visibility", 0)

cube = cmds.instance(polyCubeTemplate[0], n="pCube0")
cmds.move(-0.75, -1.5, 7.0, "pCube0")
cmds.setAttr("pCube0.visibility", 1)
cubeSG = cmds.sets(n="set0", renderable=True, noSurfaceShader=True, empty=True)
cubeShader = cmds.shadingNode("mia_material_x_passes", asShader=True, n="mia_material_x_passes0")
cmds.setAttr(cubeShader+".diffuse",0.003921569,0.003921569,0.0, type="double3")
cmds.connectAttr(cubeShader+".message",cubeSG+".miPhotonShader")
cmds.connectAttr(cubeShader+".message",cubeSG+".miShadowShader")
cmds.connectAttr(cubeShader+".message",cubeSG+".miMaterialShader")
cmds.sets(cube[0], edit=True, forceElement=cubeSG)

cube = cmds.instance(polyCubeTemplate[0], n="pCube1")
cmds.move(-0.75, -1.0, 7.0, "pCube1")
cmds.setAttr("pCube1.visibility", 1)
cubeSG = cmds.sets(n="set1", renderable=True, noSurfaceShader=True, empty=True)
cubeShader = cmds.shadingNode("mia_material_x_passes", asShader=True, n="mia_material_x_passes1")
cmds.setAttr(cubeShader+".diffuse",0.011764706,0.011764706,0.0, type="double3")
cmds.connectAttr(cubeShader+".message",cubeSG+".miPhotonShader")
cmds.connectAttr(cubeShader+".message",cubeSG+".miShadowShader")
cmds.connectAttr(cubeShader+".message",cubeSG+".miMaterialShader")
cmds.sets(cube[0], edit=True, forceElement=cubeSG)

在场景中选择pCube0时,属性编辑器会显示以下节点列表:

  • 变换节点pCube0
  • 形状/网格节点polyCubeTemplateShape
  • 对象节点polyCube1
  • 默认着色组节点initialShadingGroup
  • 默认材质节点Lambert1
  • mental ray 材质节点mia_material_x_passes0
  • mental ray 材质节点mia_material_x_passes1
  • 形状/网格节点polyCubeTemplateShape的重复(?)

在此处输入图像描述

以上的非实例化版本是

import maya.cmds as cmds

cube = cmds.polyCube(n="pCube0", w=0.1, h=0.4, d=0.4)
cmds.setAttr(cube[0]+".translateX",-0.75)
cmds.setAttr(cube[0]+".translateY",-1.5)
cmds.setAttr(cube[0]+".translateZ",7.0)
cubeSG = cmds.sets(n="set0", renderable=True, noSurfaceShader=True, empty=True)
cubeShader = cmds.shadingNode("mia_material_x_passes", asShader=True, n="mia_material_x_passes0")
cmds.setAttr(cubeShader+".diffuse",0.003921569,0.003921569,0.0, type="double3")
cmds.connectAttr(cubeShader+".message",cubeSG+".miPhotonShader")
cmds.connectAttr(cubeShader+".message",cubeSG+".miShadowShader")
cmds.connectAttr(cubeShader+".message",cubeSG+".miMaterialShader")
cmds.sets(cube[0], edit=True, forceElement=cubeSG)

cube = cmds.polyCube(n="pCube1", w=0.1, h=0.4, d=0.4)
cmds.setAttr(cube[0]+".translateX",-0.75)
cmds.setAttr(cube[0]+".translateY",-1.0)
cmds.setAttr(cube[0]+".translateZ",7.0)
cubeSG = cmds.sets(n="set1", renderable=True, noSurfaceShader=True, empty=True)
cubeShader = cmds.shadingNode("mia_material_x_passes", asShader=True, n="mia_material_x_passes1")
cmds.setAttr(cubeShader+".diffuse",0.011764706,0.011764706,0.0, type="double3")
cmds.connectAttr(cubeShader+".message",cubeSG+".miPhotonShader")
cmds.connectAttr(cubeShader+".message",cubeSG+".miShadowShader")
cmds.connectAttr(cubeShader+".message",cubeSG+".miMaterialShader")
cmds.sets(cube[0], edit=True, forceElement=cubeSG)

在这个场景中选择pCube0会产生节点列表

  • 变换节点pCube0
  • 形状/网格节点polyCube0Shape
  • 对象节点polyCube1
  • mental ray 材质节点mia_material_x_passes0

这是我希望在实例场景中看到的那种结构。

所以我有三个问题:

  1. 对于实例化场景,为什么pCube0 “拾取”了pCube1的材质节点 ( mia_material_x_passes1 ) 的副本?(这些 mental ray 材质节点是否以某种方式插入到共享父/模板 polyCube 中?)
  2. 什么解释了形状/网格节点polyCubeTemplateShape的重复存在?
  3. 如何正确实例化以避免这种混乱的节点结构?
4

1 回答 1

1

Maya 中的实例化是通过将同一形状节点作为多个变换的父级来实现的:这就是您看到副本的原因。材料分配由形状上的连接处理.instObjectGroups,它将几何的子集指向不同的shadingEngine节点(超图中的“SG”节点)。然而,shadingEngine 只是一个集合,它有一个专门的着色​​器集合(材质 UI 或属性编辑器中的着色器球)。实际的“着色器”有很多属性,具体取决于着色器类型及其设置。在您的情况下,似乎有两个不同的着色器,每个实例一个,具有不同的颜色。

我看起来像原始场景包括一个不可见的对象副本作为模板,然后有两个可见的实例。当人们想要一种方便的方法来编辑几何的“主”副本时,这种情况并不少见,该副本在许多不同的地方以不同的大小和方向复制。编辑实际的模板形状——比如抓取和移动一个顶点——将同时更新所有的副本。

这完全是香草玛雅。这是当您拖钓文件时实例化场景的外观

于 2015-05-18T02:46:08.177 回答