|
●UVデータにコンバート編 |
1.データの準備 |
今回は頂点カラーではなく、UVデータをオブジェクトに適用します。 上図の左のようにオブジェクトに緑色の枠が表示されます。 Texture_Supportは要りません。 MCP右側のEdit > フリーズMを押す等して UVは頂点カラーよりも深いところにあります。 UVs です。 ICEツリー上はこのようになります。 |
2.テクスチャシェーディング |
UV値も数値で表すことが出来ます。(いまさらと言われるかもしれませんが) これを意識すると、XSIのNoicon.picって良く出来たテクスチャだなぁと実感します。 これはUもVもすべての頂点に対して0が与えられたという状態です。 < fmt_LambertShader v0.5 ダウンロード > もう一度fmt_LambertShader_v0.5を引っ張り出してきて、ICETreeビューで開いてみましょう。 これでほっと一息。 ここでDot Product(内積)を使ってライトベクトルと法線ベクトルを計算し、サンプルごとに-1~1の数値が取得できている部分があります。 Math > Basic > Rescale を取り出して、Dot ProductのResultを Rescale のValueに繋ぎます。 後はこの0~1にしたScalarデータのResultをOutPutの●までドラッグしてResult1とします。 わかりやすくするために、それぞれのResultの上で右クリックして、名前を変更しましょう。 そして、ツリービューの左上にある×をクリックしてコンパウンド編集を閉じます。 これでコンパウンドのOutポートにColorとScalarの二つのポートが出現しました。 このScalarのほうのポートをConversion > Scalar to 2D VectorのXに繋ぎます。 マテリアルをコンスタントにして、Colorに繋いだテクスチャのImageNodeにSetDataのTexture_Projectionを設定すると、このような状態になるのを確認します。 ・・・でもこれだけだと何がしたいのかわかりませんね? たとえばこんな感じの、左が暗く、右が明るい色です。 これは内積の結果をUVに変換して、0~1の数値として出力される結果ということになります。 一番明るいところにおや?とおもうヘソが出来ていると思います。 ちなみにUVをテクスチャエディタで見てみるとこんな感じです。 UV頂点が下のほうにくちゃっとなっています。 |
3.環境マップUV | ||
さてさてお次に挑戦するのは環境マップのUV作成です。 SetDataをダブルクリックして「Explorer」をクリック。 そして環境マップに必要なのは、環境マップは鏡面反射なので反射ベクトルを計算する必要があります。 式はこんな感じ。
こいつをICEツリーで作っていけば良いわけです。 ( N ・ V ) の部分。法線ベクトルと視線ベクトルの内積です。 なので、上で使った < fmt_LambertShader v0.6 > とりあえず、fmt_LambertShaderをICEツリー上にドラッグアンドドロップして、惜しげもなくバコっと展開してしまいます。 そしてこのなかで、今回は色出力ではないのでMultiply Color by ScalarとAdd Colorを削除します。 次にGetDataを取り出して、カメラをピックなどで選んで、Out Nameを赤くなっていたノードのGet.Kine.global.quatに繋ぎます。 Math > Vector > Multiply by Scalarを使用して、内積結果をFactorにつなぎ、ValueにConstant > Scalarを取得してきて2を設定します。 Multiply by Scalarノードにダイレクトに数値を入れれば良いのですが、ツリーからいくつをかけたかこうすると視認することが出来ます。 2 × ( N ・ V ) 2はScalarだったので良いのですが、これから先掛け合わせる値はすべて3次ベクトルになるので、Conversion > Scalar to3D Vectorに繋いでベクトルに変換します。 2 × ( N ・ V ) × N このようにMath > Basic > Multiplyを利用して、内積に2をかけたものにもともと繋いでいた法線ベクトルを再利用する形で、繋いでかけあわせます。 最後にMath > Basic > Subtractを使用して、Multiplyの結果をFirstに、もともとあった視線ベクトルをSecondを繋いで、 V - 2 × ( N ・ V ) × N の完成です。 とりあえず反射ベクトルを作るだけでもツリーがこんなになっちゃって大変なので、コンパウンドでまとめておきましょう。 ここらあたりをガバっとつかんで、コンパウンドへポン! GetDataのカメラは外に出したままにしておきます。 < fmt_Refract Productv0.5ダウンロード > ※このプロダクトノードは、Dot Productなど最初から用意されているものとは入力が違うので動作が異なります。 以前のように頂点カラーを適用し、Float(4バイト)に設定し、ICEはSetDataでその頂点カラーを見に行きます。 カメラのビューをコンスタントにして頂点カラーが見れるようにしてみてください。 これで終わりではありません。
いきなり複雑です・・・ > < つぎはPow。これがべき乗といういみで、括弧ないの左の値を右の値でべき乗するという意味です。 すべて2でべき乗なのでScalarノードに2を入れてそれぞれのPowerへ繋ぎます。 そしてその結果を、SQRT、これは平方根ですね。 最後に2をかけてMの出来上がりです!! そしてUVWを作ります。 Math > Basic > Divide by Scalarを2つとってきて、一番最初のベクターをスカラーに分解した、XとYをびよーんと引っ張ってきて繋ぎます。 はい。 一見して環境マップが完成しているようですが、カメラを回すとあれあれ。 これはRTシェーダ風にいうとワールド空間で計算されているため、環境マップのXYZ+-方向がちゃんと再現されているためです。 ここです 折角なのでViewMatrixコンパウンドも作っておきましょう。 < fmt_XSI ViewMatrix from Camerav0.6ダウンロード > これでどうでしょう?カメラを回しても画像が回ったりしない環境マップが出来ました。 カメラを回しながらテクスチャエディタを開いてUVを眺めてみましょう。 今回のICE実験でもわかるように、球面環境マップというのはカメラに向かって法線が水平であればあるほど、 ※この場合の法線がカメラから反対方向を向いているものは、そもそもカメラには写りませんので無視です。 < fmt_SphereEnvironment UVsダウンロード > ●ここで使用した環境マップ用のテクスチャは、本ページのマスターでもあるRitaroさんより提供していただきました。 |