mayaのいつからか忘れましたが、smoothのsubdivisionMethodが導入され
これもまた環境によって変わってしまう面倒なやつ。
環境ごとに違うと何が問題か?
meshノードのsmoothMesh項目にsubdivisionMethod というのがあり、
useGlobal = True がデフォルトになっている。
useGlobal つまり環境設定に準ずるということ。
これが揃っていないとsmoothMesh使用時にメッシュの形状・UVなどに差異が生まれてきてしまう。
どこで設定しているか?
先述の通りprefrenceで設定してるのだけれども、どうやって設定しているのかがわからない。
ひとまず preferenceを更新しつつ、更新前・後のuserPref.melを比較してみる。
newPolyDefaultSmoothDrawType
optionVarにてこの値が変動している。
newPolyDefaultSmoothDrawType 0 の状態だったので
試しに optionVar で変えてみる
cmds.optionVar(intValue = ["newPolyDefaultSmoothDrawType",1])
変わらない。ので、savePrefs もしてみる
cmds.optionVar(intValue = ["newPolyDefaultSmoothDrawType",1])
cmds.savePrefs(general =True)
すると savePref後に newPolyDefaultSmoothDrawTypeを問い合わせると元に戻ってしまっていた。
というわけで、mayaのどこかに別途設定を格納してるはず。
global 変数?
global 変数に格納してるのではないかと仮定。
melで global変数名とその値を呼び出す。
これも preferenceの更新前・後で比較してみる・
{
string $globalList[] = `env`;
for($globalName in $globalList)
{
print("\n" + $globalName + "\n");
eval("print " + $globalName + ";\n");
}
}
残念ながらそれらしい変数と変化は見られず。
AETemplateから探ってみる
UI上に文字として出てるのだから、何かしら取得してるはず。
なので、AETemplateを探ってみる。
該当のAETemplate.mel
C:\Program Files\Autodesk\Maya2019\scripts\AETemplates\AEmeshTemplate.mel
なかみを拝見・・・発見。
global proc int GetSmoothDrawType(string $nodeName)
{
int $subdivisionVal = 0; // MayaCC
int $useGlobal = `getAttr ($nodeName + ".useGlobalSmoothDrawType")`;
if ($useGlobal == 1)
{
int $polyOpts[] = `polyOptions -q -smoothDrawType`;
if ($polyOpts[0] == 1)
$subdivisionVal = 2; // Osd-Uniform
else if ($polyOpts[0] == 2)
$subdivisionVal = 3; // Osd-Adaptive
}
else
{
$subdivisionVal = `getAttr ($nodeName + ".smoothDrawType")`;
}
return $subdivisionVal;
}
このコマンドで確認できるらしい。
polyOptions -q -smoothDrawType
smoothDrawType(sdt)
この設定は、newPolymesh フラグを使用する場合のみ機能します。ポリゴンメッシュ オブジェクト上の smoothDrawType アトリビュートの新しい既定のアトリビュート値を設定します。オプションは、0: Catmull-Clark 1: リニア 2: OpenSubdiv Catmull-Clark 均一 3: OpenSubdiv Catmull-Clark 適応です。
とのこと。
早速やってみる。
cmds.polyOptions(newPolymesh =True,smoothDrawType = 0)
cmds.savePrefs(general =True)
cmds.polyOptions(newPolymesh =True,smoothDrawType = 1)
cmds.savePrefs(general =True)
できた!
追記:
0: Catmull-Clark
1: リニア
2: OpenSubdiv Catmull-Clark 均一
3: OpenSubdiv Catmull-Clark
とかいてあるが、手元の環境だと
0: Catmull-Clark
1: OpenSubdiv Catmull-Clark 均一
2: OpenSubdiv Catmull-Clark
となっている。
AEの方が変わらない
が、こっちの表記が変わらない。
cmds.polyOptions(smoothDrawType = 1)
これを別途実行すると表記は変更されるが、処理内容は反映されていないように見える。
シーンを一旦保存して開きなおすと、ちゃんと反映されていた。
まとめ
反映されるタイミングがちょっと厄介なので、userSetup.pyで
cmds.polyOptions(newPolymesh =True,smoothDrawType = 1)
cmds.polyOptions(smoothDrawType = 1)
cmds.savePrefs(general =True)
を仕込んでおいた方が安全だと思われる。
かつ、preferenceの該当部分は変更禁止。
※別途詳細確認中だが、useGlobalのチェックを外した時に 特定の条件下でmethodのsetAttr内容が消失する現象もあり。