CG・コンテンツ制作
SUITE USERS NOTES
XSI ICE活用 UVデータ

このドキュメントは

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

UVデータにコンバート編
前回のページまでで、ICEを使って頂点データや計算結果を、頂点カラーに変換することが出来るのがわかりました。
今回は同じようにして、UV(TextureProjection)データに変換して利用する例を紹介します。


1.データの準備

今回は頂点カラーではなく、UVデータをオブジェクトに適用します。
オブジェクトを選択して、取得 > プロパティ > テクスチャプロジェクション > 新規プロジェクションの作成と選択します。
ダイアログが開きますが、どうせICEでパラメータを与えるのでデフォルトのままでOKを押します。

087
088089

上図の左のようにオブジェクトに緑色の枠が表示されます。
エクスプローラーで確認すると、Clustersの中にTexture_Coordinates_AutoとTexture_Supportというプロパティが出現します。
Texture_Supportというのが上図の左の緑色の枠です。
以下からは、UVの頂点座標データのみが必要なので、UVの全体枠を示す

Texture_Supportは要りません。

090

MCP右側のEdit > フリーズMを押す等して
Texture_Supportをフリーズしておきます。

次はIceの設定です。
頂点カラー編とは違い、対象となるオブジェクトのUVデータにを「SetData」にセットします。

091

UVは頂点カラーよりも深いところにあります。
Set Dataのリファレンスの横「Explorer」をピックして、Polygon Mesh > Clusters > Texture_Coordinates_AUTO > Texture_Projection > 

UVs です。
UVは大体において、2Dテクスチャに対してしか使用しないため2次元のUVsでいいのですが、3Dテクスチャを使用したり、3次元的に使用したい場合は、
UVWsを使用します。
とりあえず今回はUVsとしておきましょう。
テクスチャエディタではUとVを示す方向はこうなっています。※ここ、MaxもMAYAも、0~1の方向が違うので注意が必要です。

092

ICEツリー上はこのようになります。

110

2.テクスチャシェーディング

UV値も数値で表すことが出来ます。(いまさらと言われるかもしれませんが)
下図のように左下がUV共に0,0で右上1,1

093

これを意識すると、XSIのNoicon.picって良く出来たテクスチャだなぁと実感します。
さて、①で作ったSetDataノードをオブジェクトのICETreeに繋ぎます。
するとTextureEditorで見えていたUVが左下にくちゃっと集まってしまいます。

094

これはUもVもすべての頂点に対して0が与えられたという状態です。
次に、手っ取り早く頂点ごとに0~1の値を与えることが出来るコンパウンドを、前回「03 頂点カラーでランバート」で作成していますので再利用しましょう。

 < fmt_LambertShader v0.5 ダウンロード > 

もう一度fmt_LambertShader_v0.5を引っ張り出してきて、ICETreeビューで開いてみましょう。
とりあえずドロップしたコンパウンドだけでは真っ赤ですので、前回と同様にGet LightをVector Lightポートへ接続してあげましょう。

095

これでほっと一息。
でも、このコンパウンドのOutPutはColorなのでUVには繋がらないことに気づくと思います。
fmt_LambertShaderノードの右クリックから「コンパウンドの編集」を選びます。
コンパウンド内部のツリーを左から追っていき、以下の場所に注目です。

096

ここでDot Product(内積)を使ってライトベクトルと法線ベクトルを計算し、サンプルごとに-1~1の数値が取得できている部分があります。
これを使います。
※現在OutPutまで繋がっている部分は一応残しておきましょう。

Math > Basic > Rescale を取り出して、Dot ProductのResultを Rescale のValueに繋ぎます。
Rescaleの設定はソース開始を-1ソース終了を1、Target Startを0、Endを1にします。
まぁ0~1でクランプしているわけですから、クランプチェックははずしたままです。

097

後はこの0~1にしたScalarデータのResultをOutPutの●までドラッグしてResult1とします。

098

わかりやすくするために、それぞれのResultの上で右クリックして、名前を変更しましょう。
↓こんな感じでしょうか??

099

そして、ツリービューの左上にある×をクリックしてコンパウンド編集を閉じます。

100

これでコンパウンドのOutポートにColorとScalarの二つのポートが出現しました。

101

このScalarのほうのポートをConversion > Scalar to 2D VectorのXに繋ぎます。
そしてVectorを一番最初のUVのSetDataに接続して終了です。

102

マテリアルをコンスタントにして、Colorに繋いだテクスチャのImageNodeにSetDataのTexture_Projectionを設定すると、このような状態になるのを確認します。
こうなっていれば、成功です。

103

・・・でもこれだけだと何がしたいのかわかりませんね?
そこでテクスチャをトゥーンっぽいのを作成して見ましょう。

104

たとえばこんな感じの、左が暗く、右が明るい色です。
ライトも表示してみると、ライトの方向に明るい部分がきて、その反対側に暗い部分がきていることがわかると思います。

105

これは内積の結果をUVに変換して、0~1の数値として出力される結果ということになります。
ライトをくるくる回してみて楽しみましょう~。

106

一番明るいところにおや?とおもうヘソが出来ていると思います。
これは拡大フィルタリングによって、テクスチャの反対側のピクセルがぼかされて出てきているためです。
これの回避方法はいくつかあるのですが、簡単なところでレンダーツリー上でピクチャをダブルクリックして、テクスチャリングタブで
OpenGLテクスチャ > テクスチャ拡大フィルタを、リニア補間ピクセルから非補間ピクセルに変更することで消えます。

こうすることでリアルタイムのトゥーン(ディフューズライティングのみ)が、RTシェーダを書かなくても確認できるようになりました。
とはいえ、今回も頂点カラーのランバートと同じで、本来GPUで出来ることをわざわざCPUに処理させているため、高速にとは行きません。
RTシェーダを習熟する上での足がかりにでもしていただけたらといった感じでしょうか?
※結局ICEではテクスチャのピクセルにはアクセスできないので、テクスチャのブレンドが出来ません。ICEもまだまだだね・・・。

ちなみにUVをテクスチャエディタで見てみるとこんな感じです。

107

UV頂点が下のほうにくちゃっとなっています。
U方向には0~1を与えたんですが、V方向は0のままです。
ためしにICEツリーの
Scalar to 2D Vectorをダブルクリックで開いて、Yのスライダーを(0~1の範囲内で)動かしてみましょう。
UV頂点が一列のままV値を移動するのがわかると思います。
このYの値でどのあたりのピクセルを取得するかを設定していくのが、シェーディングテーブルの手法というわけですが、そこから先はRTシェーダでやりましょう。

109

 < fmt_LambertShader v0.6 ダウンロード > 


3.環境マップUV

さてさてお次に挑戦するのは環境マップのUV作成です。
環境マップにUVWは必要ないのですが、ちょっと今回はWの存在も意識してほしいのでUVWを使います。

111

SetDataをダブルクリックして「Explorer」をクリック。
再度Texture_Projectionまでたどっていき、今度はUVWsを選択します。

そして環境マップに必要なのは、環境マップは鏡面反射なので反射ベクトルを計算する必要があります。
で、反射ベクトルというのは下図のようにオブジェクトの表面で反射した絵が、目に入ってきます。
目から表面の法線ベクトルまでを視線ベクトル。法線ベクトルと計算されて出されたものが反射ベクトルです。

112

式はこんな感じ。

反射ベクトル:R
視線ベクトル:V
法線ベクトル:N
とした場合

R = V -2 × ( N V ) × N
と、なります。


こいつをICEツリーで作っていけば良いわけです。
それでは、頂点カラーの章で使用したノードたちを利用して組んでいきましょう。
まず

( N V )

の部分。法線ベクトルと視線ベクトルの内積です。
これは Lambert のライトベクトルを視線ベクトルに変えたものを作ることで再現できます。

なので、上で使った

 < fmt_LambertShader v0.6 > 
を基にして作ってみましょう。

とりあえず、fmt_LambertShaderをICEツリー上にドラッグアンドドロップして、惜しげもなくバコっと展開してしまいます。

115

そしてこのなかで、今回は色出力ではないのでMultiply Color by ScalarとAdd Colorを削除します。
Rescaleもいまは要りません。
(跡で余裕のある人は反射ベクトルを頂点カラーで表示してみるとXYZ座標の関係がわかって面白いとは思います)

116

次にGetDataを取り出して、カメラをピックなどで選んで、Out Nameを赤くなっていたノードのGet.Kine.global.quatに繋ぎます。
これで法線ベクトルと視線ベクトルの内積は完成です。
あとは残りの計算部分をMathノードを駆使して作成していきます。

117

Math > Vector > Multiply by Scalarを使用して、内積結果をFactorにつなぎ、ValueにConstant > Scalarを取得してきて2を設定します。

Multiply by Scalarノードにダイレクトに数値を入れれば良いのですが、ツリーからいくつをかけたかこうすると視認することが出来ます。

2 × ( N V )

118

2はScalarだったので良いのですが、これから先掛け合わせる値はすべて3次ベクトルになるので、Conversion > Scalar to3D Vectorに繋いでベクトルに変換します。

119

2 × ( N V ) × N

このようにMath > Basic > Multiplyを利用して、内積に2をかけたものにもともと繋いでいた法線ベクトルを再利用する形で、繋いでかけあわせます。

120

最後にMath > Basic > Subtractを使用して、Multiplyの結果をFirstに、もともとあった視線ベクトルをSecondを繋いで、

V - 2 × ( N V ) × N の完成です。
これで反射ベクトルが出来ました。

121

とりあえず反射ベクトルを作るだけでもツリーがこんなになっちゃって大変なので、コンパウンドでまとめておきましょう。

122

ここらあたりをガバっとつかんで、コンパウンドへポン!
出力ポートはすべての計算結果の一番右側のVextorを設定しておきます。名前はout_Vectorです。

123140

GetDataのカメラは外に出したままにしておきます。
これをライトにすることでPhongスペキュラの計算に使えるからです。(今回はやりませんが・・・)
※ていうか、なんでDot ProductやCross ProductがMath > VectorにあるのにReflect ProductやRefract Productが無いんでしょうか・・・。

 < fmt_Refract Productv0.5ダウンロード > 

※このプロダクトノードは、Dot Productなど最初から用意されているものとは入力が違うので動作が異なります。

反射ベクトルが合っているかどうかを視認するには、以前のXSI ICE活用 頂点カラー :02 頂点カラーにコンバートの時のように
頂点カラーに変換すると非常にわかりやすいと思います。

以前のように頂点カラーを適用し、Float(4バイト)に設定し、ICEはSetDataでその頂点カラーを見に行きます。
Reflect Productの出力ベクトルは3DVectorなのでConversion > 3D Vector to Scalarで一度分解して、RGBA to Colorを使用してSetDataに接続します。

144

カメラのビューをコンスタントにして頂点カラーが見れるようにしてみてください。
左下のXYZマニピュレーターの軸色と照らし合わせて見るとなるほどね~って感じがしませんか??
シェーダを書く途中でも計算したベクトルが正しいかどうかはこうやって色に変換してチェックするとわかりやすいです。(TIPS??)

145

これで終わりではありません。
さらに苦難の道が待っています。
それではいったんカメラのビューをテクスチャデカールに戻します。
頂点シェーダぐらいのことしか出来ないというのを前提なので、今回は球面環境マッピングの計算をやってみましょう。
旧世代のゲームでよく見かけた、あのきらきらした金属っぽい表現のための嘘反射です。

計算式はこんな感じ。ていうかシェーダコード。

M = 2 * sqrt ( pow( R .x, 2) + pow ( R .y, 2 ) + pow ( ( R .z + 1 ), 2 ) )
    U = R .x / M + 0.5
    V = R .y / M + 0.5
    W = 0


いきなり複雑です・・・ >  < 
でもめげずに挑みます・・・。
ではまずRを3つに分解します。
毎度おなじみ、3D Vector to Scalarです。

124

つぎはPow。これがべき乗といういみで、括弧ないの左の値を右の値でべき乗するという意味です。
Math > Basic > Exponentを使います。

126

すべて2でべき乗なのでScalarノードに2を入れてそれぞれのPowerへ繋ぎます。
Zだけ1を足してからべき乗なので、Addを使用して1を足します。
その次は3つの計算結果を足します。
Addノードを使うのですが、XとYは普通につなぎますが、ZはNewへノードをぽちっともっていくと、Value3が現れます。

127

そしてその結果を、SQRT、これは平方根ですね。
これはそのまま、Square Rootを使います。Math > Basicの中にあります。

128

最後に2をかけてMの出来上がりです!!

129

そしてUVWを作ります。
RのX、RのYをそれぞれMで割って、0.5を足します。

130

Math > Basic > Divide by Scalarを2つとってきて、一番最初のベクターをスカラーに分解した、XとYをびよーんと引っ張ってきて繋ぎます。
そしてDivide byポートにMの結果を繋ぎます。
次にAddノードを2ことってきて、Divideの結果につなぎ、0.5をScalarノードで足します。

さいごにConversion > Scalar to 3D Vectorを使用して、Xの結果とYの結果を繋ぎます。
WはゼロなのでScalarの0を繋いで視認しやすくしておきます。(慣れてきたら特に必要ないでしょう。)

131

はい。
これでやっと球面環境マップのUVの計算が完成しました。
どうですか?疲れましたか?

この時点のものをSetDataのUVWへ繋いで見ましょう。

132

一見して環境マップが完成しているようですが、カメラを回すとあれあれ。
環境マップがカメラの位置にあわせて変化してしまいます。

141
146

これはRTシェーダ風にいうとワールド空間で計算されているため、環境マップのXYZ+-方向がちゃんと再現されているためです。
ですが球面環境のようなタイプだと、Zプラス方面から見た場合はきれいになるのですが、Zマイナス方向からみたらテクスチャのピクセルが潰れた外側で反射の絵を表現するため、いがんだり潰れたりします。
そのため、カメラの回転に対してビルボードのようについてくる環境マップとして表現されることになります。
※キューブマップ等を使用するのであればこれで良いんですけどね・・・。

何をすれば良いかというと、これもリアルタイムシェーダで言うところのワールド座標系からビュー座標系に変換するといったことをします。
この場合何をビュー座標系に変換するのかと言うと、反射ベクトルの出力結果です。

133

ここです

さて、やっぱり例によってXSIのICEノードにビュー座標系なんてあるわけも無く、自分でまた作成しなければいけません・・・。
しかし、難しく考えることはありません。
XSIはカメラそのものがオブジェクトとして存在しているので、それを利用してMatrixを作ってしまいましょう。
一番左のCameraNameのOutPutから空のGetDataノードを繋ぎ、Kine.global.eulerを設定します。※エクスプローラー上ではGlobal Transform > Ori > Eulerとなっています。
次にConversion > SRT to Matrixを取り出し、EulerのValueをRotationに繋ぎます。
結果のMatrixをMatrix > Multiply Vector by Matrixに繋ぎます。
そしてReflectと3D Vector to Scalarの間に挟みます。

138

折角なのでViewMatrixコンパウンドも作っておきましょう。
上の赤の四角内を選択してコンパウンドです。Inの名前をin_CameraNameとしてOutの名前をout_Matrixとします。

139

 < fmt_XSI ViewMatrix from Camerav0.6ダウンロード > 

これでどうでしょう?カメラを回しても画像が回ったりしない環境マップが出来ました。

136
147

カメラを回しながらテクスチャエディタを開いてUVを眺めてみましょう。
UVが面白いことになっていますよ。w
環境マップのUVってこんな風になっているんですね・・・。

142

今回のICE実験でもわかるように、球面環境マップというのはカメラに向かって法線が水平であればあるほど、
UVの中心へ、法線が倒れていれば入るほどUVは外側へと向かっていることがわかりやすくなったと思います。

143

※この場合の法線がカメラから反対方向を向いているものは、そもそもカメラには写りませんので無視です。
カメラに対して横からの視点で見られるというのも新鮮ですね。
最後に以下の画像の四角で囲った部分をコンパウンドにしたデータをダウンロードできるようにしておきます。

148

 < fmt_SphereEnvironment UVsダウンロード > 

●ここで使用した環境マップ用のテクスチャは、本ページのマスターでもあるRitaroさんより提供していただきました。
ありがとうございます。



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

Daikin CG News お申し込み

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

Twitter

ページの先頭へ