2010年11月10日水曜日

[MEL] SI方式の表示/非表示切り替え

ひさしぶりの更新。
 
最近ちょっとSoftimage触っていて、Hideの仕様がいいなと思ったのでMELで作ってみた。
仕様の違いはこんな感じ。

 
【Maya】

 オブジェクトを選択後、Ctrl+hで非表示。選択状態は解除される。
 HyperGraph等で再選択後、Shift+hで再表示。選択状態は維持
 特に非表示にした後、再表示するのに手間が掛かる印象。

 
【Softimage】
 表示中のオブジェクトを選択後、hで非表示。選択状態は維持
 非表示のオブジェクトを選択後、hで再表示。選択状態は維持
 選択状態が維持されるので、hを押す度に表示/非表示を切り替えられる。
 
で、作ってみたのが以下のMEL。
"h"のホットキーに登録して使う。





global proc hideSIstyle()
{
    string $hideObj[] = `ls -sl`;
    int $i = `getAttr ($hideObj[0]+".visibility")`;

    switch($i)
    {
        case 0:
        showHidden;
        break;

        case 1:
        hide;
        select -r $hideObj;

        default:
        break;
    }
}







複数選択の場合、最初に選んだモデルの表示状態に揃う。
便利かどうかは、好みの問題かもしれない。



2013/7/31
本当のSIのhideはトグルですよ、との指摘を頂いたので
一応それも作ってみた。
ただ、どうしても個別に表示を切り替える必要があるため
大量にオブジェクトを選択していると動作が重くなる…。






global proc hideSIstyle()

{
    int $tgl;
   
int $vis;
   
string $hideObj[] = `ls -sl`;
   
for ($Object in $hideObj)
    {
       
$vis = `getAttr ($Object+".visibility")`;
       
$tgl = abs($vis - 1);
        setAttr ($Object+".visibility") $tgl;
    }
    select -r $hideObj;
}



2010年10月5日火曜日

[MEL]法線を転写する

Normalcopy00
 
 
同一頂点数の2つのジオメトリ間で、法線情報のみ
コピーペーストする手法を探したがなかったので、
簡単なMELを作成してみた。
コピー元→コピー先の順にモデルを選択しMELを
実行すると法線が転写される。
 
 
作成意図は、最近のアニメ的表現でよく用いられている、
膨らませたモデルの法線を転写する事によって陰影を
簡略化する手法を実現するため。
 
Normalcopy01
 
作成したMELは以下。
 
 
 
// 法線の転写実験
//
// 変数定義
string $objname[]; // 選択オブジェクト名
int $vertexNo[]; // オブジェクトのバーテックス数
float $normalX[]; // 法線X
float $normalY[]; // 法線Y
float $normalZ[]; // 法線Z



// 選択オブジェクトの取得と頂点数カウント
$objname = `ls -sl`;
$vertexNo = `polyEvaluate -v $objname[0]`;



// 法線情報の取得と転写
for ($i=0 ; $i<$vertexNo[0] ; $i++)
{
// 取得情報を初期化
clear $normalX;
clear $normalY;
clear $normalZ;
// 最初に選択したオブジェクトの法線を取得
$normalX = `polyNormalPerVertex -q -x ($objname[0] + ".vtx[" + $i + "]")`;
$normalY = `polyNormalPerVertex -q -y ($objname[0] + ".vtx[" + $i + "]")`;
$normalZ = `polyNormalPerVertex -q -z ($objname[0] + ".vtx[" + $i + "]")`;
// 2番目に選択したオブジェクトに法線をペースト
polyNormalPerVertex -xyz $normalX[0] $normalY[0] $normalZ[0] ($objname[1] + ".vtx[" + $i + "]");
}
 
 
 
 
実験的に作成したものなので、実用化するには
以下のような状況への対応が最低限必要と思われる。
 
・3つ以上のオブジェクトが選択された場合の処理
・オブジェクト間で頂点数が違った場合の処理
・1頂点に複数法線がある場合(共有法線でない場合)

 
作成してみるとこの処理、法線情報の平均化という手法が
いわゆるNormalMapの使用意図の間逆である点が面白いと思った。



2010年9月27日月曜日

トゥーンシェードとテクスチャカラーのブレンド

Toon_tex01



 
Maya標準のトゥーンシェーダは、プリセットされたランプシェーダ。
そのランプシェーダは、カラー設定を"Color"アトリビュートに対して
行うので、そのままではテクスチャーを接続する場所がなくなり、
「トゥーンシェード+テクスチャ」という表現はできない。
 
これを実現する為には以下の方法を用いる。
 
 
 
1.Hypershadeを開き、以下のノードを用意する。
 括弧内はHypershadeウィンドウ左側の"Create"タブ内の場所。
 ・RampShader(Maya→Surface)
 ・SurfaceShader(Maya→Surface)
 ・File(Maya→2DTexture)
 
 
2.作成したRampShaderにグレースケールでトゥーンのカラー設定を行う。
 
Toon_tex02
 
 
3.作成したFileノードにテクスチャ画像を接続する
 
Toon_tex03
 
 
4.1で作成した全ノードを[Work Area]にドラッグし表示
 
 
5.MultuplyDivide
ノード(Maya→Utilities)を作成(直接Work Areaに出来る)
 
 
6.
Work Areaに4つのノードが表示された状態で、以下のように接続を行う。
 ・FilemulitiplyDivideinput1に接続
 ・RampShadermulitiplyDivideinput2に接続
 ・MulitiplyDivideの"output"をsurfaceShaderの"outColor"に接続
 
Toon_tex04
 
  
出来上がったsurfaceShaderをモデルにアサインすれば完成。
 
 
リアルタイム表示では正しく結果が出ないので注意。
レンダリングすると正しく描画される。
もっと簡単な方法がありそうな気もするので、今後も要調査。



2010年9月21日火曜日

バーテックスカラーの焼付け

Verc_01
 
 
レンダリングで作成した陰影の結果をバーテックスカラー(Color Set)に格納する方法。
バーテックスカラーを用いると光源計算を行わなくても事前に計算された
陰影を表現できる為、処理負荷を軽くすることが出来る。
リアルタイム(ゲームなど)の背景表現では定番の手法。
 
 
 
バーテックスカラーは当然ディティールの精度が頂点数に比例するため、
大きな面などはある程度分割する必要がある。
サンプルデータの板は20×20に分割している。
 
 
Verc_02
            【シーン設定】
 
ライティングはmentalrayでのレンダリングで意図した結果が出るように調整する。
サンプルでは赤と青のポイントライトを1つずつ配置し、
FGを用いるため、BGカラーをグレーに変更している。
Render Settingsは「Preview:Final Gather」のデフォルト設定。
 
Verc_03
     【mentalrayでのレンダリング結果】
 
ここまでの準備が出来たら、カラー焼付けの作業を行う。
 
 
 
1.レンダーセッティングを開き[render using]を[mentalray]に変更。
 
2.モデルを選択し、[Lighting/Shading]→[BatchBake(mentalray)■]を選択。
 
3.開いたオプションウインドウの左上[Edit]→[Reset Settings]で初期設定に戻す。
 
4.初期状態から以下の項目を変更する。
 
Verc_04
 
 ・[Bake to:]を[Vertices]に
 ・[Use bake set override]にチェック
 ・[Color mode]を[Light and color]に
 ・[Convert and Close]か[Convert]をクリック(その後に多少時間が掛かる)
 
 
モデルにColor Setが設定されていない場合は新たにColor Setが作成される。
事前にColor Setが存在し、選択されている場合はそれに上書きされる。
 
 
レンダリングにシャドウを用いている場合、
[Bake shadow]にチェックを入れると影も考慮したカラーが作成される。
ただし影の形状を正確に焼き付けようとすると相当なポリゴン分割が必要になるので注意。
 
Verc_05
        【影の焼付けを行った結果】



2010年8月3日火曜日

フランスのCG雑誌を買ってみた

ひさしぶりの更新。実はフランス旅行に行ってまして。
で、せっかくなのでお土産に現地のCG雑誌を買ってみた。
 
 
これがフランスで買った3DCG雑誌「3DMag」
ルーブル美術館地下のメトロ出口近くにある雑誌屋にて購入。
 
 
Frmg_00

3dsMax,Mayaなどお馴染みの文字が並ぶが、なぜかSoftImageだけどこにも無い。
もしや不人気?
背表紙見ると、2010年7月号でNo.3なので、隔月発行なのかな?
ちなみに私は全く仏語読めないけど、CG雑誌ぽいのはこれだけだったので迷わなかった。
 
 
Frmg_01
 
巻頭特集は日本でも有名なデザイナー、DanielSimonさんの対談。
多分、著書の「COSMIC MOTORS」が仏語翻訳されて~、みたいな内容?
去年ぐらい日本の「AXIS」に載ってた内容に似てる印象(雰囲気のみ)
 
 
Frmg_02
 
ワルシャワ?在住のMichalKwolekさんによる、3dsMaxでのオリジナルメカ作成記事。
ライターが国際的なのもうらやましい。読む側も書く側にとっても。
 
 
Frmg_03
 
オーストラリアのBillyChengさんによる、これも3dsMaxの作例。
作り方よりもデザイン完成度の高さが気になる。
"38 minutes de rendu"は「レンダリングに38分掛かりました」の意だと思う…。
 
 
Frmg_04
 
ブラジルのMarcosSampaioさんによるmodoでのフォトリアルな熊の作成。
modoって全然触ったことないけどファーが綺麗。レンダラー何だろう?
 
 
Frmg_05
 
カナダのChrisNicholsさんによる、ZBrushとMayaを使ったクトゥルフ・クリーチャーの作例。
ライティングやマルチパスレンダーなど、レンダリング設定に注力した感じ?
 
 
Frmg_06
 
ウクライナのYaroslavLebidkoさんによるBlenderのチュートリアル。
レンダラーにV-RayとYafaRayを使用。YafaRayって何?
仕上げにGIMPを使うなど、フリーツールにこだわった作例かも。
 
 
Frmg_07
 
ワンポイントレッスン的な連載?
偶然このブログに描いた、Mentalrayでの被写界深度の設定と同じ内容が
書かれてたので親近感アップ。
 
 
Frmg_08
 
付録CD。チュートリアルビデオ以外にもモデルやテクスチャのデータが収録されている。
BMWの1シリーズって今流行ってるのかな?別の本でも見かけた。
 
 
 
海外の雑誌は紙質が悪くペラペラなものが多いけど、「3DMag」は割としっかりした作りだった。
値段は7.9ユーロで850円ぐらい。日本のCG雑誌の半額程度なのはだいぶ安い気がする。
読めないなりにフランスのCG事情も伺えて結構面白く、他の国のCG雑誌も読んでみたくなった。



2010年7月11日日曜日

ウィンドウにノードのサムネイルを表示する

Swatch_01
 
 
地味に2年ぐらい悩んでいたが、あっさり解決。
MELで自作したウィンドウに、
レンダーボールテクスチャサムネイルなどを
表示する方法。

 
【コマンド】
 swatchDisplayPort フラグ -sn ノード名;

【よく使うフラグ】
 -wh int int …表示領域
 -rs int      …スウォッチのレンダーサイズ。32~512。

その他詳細はオンラインヘルプ参照

 
【サンプル】
  window ;
  columnLayout r;
  swatchDisplayPort -wh 512 512 -rs 512 -sn lambert1;
  showWindow ;

デフォルトマテリアルのlambert1を大きくウィンドウに表示。
"lambert1"を任意のノード名に変えると他ノードが表示できる。
(テクスチャなら"file1"など)

 
なぜこんな簡単な事を悩んでいたかというと、
闇雲にレンダーボールやテクスチャサムネイルを
表示する方法を探していたから。
それらがノードのサムネイルだと気づく事が出来なかった…。



2010年7月1日木曜日

トーンマッピングの設定


mental rayを使用したレンダリングでトーンマッピングを用いる方法。
レンズシェーダを使って設定する。HDR環境でのレンダリングには特に重要。


1.レンダリングに使用するカメラのアトリビュートを開き、
 [mental ray]欄内、[Lens Shader]の接続ボタンをクリック

 




2.開いた[Create Render Node]ウインドウ内、
  [mentalray]→[Lenses]→[mia_exposure_photographic]をクリック。
 
 
 
 
3.カメラのアトリビュートに追加されたシェーダのタブで以下の設定を行う
 数値は実在のカメラと同じように設定する。
 括弧内は主に使用する数値。太字がだいたいの基準になる。
 
 [Film Iso]…フィルム感度  (暗<50,100,200,400,800,1600,3200>明)
 [Camera Shutter]…シャッター速度  (暗<40000~100~0.017>明)
 [F Number]…絞り値  (暗<1,1.4,2,2.8,4,5.6,8,11,16,22>明)
 

 
【サンプルシーン】

Light :directionalLight×1、Intensity:50000、他はデフォルト設定
Shader:mia_illum_phong
RenderQuality:Draft
 

 
 
 
※HDRを意識していないシーンでは、デフォルトの設定だと暗過ぎる事が多い。
 その場合、[Cm 2Factor]を1000~1500程度まで上げると調整しやすい。


2010年6月22日火曜日

被写界深度の設定③

Bokeh_00
 
mental rayを使用したレンダリングに被写界深度を設定する方法。

通常の[Depth of Field]で行う被写界深度の設定は、mental rayを用いた
レンダリングではノイズが出てしまい、使用できない。
mental rayを使用する場合は、レンズシェーダを用いて設定を付加する。
 
 
1.レンダリングに使用するカメラのアトリビュートを開き、
 [mental ray]欄内、[Lens Shader]の接続ボタンをクリック
 
Bokeh_02
 
 
2.開いた[Create Render Node]ウインドウ内、
  [mentalray][Lenses][mia_lens_bokeh]をクリック
 
Bokeh_03
 
 
3.カメラのアトリビュートに追加されたシェーダのタブで以下の設定を行う
 ・[On]にチェックを入れる
 ・[Plane]   ・・・合焦距離(ピントが合う距離)を入力
 ・[Radius] ・・・ボケの深さ。レンズの絞り半径をベースに調整する
 ・[samples]・・・レイの数。多いほど滑らか、高負荷になる

Bokeh_04

 その他の設定もよりリアルで綺麗なボケを再現する為に役立つが、
 ここでは省略。詳しくはオンラインヘルプを参照。



※サンプル画像は2011ですが、2008以降同設定で確認済みです。



2010年6月17日木曜日

対称形を保持したモデリング

Mirror_00


左右対称のモデルを作成する際など、対称の状態を随時確認しながら作業を行う方法。

1.原点上平面に切断面(対称化後の中心面)を作ったモデルを用意する。

2.[Edit][Duplicate Special□] 開いたウインドウで以下の設定を行う。

Mirror_01

 ・[Geometry type][Instance]に変更
 ・[Scale]の対称化したい軸に[-1]を入力
 ・[Number of copies][1]を入力
 ・[Duplicate Special][Apply]ボタンで実行。



対称化した側のモデルはインスタンスなので、最終的には以下の手順で一体化させる。

1.インスタンスを選択
2.[Modify][Convert][Instance to Object] 、インスタンスを実体化
3.左右モデルを選択、[Mesh][Combine] 、単一モデルに合体
4.モデルを選択、[Edit Mesh][Merge]、切断面のバーテックスを結合



2010年6月9日水曜日

オブジェクトのコンストレイン(追従)

Constrain_00

オブジェクトを他のオブジェクトの動きに追従させる方法。



・キャラクターセットアップのハンドル作成
・ウエイトスキンを使わないボーンを用いたアニメ(メカなど)
・オブジェクトにカメラを追従させ、一人称の画を作成する
・エクスポート出来ないデータにロケーターを追従させ、
 代わりにそのロケーターをエクスポートする

 
など使い方はいろいろ。


1.追従されるオブジェクト・追従するオブジェクトの順でモデルを選択する。

2.Animationメニューの[Constrain]→任意の対象を選ぶ。

Constrain_01

 ・Point …移動値
 ・Aim   …(モデルの向き。今回省略)
 ・Orient…回転値
 ・Scale …拡大値
 ・Parent…(相対的移動・回転値。今回省略)
 
 オプションメニューで以下の設定が可能。
 
Constrain_02

 [Maintain offset] …現在の相互差分の値をオフセット値に使用する
 [Offset]                …XYZのオフセット値。手動入力。
 [Constraint axes]…コンストレインする軸方向を選択
 [Weight]             …追従する割合を設定
 



2010年6月5日土曜日

mentalrayでワイヤーフレームをレンダリングする

Contour_00



Contour_01



mental rayを用いたレンダリングでワイヤーフレームを描く方法。
ワイヤーフレームのみ描画する事も、通常のレンダー画像に重ねる事も出来る。

1.モデルに任意のマテリアルをアサイン、そのマテリアルのアトリビュートを開く
 マテリアル名横にあるOutput Connectionボタン(□右側に▲)を押し、
 Shading Groupsのアトリビュートに変更する(~SGというタブが開く)
 
Contour_02
 
 

2.
アトリビュート内[mental ray]枠内の[Contours]にある、
 [Enable Contour Rendering]にチェックを入れ、
 [Color][Alpha][Width]でそれぞれラインの色・透明度・太さを設定する。
 
Contour_03
 
 

3.[Render Setting]
を開き、[Render Using][mental ray]に変更



4.[Contours]枠内を以下のように設定する([Contours]は2011では[Features]タブ内)
 ・[Enable Contour Rendering]にチェック
 ・ワイヤーフレームのみ描画したい場合は[Hide Source]にチェックを入れる
 ・[Draw By Property Difference]枠内の
  [Around silhouette(coverage)] ・・・オブジェクトのアウトライン描画
  [Around all poly faces]に      ・・・全てのフェイスのアウトライン描画
  にチェックを入れる。
  その他のチェック項目については必要に応じて使用する。



5.ラインを滑らかにしたい場合は[Render Setting]の[Contours]枠内、
 [Over-Sample]の数を上げ、その後必要に応じて
 [Filter Type][Filter Support]を調整する。
 
Contour_04
 
 

このレンダリング方法では、たとえマテリアルの透明度を100%にしたり、
useBackgroundシェーダーを使用しても、ジオメトリ的陰面のラインは描かれない。
サーフェース自体は透明に出来るので、エッジ描画がポスト処理であるためと思われる。



2010年5月28日金曜日

物理挙動っぽいカメラを作ってみた

以前からフォトリアルな画作りにはカメラ(リアル・CGとも)の勉強がもっと必要だと
感じていたので、実際の制作に役立つかはさておき、自由研究的なノリで作ってみた。
画角、トーンマップ、被写界深度が正しく連動するカメラ。



内部的にでたらめな計算が多いので、物理的(Physical)というよりは現象的、
「Phenomenon Camera」と言った方が正確かもしれない。 詳細は以下に。


【制作目的】
 HDR環境下で、実在のスチルカメラと同じ設定のみを用いて、現実に近い
 レンダリングイメージが作れるカメラを目指す。
 現実のカメラの知識のみで絵作りが出来る事が目標。
 画角・トーンマップ・被写界深度の物理的な相互連動に加え、クオリティと
 計算負荷の自動コントロールも行う。

【条件・設定】
 光源はHDR。マテリアルは物理的に正しいシェーダを用いて、正しい
 ダイナミックレンジを持ったシーンを用意する。

 レンズは14~54mm、f2.8~3.5のズームレンズという設定。
 ズームに合わせてリニアにf値が変化するものとする。
 Aimカメラをベースとし、オートフォーカスを実現する。
 カメラシェイプノードに、一般的なスチルカメラの設定項目を
 エクストラ・アトリビュートとして追加。
 そのパラメータを使って各アトリビュートのエクスプレッションを作成していく。
 追加アトリビュートは以下の5つ。

 ・焦点距離
 ・開放F値
 ・絞り値
 ・シャッター速度
 ・フィルムのISO感度


【エクスプレッションの構築】
 エクスプレッションで以下のように計算を行い、関連付けしていく。

  ・焦点距離 から 開放F値 を算出
  ・開放F値絞り値 から 最終的なF値 を算出
  ・合焦距離焦点距離最終的なF値 から 被写界深度 を算出
  ・最終的なF値シャッター速度ISO感度 から トーンマップを算出
  ・被写界深度 から レイサンプル数 を算出
 
 最後の項目はカメラと関係なく、クオリティと負荷のバランスのための設定。
 レンダー結果を比較すると、ボケの面積が広いほどノイズが多かったので
 被写界深度が浅い(ボケが多い)ほどサンプル数が上がるように設定した。
 
 
【完成したカメラでのレンダリング】
 いろいろな設定でのレンダー結果。
 
F001
① f=32mm,1/140sec,F1.4,ISO100,距離113.5cm
 
F060
② f=14mm,1/140sec,F1.4,ISO100,距離113.5cm
 
F120
③ f=54mm,1/140sec,F1.4,ISO100,距離113.5cm
 
F180
④ f=20mm,1/140sec,F1.4,ISO100,距離40.2cm
 
F240
⑤ f=20mm,1/140sec,F1.4,ISO100,距離63.8cm
 
F300
⑥ f=20mm,1/140sec,F1.4,ISO100,距離19.1cm
 
F360
⑦ f=20mm,1/140sec,F1.4,ISO100,距離67.5cm
 
F420
⑧ f=20mm,1/140sec,F4.0,ISO100,距離67.5cm
 
F480
⑨ f=20mm,1/140sec,F1.0,ISO100,距離67.5cm
 
・レンズが広角になるほど画面が明るく、被写界深度が浅くなる(①②③)
・被写体(合掌距離)が近いほど、被写界深度が浅くなる(④⑤⑥)
・絞りが大きいほど画像が暗く、被写界深度が深くなる(⑦⑧⑨)
 
というような連動が割と自然に実現できた気がするので、今後しばらく使ってみて、
さらに精度を上げてみようと思う。



2010年5月20日木曜日

オクルージョンマップの生成

Aomap_01

このブログのアクセス解析を見たら、検索フレーズのトップが「オクルージョン」だったので、
もしかしたら多くの方が探してるのはこっちかも、と思って書いてみた。
という事で、アンビエントオクルージョンマップ(テクスチャ)の生成方法。
 
 
 
Aomap_02_2

オクルージョンを作成するモデルは、事前にUV展開しておく。
その際、展開したUV同士が重ならないように配置する。
 


1.レンダーセッティングを開き[render using]を[mentalray]に変更。
 
2.モデルを選択し、[Lighting/Shading]→[BatchBake(mentalray)■]を選択。
 
3.開いたオプションウインドウの左上[Edit]→[Reset Settings]で初期設定に戻す。
 
4.初期状態から以下の項目を変更する

Aomap_03

 ・[Use bake set override]にチェック
 ・[Color mode]を[Occlusion]に
 ・[Orthogonal reflection]にチェック
 ・[Prefix]に任意のテクスチャファイル名を入力
 ・[X resolution]に任意のテクスチャ横サイズを入力
 ・[Y resolution]に任意のテクスチャ縦サイズを入力
 ・[File format]から任意の画像フォーマットを選択
 ・[Bake to one map]にチェック
 ・[Convert and Close]か[Convert]をクリック(その後に多少時間が掛かる)
 
 
 
Aomap_04
     【出来上がったオクルージョンマップ】
 
  
生成された画像はカレントプロジェクト内の、
\renderData\mentalray\lightMap\」に保存される。
 
画像サイズが充分なのに画像が荒く感じる場合は[Occlusion rays]の値を上げる。
ノイズが多く感じる場合は[Number of samples]の値を上げ、アンチを強くかける。


 
 
最近多くの方にアクセス頂いてるようです。ありがとうございます。
間違いやわかりにくい点などありましたらお教え下さい。