Python導入したい
よくMayaでは「Python使え使え便利だよ」って言われますが
Mayaのオペレーションの履歴(スクリプトエディタに表示されるあれ)ってMEL固定ですよね。
なので導入始めの方は、どうしてもMELから変換でてこずることがあります。
そこで、変換のルールを簡単に解説しようかと思います。
続きを読む
#単位行列を生成
ident_mat = om.MMatrix()
#nodeの行列を取得する
import maya.api.OpenMaya as om
node_mat = om.MMatrix(cmds.getAttr(node+".matrix"))
#nodeを含めたワールド行列をもとめる
node_wmat = om.MMatrix(cmds.getAttr(node+".worldMatrix"))
#nodeの逆行列を求める
node_inv_mat = node_mat.inverse()
#行列演算を行う
cul_mat = ident_mat *node_mat
#subprocess.check_outputを使用する
import subprocess
続きを読む
最近は誰でもシェーダーが書ける時代になりました。処理を軽くするためのルールがあるようなのでそのいくつかをメモしておきます。(今後も増える予定です。)ピクセルシェーダー(フラグメントシェーダー)は1ピクセル毎に処理されるため、ちょっとの不手際で、爆発的に処理が重くなります。単純計算ですが、1920x1080の解像度の場合、1フレーム毎に2,073,600回、処理が走ることになります。1フレーム毎に1回実行されるUnity C#のupdate関数の比ではないです。
というわけでメモ。
If文は重い。というわけで以下を使います。
lerp(x, y, s)
xにはsが0の時に欲しい数値またはベクトル
yにはsが1の時に欲しい数値またはベクトル
sには1か0を入れます。
これによって、あたかもIF文かのような挙動を実現できます。
続きを読む
前回の続きです。
今回は頂点シェーダー部分とフラグメントシェーダー(ピクセルシェーダー)部分を3dsMaxへ移植するメモです。
Unity
UnityObjectToClipPos(v.vertex)
mul(UNITY_MATRIX_MVP, float4(v.vertex, 1.0))
上記二つは同じ意味で、頂点座標をカメラクリップ座標系(モデル座標系→ビュー座標系→プロジェクション座標系)へ変換します。これは以下で実装できます。
HLSL
float4x4 mvpMatrix : WorldViewProj; // Model*View*Projection 一番上で宣言
o.pos = mul(v.vertex, mvpMatrix);
続きを読む
「ROP Alembic Output」ノードを使用します。
Vallid Frame Range で、書き出す範囲を指定して、Alembic Name でパスを指定、Render To DiskでAlembicファイルを書き出すことができます。
なお、ファイルフォーマットは汎用的なHDF5フォーマットと、Alembicに最適化されたOgawaから選べます。Ogawaの方が5~15%軽く、4倍から25倍速いとか書いてありました。
デフォルトで1ファイルで書き出されますが、ファイル名に$F4などと付けると連番ファイルとして書き出すこともできます。(無駄が多いので意味はありません。)基本的に3dsMaxなどのソフトに渡すときは1ファイルじゃないと読めないので注意。
なお、パーティクルや流体モデルなどトポロジが動的に変わるものでも書きだせるのでレンダリングのみ別のソフトへ持っていきたいときなどに、非常に重宝します。
「Mirror」ノードを使います。
続きを読む
さて。前回得た情報を元にUnityのシェーダーを3dsMaxへ移植していきます。
それぞれ移植するための対応表をメモしておきます。
プロパティをGUIに表示する対応表は以下の通りです。
//Texture2D
_BaseMap ("BaseMap", 2D) = "white" {}
//float
_Farthest_Distance ("Farthest_Distance", Float ) = 10
//float(スピナー制限付きfloat)
_HighColor_Power ("Tweak_MaskLevel", Range(0, 1)) = 0
//float4(colorなど)
_BaseColor ("BaseColor", Color) = (1,1,1,1)
//bool(トグル系)
[MaterialToggle] _Is_Base ("Is_Base", Float ) = 0