Maya + V-Ray Material Variations

ひとつのマテリアルからカスタムアトリビュートに応じてバリエーションを作成する方法です。オブジェクト毎に不透明度のアニメーションをつける場合、Mayaではその数だけマテリアルの複製が必要ですが、VrayUserScalarを使用することで複製をすることなしに実現することができます。

残念ながらビューポートでの確認ができませんけどね。

VrayUserScalarノードを扱う場合は、オブジェクトへカスタムアトリビュート「vrayUserScalar_アトリビュート名」をデータタイプをfloatとして追加します。 VrayUserScalarノード の「User Scalar Attribute」へ「アトリビュート名(vrayUserScalar_はいらない)」を入力します。

VaryUserColorノードの場合はカスタムアトリビュート「vrayUserColor_アトリビュート名」、データタイプはVectorです。Colorとしたいところですがアトリビュート追加ダイアログではできないみたいです。下のスクリプトではカラーピッカー付きのアトリビュートを追加できます。

選択したオブジェクトへ一括でカスタムアトリビュートを付加するMelは以下に置いときます。UIは無しです、$attrNameを適宜書き換えてください、「value」と書くと、「vRayUserScalar(もしくはColor)_value」と言うアトリビュートが追加されます。

参考: User Attributes[docs.chaosgroup.com]


VRayAddOpenSubdivAttrGrp更新

Maya V-Ray:OpenSubdiv一括適用スクリプト」がMaya2017 Update5で起動しない不具合のお知らせをいただいておりましたので、対処してアップロードしました。合わせてMaya2018へも対応しております。

古いバージョンはMaya2017 Update2までの動作確認でして、原因はPythonクラス「maya.app.general.mayaMixin.MayaQWidgetBaseMixin」に動作の変更があったためでした。ファイルでいうと「”C:\Program Files\Autodesk\Maya2018\Python\Lib\site-packages\maya\app\general\mayaMixin.py”」です。

古いMayaQWidgetBaseMixin(少なくとも2017 Update2まで)はそれを継承したダイアログを作成した場合、ダイアログをインスタンス化(初期化)した時点でMayaのメインウィンドウの子になっていたのに対して、新しいものはshow()メソッドを呼ばない限り、メインウィンドウへの子となりません。

ダイアログの初期化時にすでに開かれているインスタンスをメインウィンドウに問い合わせて閉じるようにしていますが、初期化時にはメインウィンドウへの参照が無い状態となってエラーが出ていました。

マイナーアップデートでAPIの変更は勘弁してもらいたいですね。


Maya V-Ray:OpenSubdiv一括適用スクリプト公開中

こちらでは無く会社のホームページへアップロードしました。 VRayAddOpenSubdivAttrGrp[canplaize.com]

モデルデータはスタッフからの借り物

表題の通り一括で適用です。任意のアトリビュートのみを一括修正することも可能です。プレビュー用のスムースメッシュも自動で適用されます。

Mayaは一括修正が面倒ですねえ、Attribute Spread SheetかChannel Boxがその役割なのですがこの件を例にとるとシェイプノードを選択する必要がありますね。他にもスライダーやカラーピッカーが使えなかったりと操作に難ありです。選択したノードの共通アトリビュートとその型に応じたUIを自動生成なんてことができると便利なのですが、残念ながら技術不足!かといって○○を一括操作する為のスクリプトをやたら作るのは非効率すぎます。

選択したノードのAETemplateを引っ張ってこればなんとかなるか?


V-Ray Physical Camera’s Fov

Focal lengthで画角を指定したV-Ray Physical Cameraからfovを取得するテストスクリプト。

VRayCameraFOV

Mayaのカメラなら以下のようにfilmWidthとfocalLengthから計算できますが、MaxのV-Ray Cameraでは被写体までの距離が必要です。

def angleOfView(filmWidth,focalLength):
    angle = 2 * math.atan(float(filmWidth) / (2*float(focalLength)))
    angle = math.degrees(angle)
    return angle

Angle of viewの「Derivation of the angle-of-view formula」が参考になります。

import MaxPlus
import math
 
def angleOfView(filmWidth,focalLength):
    angle = 2 * math.atan(float(filmWidth) / (2*float(focalLength)))
    angle = math.degrees(angle)
    return angle
 
def angleOfViewVrayCamera(filmWidth,focalLength,distance):
	focalLengthWithMagFactor = distance * focalLength / (distance - focalLength)
	angle = angleOfView(filmWidth,focalLengthWithMagFactor)
	return angle
 
def getVRayCameraFocusDistance(node):
	objPBlock = node.Object.ParameterBlock
	distance = 0.0
	if objPBlock.targeted.Value and (not objPBlock.specify_focus.Value):
		targetNode = node.GetTarget()
		vec = targetNode.GetWorldPosition() - node.GetWorldPosition()
		distance = vec.GetLength()
	elif (not objPBlock.targeted.Value) and (not objPBlock.specify_focus.Value):
		distance = objPBlock.target_distance.Value
	elif (not objPBlock.targeted.Value) and objPBlock.specify_focus.Value:
		distance = objPBlock.focus_distance.Value
	return distance
 
def getVRayCameraFOV(node):
	objPBlock = node.Object.ParameterBlock
	fov = 0.0
	if objPBlock.specify_fov.Value == True:
		fov = objPBlock.fov.Value
	else:
		fov = angleOfViewVrayCamera(
			objPBlock.film_width.Value,
			objPBlock.focal_length.Value,
			getVRayCameraFocusDistance(node))
	return fov
	
if __name__ == '__main__':
	if MaxPlus.SelectionManager.GetCount() != 0:
		selNode = MaxPlus.SelectionManager.GetNode(0)
		if selNode.Object.GetClassName() == 'VRayPhysicalCamera':
			print getVRayCameraFOV(selNode)
		else:
			print "Selection is not V-Ray Camera."
	else:
		print "Select V-Ray Camera."

はじめてPythonAPIを使ってみました、Maxの中にPythonエディタが搭載されてるわけでは無いんですね。APIリファレンスの情報量も少ないなー。


htVRMapMerge ver.1.1

イラディアンスマップのマージ。バージョン少しアップです。機能は変わらずで実行に必要な各ファイルが入力されていない時の対処だけです。

ダウンロード:htVRMapMerge11

動作確認はmax9ですからねっ!

あまり使いどころはありませんが、複数選択できるファイルダイアログを.Net オブジェクトで対処してます。スクリプト作成の参考にはなるかも。

使い方。

「#maxroot/ui/macroscript」へコピーし起動したら「ユーザインターフェースのカスタマイズ」です。「CANPLAIZE」カテゴリにあります。

0.) imapviewer.exeのパスを指定(初回のみ)
1.) マージしたい.vrmapをリストに追加(選択ダイアログではCtrlやShiftで複数選択可能です。)
2.) 出力ファイル名を指定

で「Merge」ボタンです。

初期設定を「htVRMapMerge.ini」というファイルへ保存します。場所はユーザ毎のプラグイン設定ディレクトリになります。場所はどこかと言うと、スクリプトリスナーから、

getdir #plugcfg

を実行すると判ります。