mayaでマルチUVチャンネルを持つメッシュにて、
マテリアルごとにUVを変えて使用したい場面がありまして。
通常であれば、
rerationShipEditorからポチポチやるのかなと思うのですが
メッシュが大量にあると日が傾いてしまうので一気にやりたくなりました。
調査
とりあえずそれっぽいコマンドが無いかを探してみるとー
これっぽいですね。
import maya.cmds as cmds
cmds.uvLink(uvSet='pCylinderShape2.uvSet[3].uvSetName', texture='checker4' )
uvSetのオプションには UVSetの名前をstringで渡す感じかとおもったら、これアトリビュートですね。
対象のUVsetのuvSetNameアトリビュートをstringで与えるんですね。
となると、 接続したいuvSetNameがどのindex(uvSet)にあるかを確認しないとなりませんね。
ひとまずUVSetのindex総当たりで検索かけるとこんな感じでしょうかね。
多分API経由だともっと賢く取れると思います。
def findUVsetIDfromName(mesh,uvSetName):
uvIndex = cmds.getAttr(mesh + ".uvSet", mi =True)
if uvIndex == None:
print(mesh + " donot have any UVsets-----")
return None
else:
for index in uvIndex:
uvSetName = cmds.getAttr(mesh + ".uvSet["+str(index)+"].uvSetName")
if setUVsetName != uvSetName:
continue
else:
return index
return None
とりあえず実装
import maya.cmds as cmds
def findUVsetIDfromName(mesh,uvSetName):
uvIndex = cmds.getAttr(mesh + ".uvSet", mi =True)
if uvIndex == None:
print(mesh + " donot have any UVsets-----")
return None
else:
for index in uvIndex:
uvSetName = cmds.getAttr(mesh + ".uvSet["+str(index)+"].uvSetName")
if setUVsetName != uvSetName:
continue
else:
return index
return None
def setUVset(targets,targetTextureName,uvSetName):
for mesh in targets:
uvIndex = findUVsetIDfromName(mesh,uvSetName)
if uvIndex == None:
continue
cmds.uvLink(texture= targetTextureName,uvSet=mesh + ".uvSet["+str(uvIndex)+"].uvSetName")
targets = ["pSphere1","pSphere2","pSphere3"]
targetTextureName = "ramp1"
setUVsetName = "uvSet"
setUVset(targets,targetTextureName,setUVsetName)
一気にUVの切り替えをできるようになりました。
現行ですとテクスチャー名を指定してますが、
シェーダー名からアサインされてるオブジェクトに対して実行する
など もう少し使い勝手を良くできる気はします。