CG・コンテンツ制作
  1. CG・コンテンツ制作トップ
  2. DAIKIN CG Channel
  3. UsersNotes
  4. ICE
  5. XSI ICE活用 頂点カラー :02 頂点カラーにコンバート
SUITE USERS NOTES
XSI ICE活用 頂点カラー
:02 頂点カラーにコンバート

このドキュメントは

  • XSIはそこそこ触れる
  • ICEというものがどういうものか大体わかる
  • ICEが気になっているのだけど、どこから入ったら良いかわからない
    といったアーティスト、デザイナさん向けに作られています。
ftm_ml

頂点カラーにコンバート編
前のページで、頂点カラー自体をICEを使ってどうこうする方法は、もうマスターできたと思います。
では次に、頂点カラーではないデータを、頂点カラーとしてコンバートする方法について少しまとめます。


1.データの準備

まずは前回と同じ、頂点カラーをSet Dataで適用できる形のシーンを用意します。
頂点カラーのデータタイプはデフォルトだとShort(2バイト)なので、Float(4バイト)にしておかないとデータの-値が絶対値化みたいな状態になって、
思ったのと違う色になってしまうので気をつけましょう。
※Vertex_Colorのノードをダブルクリックすると、下の画像の左中がわのプロパティメニューが開きます。
データタイプの変更...ボタンを押してFloat(4バイト)を選びます。

034

いちいち頂点カラーを適用してICETreeを設定して・・・とやるのが面倒なのでスクリプトにしてみました。
完全に自分用ですが、よろしかったらコピペしてお使いください。改造もご自由にどうぞ・・・
※オブジェクトを選択したままで何回も走らせると、ICETreeがいくつもぶら下がりますし、頂点カラーも増えていきますw

Set oCol = GetValue("SelectionList")

For Each oSel in oCol
    If oSel.type = "polymsh" Then
        Set oVtc = CreateVertexColorSupport( , "myIceVTC",oSel)
        ChangeVertexColorDatatype oVtc, 1
        Set oIce = ApplyOp("ICETree", oSel, siNode, , , 0)
        Set oSetData = AddICECompoundNode("Set Data", oIce)
        SetValue  oSetData & ".Reference", oVtc & ".Colors"
        ConnectICENodes oIce & ".port1", oSetData & ".Execute"
    End If
Next



2.法線データを頂点カラーに

用途は諸々ありますが、法線情報が頂点カラーとして取得できると何かと便利かナァと思いますので、今回はそれを作ってみましょう。
前回までの要領で、GetDataで法線情報を取ってきてSetDataにつなげば良いんじゃないの?
とまずは普通思いつくと思います。(自分はそうでした・・・)

PointNormalをGetDataにセットすると、ポートの色が黄色になります。

035

お、黄色といえばベクターだな?フムフム

036

これでXYZがRGBに分解されて繋がるな・・・と

037

よし・・・赤いポートでカラーに変換できたと・・・
あ、あれ??

038

ミスマッチだって・・・つながらないよ・・・orz
これは、入力がサンプルかオブジェクトなのに、ポイントのデータをつなごうとして、つながらないよ~って怒られているようです。

もう一度、PointNormalのGetDataのポートに戻ってみましょう。
どうやらこの時点でポイント単位データになっているようです。
これがサンプルになれば問題ないようです。

039

というわけで、もうひとつGetDataを使い、先にNodeLocation(ノード位置)を取得してから、その中のPointNormalを取得することでサンプル毎の法線となりました。

040

NodeLocationを介してPointoNormalを取得することで、共有頂点だったものがポリゴンノード毎の法線情報となり、
頂点カラーとID順と数が一致するので接続可能となるようです。
※ICEノードに関するドキュメントは充実していますが、GetDataで取得、SetDataで設定できるデータに関してはドキュメントが存在しないのが残念ですね。

これで無事頂点カラーへ通すことが出来て、法線の色表示への目的が果たされました。
左下のXYZ矢印と色を見比べてみると、嗚呼なるほどねぇ・・・。と思えるかも知れません。

041

このコンパウンドデータをダウンロードできるようにしておきます。
 < fmt_VTXNormal to Color v0.5 ダウンロード > 

※編集法線について
現状ですと平均化された状態の法線しか取得されていません。
たとえば、ハードエッジやスムーズ角度の変更に適応しません。
これは、XSIが初期状態の法線からは編集後の値を取得できないという仕様から来るもので、取得するためには UserNormal というものを使います。


・UserNormalの使い方
UserNormalを使えるようにする方法は、以下のリンク先に記載されています。
法線編集ツール(User Normal Editing Tool)登録方法(Autodesk社SOFTIMAGE|XSI TIPSサイトへ)


たとえば下図のように、ハードエッジを使って法線を分割したものを法線カラーに反映させたい場合は、上記方法でUser Normal Editing Toolを起動できるようにしておき、
オブジェクト上で選択された状態で右クリックから

User Normal Editing Toolを選びます。

077

下のようなUIが開きますので、エフェクト > ユーザボタンを押して、現状の法線状態をすべてユーザー法線に変換します。

078

オブジェクトのClusters以下に「User_Normal_Cluster」が付加されます。

079

そしてICETree内のGetDataのPointNormalを指定している方のプロパティを開き、User_Normal_Cluster.User_Normal_Property.Normals
とたどって指定します。

080

そうすることで編集後の法線情報が頂点カラーに反映されるようになります。

081

ただ、User_Normal_Clusterというのはあくまで付加情報ですので、存在しない場合はエラーになると思い ます。
そこで、Execution > First Valid ノードの登場です。
このノードに並列で渡される情報のうち、エラーがなかった最初の情報を次に渡すといったものです。
なので上までの2段階のGetDataノードを二つ用意して、User_Normal、PointNormalの順にこのノードにさしてやります。

082

これでUserNormalを削除してみても、上側は赤くなりますが、下側のPointNormalが渡されるので問題ない。ということになります。
以下は参考までに User_Normal_Clusterを消した状態のキャプチャ画像です。

083

それではUserNormalの処理を追加したコンパウンドを、バージョン0.6として公開します。

 < fmt_VTXNormal to Color v0.6 ダウンロード > 


3.頂点座標を頂点カラーに

次は、頂点座標を元に、頂点カラーを変化させる方法をやって見ましょう。
※単純にグローバルのY0位置を境にしてYの上下で色を変える方法です。

まず、上記の要領で今度は頂点の位置情報を取得します。

042

次に比較するためのノード群を構成しますが、ここでちょっとプログラム(スクリプト?)的な設計をして見ましょう。
座標のY位置の0を境にそれ以上なら赤、それ以下なら青にしたい・・・・。
※今回は見やすくするために赤と青を選択していますが、色は自由に設定できますので・・・。
するとこんな感じに考えられるかと思います。

頂点位置Y  >  0 = 頂点カラー赤
頂点位置Y  <  0 = 頂点カラー青

↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓

変数A = 頂点位置Y  >  0
変数A = True ; 頂点カラー赤
変数A = False ; 頂点カラー青


なれていない人はわかりにくいかもしれませんが、変数Aはノードの次の流れへつなぐためのラインだと思ってください。
考えが整理できたところで比較ノード構成をします。

まず、取得できた頂点位置データをX、Y、Zの三要素に分けます。(Yしか使わないので・・・)

043

上で分けたYのポートが設計上の頂点位置Yということなので、Yを今度は比較ノードにつなぎます。
Math > Comparison > Less Than(<) から < ノードを呼び出し、Secondにつなぎます。

044

比較パラメータFirstは0にします。
これで頂点ごとに0 < 頂点位置YかどうかがResultで出されます。

045

Execution > If ノードを呼び出してResultConditionにつなぎます。
頂点ごとのTrueとFalseを受け取って色を指定します。

046

今回は単純なカラーノードでColorから取り出して設定します。

047

赤をIfノードのIf Trueにつないで、青をIf Falseにつなぎ、結果をSetDataにつないで終了です。

048

ただ、現状だとローカルの頂点座標位置なので、オブジェクトのを起点にしてしまいます。
回転させても、移動させても、頂点の色は固定されたままです。

049

ここでまた少し面倒くさいですが、RTシェーダの概念を取り入れます。
RTシェーダの世界ではこういうのをオブジェクトスペースとか、ローカルスペースとか言います。
で、グローバルの座標のことをワールドスペースと言うのですが、それに変換するためにはマトリクスを掛けるということをします。
何に何を掛ければ良いのか・・・というのを一から説明すると長いのでさっさと行きますが、頂点位置にワールドマトリクスを掛けます。
シェーダ風に言うと、
mul( WorldMatrix, PointPosition );
です。

ノードは Matrix > Multiply Vector by Matrix を使います。
GetDataのPointPositionと3D Vector to Scalarの間に挟みます。
赤くなるのはまだMatrixが繋がっていないからみたいです。

050

次にGetDataでオブジェクトのKine.globalを取得します。※PosやRotまで降りていきません。
そうすることでオブジェクトのグローバルのマトリクスが取得できるようです。(出力ポートの色が水色になります。)
これをMultiply~~のMatrixポートにつなげば、上の赤いエラーも消え、データがすぅっと楽に通りました。

051

頂点の色の変化が、グローバルのY0の位置を境界にするようになりました。
(頂点数が少ないので下の画像だと少し汚いですね・・・)

052

このコンパウンドも以下から落とせます。
コンパウンドの外部接続に、Y0以上の色と以下の色を設定できるようにしておきました。
 < fmt_ChangeColor from global y0 v0.5 ダウンロード > 


4.オブジェクト単位の深度

最後に、カメラから見た頂点のオブジェクト毎の深度を頂点カラーで表示させてみましょう。
深度も多くの用途に使えます。
今回は、わかりやすいようにTorusを使います。
レンダリングの深度表示のように白黒のグレーで、手前から奥をグラデーションで表示させましょう。

必要な情報は、頂点位置とカメラ位置の距離なので、使用するノードは
Math > Vector > Get Distance Between です。

053

これに対して、3と同じグローバルの頂点位置をFirstにつなぎ、任意のカメラのKine.global.posをSecondにつなぎます。

054

Get Distance BetweenノードのResultからは各頂点とカメラの間の距離が出力されているはずです。
Debugging > Log Values を使って、とりあえず適当にICETreeまでつなげば、スクリプトログウィンドウに結果が表示されるはずですが、
全頂点分行数が表示されるので注意が必要です。^^;

この中から白の頂点と黒の頂点を決めなければいけないので、最小距離と最大距離を取得する、Get Maximum in Set と Get Minimum in Set を使います。
Math > Statistics の中にあります。

055

これを色空間に変換するので、最大値を1に最小値を0にレンジを再調整するノードをつなぎます。
Math > Basic > Rescale ノードを呼び出し、Get Distance BetweenのResultをValueに繋ぎ、Get Maximum in SetのMaxをSource Start、Get Minimum in SetのMinをSource Endにつなぎます。

056

Target StartとTarget Endの値は0と1のままです。
これで、Get Distance Betweenから出力された頂点の距離群を最大値、最小値を元に0~1の間にリスケールされます。

ここまでの結果をRGBA to Colorに繋ぎ、頂点カラーに戻します。

057

これで、深度レンダリングの結果のような絵がリアルタイムに見れます。

058

他のビューから見ると、深度の結果を客観的に見れて面白いですね。

059

これもコンパウンドをDLします。
カメラのGetDataはご自分で接続してください。
 < fmt_ObjectSpace Deapth v0.5 ダウンロード > 


今回作成した3つのコンパウンドはいろいろ応用できるかと思いますので、ご自由にお使いいただければと思います。
結局ICEはどんなノードがあるのかを知るのが第一歩だと思いますので、時間を見つけてノードリストをぼぉ~っと眺めるのからはじめると良いのではないかと・・・。(自分はそうでしたw)



戻る 次へ

お気軽にお問い合わせください

Daikin CG News お申し込み

CGクリエイター向けのセミナー・イベントやキャンペーン、製品情報をメールマガジンでお届けします。(登録無料)

Twitter

ページの先頭へ