mayaの環境設定　~subdivisionMethod~

mayaのいつからか忘れましたが、smoothのsubdivisionMethodが導入され
これもまた環境によって変わってしまう面倒なやつ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/10e045a6-a1eb-0e9d-cbf0-5a52c42aaec5.png)

環境ごとに違うと何が問題か？
-
meshノードのsmoothMesh項目にsubdivisionMethod というのがあり、
useGlobal = True　がデフォルトになっている。
useGlobal　つまり環境設定に準ずるということ。
これが揃っていないとsmoothMesh使用時にメッシュの形状・UVなどに差異が生まれてきてしまう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/78529c4e-2eed-284f-8a94-0a536d83ca91.png)

どこで設定しているか？
-
先述の通り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を探ってみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/f5b8d266-12ad-84ab-51db-eb04187c2148.png)

該当の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

https://help.autodesk.com/cloudhelp/2019/JPN/Maya-Tech-Docs/CommandsPython/polyOptions.html

**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)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/4402c0a3-0d4c-4094-be97-e1c109708f7c.png)

    cmds.polyOptions(newPolymesh =True,smoothDrawType = 1)
    cmds.savePrefs(general =True)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/2519daa6-a922-5296-45e3-8e3df50fc254.png)

できた！

**追記：**
0: Catmull-Clark 
1: リニア 
2: OpenSubdiv Catmull-Clark 均一 
3: OpenSubdiv Catmull-Clark

とかいてあるが、手元の環境だと
0: Catmull-Clark 
1: OpenSubdiv Catmull-Clark 均一 
2: OpenSubdiv Catmull-Clark

となっている。


AEの方が変わらない
-
が、こっちの表記が変わらない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/99ed0db9-60ed-0dc6-cf8d-e475b65e4c16.png)

    cmds.polyOptions(smoothDrawType = 1)

これを別途実行すると表記は変更されるが、処理内容は反映されていないように見える。
シーンを一旦保存して開きなおすと、ちゃんと反映されていた。

まとめ
-
反映されるタイミングがちょっと厄介なので、userSetup.pyで

    cmds.polyOptions(newPolymesh =True,smoothDrawType = 1)
    cmds.polyOptions(smoothDrawType = 1)
    cmds.savePrefs(general =True)

を仕込んでおいた方が安全だと思われる。
かつ、preferenceの該当部分は変更禁止。

※別途詳細確認中だが、useGlobalのチェックを外した時に　特定の条件下でmethodのsetAttr内容が消失する現象もあり。