我一直在尝试在 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
这是我希望在实例场景中看到的那种结构。
所以我有三个问题:
- 对于实例化场景,为什么pCube0 “拾取”了pCube1的材质节点 ( mia_material_x_passes1 ) 的副本?(这些 mental ray 材质节点是否以某种方式插入到共享父/模板 polyCube 中?)
- 什么解释了形状/网格节点polyCubeTemplateShape的重复存在?
- 如何正确实例化以避免这种混乱的节点结构?