2015年1月1日木曜日

スタート


仕事の覚え書きなど更新していきます。

あくまで本人用のメモです。間違った情報が混ざっている可能性がありますのでご注意下さい(出来るだけ気を付けておりますが・・)。
また当ブログで紹介しているエクスプレッション、スクリプトの実行によるいかなるトラブルについて作者は一切責任を負えませんので、全て使用者の自己責任でお願いいたします。

2013年3月19日火曜日

MAYA color management

今までレンダーセッティングのカラーマネージメントを誤解していたので、メモ。。

Color Management にある default input profile と default output profile 。
インプットとアウトプットの関係を正しく指定するもの(?)
じゃあ例えば、インプットが sRGB で アウトプットも sRGBなら何も変化はないのでは?と思っていたのが大間違い。。

色々検証してみました。


●デフォルトというか、何も考えずにただただレンダリングをしている状態


床:    拡散反射0.8のランバートに内部テクスチャ(checker)
色見本: 拡散反射0.8のランバートに外部テクスチャ
ドーナッツ:青のblinn


●ここでEnable Color Management をチェック
 どちらもsRGBですが、画像にガンマ補正がかかり明るくく出力されます。
 テクスチャはインプットでsRGBと判断されているので、逆補正がかかっており、色味を保持してい ます。 マテリアルの拡散反射率は床と同じ設定にしているので、その違いが良くわかりますね。




● とはいえlinnerで作成しているテクスチャまでsRGBだと認識されてしまうとテクスチャが暗くレンダリングされてしまいます。




 ●その場合はインプットをsRGBからlinnerに設定して、テクスチャなどインプットファイルはlinnerですよ~とMAYAに指定します。




●テクスチャが、sRGBとllinne両方が混在している場合は、テクスチャアトリビュートで個々に指定できます。
この場合は基本sRGBでlinnerなテクスチャだけアトリビュートで指定しています。





●レンダリング後、リニアワークフローで合成したい場合などは、アウトプットをlinnerにして
、32bitでレンダリングしましょう。



んん、この解釈で間違っていないのかどうだか・・

2012年12月5日水曜日

MAYA トリッキーなShadingSwitch の使い方




図のようなシチュエーションから、pSphereがpPlane1に落とす影は現状のままクッキリとしてていいが、pPlane1がpPlane2に落とす影だけは柔らかく調整したい!といったケース。
いや、めったにない特殊なケースだという事は分かってますが・・・、同僚から相談されちゃいましたので考えてみました。

ちなみにライトを2種類作ってライトリンクでうんぬん・・とか、パスを分けてうんぬん・・・という以外で!という条件つき。めんどくさがりめっ。


まず、おもむろに出してみたのはShadingSwitchノード



このノードは、複数のオブジェクトで同じマテリアルを共用し、かつそれぞれに違ったテクスチャを割り当てたり出来る優れものです。

このノードにpPlaneのシェイプをつないでアレコレしてから、outputをディレクショナルライトのLight Angleへとつないでみます。

結果からいうと





出来た!
逆ももちろん この通り!





ではコネクト方法。

アトリビュート内容は下図の通りす。
こいつの In Shape に pPlane 2枚を追加したいわけですが、pPlaneを選んでAddSurfaceを押してみてもいっこうに追加されません。
このボタンを使う方法もあるのですが時間がかかるので、今回はコネクションエディター or ノードエディターで直接つないじゃいます。


pPlane(シェイプ) の instObjGroup[0] → singleShadingSwitch  input[#].inShape

プレーン2枚ともつなぎます。
でたでた。



つぎに、ディレクショナルライトのLight Angleに代入したい数字をそれぞれのIn Single に入れたいわけですが、これも直接入力できません。。
かわりに単色のrampを2つ作ってそれぞれをコネクションエディターでつなぎます。

ramp#.outColorR → singleShadingSwitch.input[#].inSingle

あとはrampの色でボケ具合を調整できます。

下の画像では分かりませんが、ramp1 = 0  ranmp2 = 30 の色を持たせています。
ですので pPlane2 にのみ LightAngle 30 のやわらかい影が落ちます。




ちなみにデプスマップシャドーのフィルターにコネクトしても同じような結果が得られますが、mental ray では動作しませんでした。。。(レイトレシャドーは mental ray でも動作確認済みデス)

2012年8月14日火曜日

パーティクルインスタンサー オブジェクトの法線を拾う

「パーティクルがサーフェイスに沿う」表現はGOALで実現できますが、そのパーティクルをインスタンスで任意のオブジェクトにして、「表面を這う」なんていう表現は・・・


needParent UV を ON の状態でパーティクルエミッタ(emit from surface)を作成。
パーティクルとサーフェイスでgoalを設定。

perParticleAttributeにparentU parentVを追加し、パーティクルエクスプレッションに下記の通り書き込みます。

goalU = parentU
goalV = parentV

これで、パーティクルはサーフェイス上での個々が発生した場所に留まります。

ここでパーティクルにオブジェクトをインスタンスしてみます。
インスタンスの回転は0の状態ですが、それぞれがサーフェイスのノーマルに従って回転した状態で配置されるようにしてみます。

パーティクルのアトリビュートエディターの「Goal Weights and Objects」セクッションにて、「Create Goal World Normal 0 PP」ボタンを押すと法線情報を持ったアトリビュートが出来ます。
注 このボタンはgoalの設定をしていないと表示されません。
instancer の Aim Direction を出来たアトリビュートに設定。
 
とりあえずノーマルに沿って配置されたはず!

ですが、サーフェイスのノーマルとオリジナルオブジェクトの+X軸が揃った状態になっているので、思ってたのと違う!となる場合が多いでしょう。
そんな時は、追加でUserVectorPPなどのperParticleAttributeを作り、オフセット処理をしましょう。ついでにランダムな感じを足したい時はノイズなども同時に計算しちゃいましょう。
注 その計算はruntime after dynamicsでしないと、おかしくなる時があるそうです

インスタンスされるオブジェクトの+X方向がサーデイスのノーマル方向に向きます。

2012年6月28日木曜日

ランダム ストリーム

再現性のある乱数処理の方法

まずは例、

//seed宣言
seed 2;
rand 0 5;
// Result: 2.064494 //
rand 0 5;
// Result: 1.76712 //
rand 0 5;
// Result: 2.612228 //
rand 0 5;
// Result: 0.615584 // 
//seed宣言し直し
seed 2;
rand 0 5;
// Result: 2.064494 //
rand 0 5;
// Result: 1.76712 //
rand 0 5;
// Result: 2.612228 //
rand 0 5;
// Result: 0.615584 // 


rand関数はデフォルトではメインストリームが使われている為、seed値を設定しなおせば、ストリーム配列の初めからrand値を出しなおす。よって、rand結果は再現性のあるものである。
また配列はrand関数が実行される度に1つ進むと解釈してよさそう。。
では、たとえばオブジェクト「a」、オブジェクト「b」に毎フレーム同じrand結果を出させたい場合。
このままだと配列はrand 実行毎に進んでいくので、


//seed宣言
seed 2;

//frame1
setAttr a.ty `rand 0 5`;
// Result: 2.064494 //
setAttr b.ty `rand 0 5`;
// Result: 1.76712 // 

 //frame2
setAttr a.ty `rand 0 5`;
// Result: 2.612228 //
setAttr b.ty `rand 0 5`;
// Result: 0.615584 //


となり、1フレーム目では「a」に配列1、「b」に配列2、が返され同じ結果にはならない。
そこで、任意のstringにてオブジェクト個々に独自のランドストリームを持たせる事で、結果を同調させます。


//seed宣言
seed st_a 2;
seed st_b 2;

//frame1
setAttr a.ty `rand st_a 0 5`;
// Result: 2.064494 //
setAttr b.ty `rand st_b 0 5`;
// Result: 2.064494 // 

//frame2
setAttr a.ty `rand st_a 0 5`;
// Result: 1.76712 //
setAttr b.ty `rand st_b 0 5`;
// Result: 1.76712 // 

//frame3
setAttr a.ty `rand st_a 0 5`;
// Result: 2.612228 //
setAttr b.ty `rand st_b 0 5`;
// Result: 2.612228 // 

//frame4 
setAttr a.ty `rand st_a 0 5`;
// Result: 0.615584 //
setAttr b.ty `rand st_b 0 5`;
// Result: 0.615584 // 
 

毎フレーム同じ結果になりました。
ストリームはrand実行毎に進むので、「b」が1コマ遅れでついていくなんて事も出来ます。


//seed宣言
seed st_a 2;
seed st_b 2;

//frame1
setAttr a.ty `rand st_a 0 5`;

// Result: 2.064494 //
//frame2
setAttr a.ty `rand st_a 0 5`;
// Result: 1.76712 //
setAttr b.ty `rand st_b 0 5`;
// Result: 2.064494 // 

//frame3
setAttr a.ty `rand st_a 0 5`;
// Result: 2.612228 //
setAttr b.ty `rand st_b 0 5`;
// Result: 1.76712 // 

//frame4 

setAttr a.ty `rand st_a 0 5`;
// Result: 0.615584 //
setAttr b.ty `rand st_b 0 5`;
// Result: 2.612228 //


エクスプレッションの場合、seedの宣言は1フレームに一度だけ、
パーパーティクルエクスプレッションの場合はcreationにて行なう。


以下、perParticleでの例 (書籍 テクニカルアーティストスタートキット Chapter6 .p266)
同じ数のパーティクル数ならば、完全に同調した動きをします。

particleShape1
creation :
seed pShape1 2;
runtime before dynamics :
particleShape1.velocity = `rand pShape1 <<-1,0,-1>><<1,0,1>>`;

particleShape2
creation :
seed pShape2 2;
runtime before dynamics :
particleShape2.velocity = `rand pShape2 <<-1,0,-1>><<1,0,1>>`;

関連コマンド

randstate:ストリームの状態を調べる。

例)
randstate st_a;
// Result: <<63847, 14317, 25624>> //

2012年6月26日火曜日

luminance depth

レンダーレイヤーを使用したluminance depth の出し方。

デプス出力したいオブジェクトを新規レンダーレイヤーに登録する。
レイヤーを右クリックでアトリビュートを出す。
アトリビュートエディタのプリセットからluminance depthを選択。

出来たset rengeユーティリティでカメラ深度を設定し、十分なビット数でレンダリング!

2012年6月19日火曜日

イメージプレーンの誤レンダリング防止

レンダリングが遅いと思ったら、いらないイメージプレーンを消し忘れてた、という凡ミスをなくすためのMEL

string $list[] = `lsType imagePlane`;
for ($node in $list)
    if ($node != "<done>"){
    setAttr ($node+".displayMode") 0;
}

で全てのイメージプレーンをNONEに出来ます。
これをpre render mel に入れればいいのだけど、長いのでプロシージャにして呼び出します。

global proc WB_IPhyde()
{
    string $list[] = `lsType imagePlane`;
    for ($node in $list)
        if ($node != "<done>"){
            setAttr ($node+".displayMode") 0;
        }
}

これをWB_IPhyde.melとして保存すれば、レンダーセッティングのpre render mel にWB_IPhydeと入れるだけで、レンダリング前に全てのイメージプレーンをNONEにしてくれます。

ただ、このままではMAYA GUIからのRender Current Frameの時も同様にNONEに設定されてしまいます。それでは困る場合の方が多いので、BatchRenderの時のみpre render melが適用されるように「about -b」を使ってif文を足します。

global proc WB_IPhyde()
{
    if(`about -b`==1){
        string $list[] = `lsType imagePlane`;
        for ($node in $list)
            if ($node != "<done>"){
                setAttr ($node+".displayMode") 0;
            }
    }
}