<< TOP



XSI ICE活用 頂点カラー
:02 頂点カラーにコンバート
このドキュメントは


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



頂点カラーにコンバート編
前のページで、頂点カラー自体を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)


<前 へ
次 へ>