1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MayaAdvent Calendar 2024

Day 15

UVを切り替えたい

Last updated at Posted at 2024-12-14

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)

こんなデータを作って実行してみます。
image.png

お、UV切り替わりました。
image.png

一気にUVの切り替えをできるようになりました。

現行ですとテクスチャー名を指定してますが、
シェーダー名からアサインされてるオブジェクトに対して実行する
など もう少し使い勝手を良くできる気はします。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?