<< TOP



XSI ICE活用 UVデータ
:UV(TextureProjection)2
このドキュメントは


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



UVデータにコンバート編 2
前回のUVデータ編ではランバートと、環境マップのUVをやりました。
今回はランバートの応用でスペキュラと、リアルタイムに見れるだけではない、レンダリングへの適用手段の一つを紹介したいと思います。

 1.データの準備
準備するデータは前回同様UVデータです。
慣れて来た、もしくはそのままのデータが存在する方はここは飛ばしてください。

オブジェクトを選択して、取得>プロパティ>テクスチャプロジェクション>新規プロジェクションの作成 と選択します。
ダイアログが開きますが、どうせICEでパラメータを与えるのでデフォルトのままでOKを押します。
 087
 088 089
上図の左のようにオブジェクトに緑色の枠が表示されます。
エクスプローラーで確認すると、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.テクスチャシェーディング:ス ペキュラーバージョンと訂正
まず始めに、1で準備したICEのSet DataのUVsのポートにConversion>Scalar to 2D Vectorを繋ぎます。
 iceuv2_image001.jpg
そしてスペキュラーのICEは、以前作成したLambertShaderを基に、変更する形で作成します。
※ローカルにない方はこちらからダウンロードしてください。
fmt_LambertShader v0.6 ダウンロード

ユーザーフォルダの\Data\Compounds(例:C:\users\ユーザー名\Softimage\XSI_7.01\Data\ Compounds)にコンパウンドが保存されていれば、
ICE Preset Manager(IceTreeの左側)のColor>にfmt_LambertShaderが表示されているはずなので、それをツリービュー内に ドラッグアンドドロップ
してください。
出現していない方は、上のDLしたファイルを解凍し、fmt_LambertShader.0.6.xsicompoundをSoftimageのICE ツリービューへドラッグアンドドロップでも
大丈夫です。
 iceuv2_image002.jpg
とりあえずコンパウンドが赤いままだと落ち着かないので前回同様に、 Get Dataでライトを接続してあげてください。
 iceuv2_image003.jpg
次に
fmt_LambertShaderのScalarポートを Scalar to 2D Vectorに繋ぎます。
 iceuv2_image004.jpg iceuv2_image005.jpg
ここで前回と同じLambertのトゥーンマップが再 現できます。
ですが、とあるブログで指摘されていました。このままの状態ですと、オブジェクトを動かすとあれあれ?
 iceuv2_image006.jpg
シェーディング用のUVがオブジェクトの移動についていきません。
今回はここの修正から入ります。

それではこの
fmt_LambertShaderを右クリックし、 メニュー一番上のコンパウンドの編集で、コンパウンドの中に入ります。
問題はここの、Get Dataのglobal座標をMatrixとして渡している部分です。
これですと、Globalの位置がMatrixとして渡されてしまうので、法線情報に対して位置情報がかかってしまいます。
 iceuv2_image007.jpg
申し訳ありません。m(_ _)m それでは以下修正です。

まず、GetDataを用意し、ノードをダブルクリックでプロパティを開き、GetDataのボックスに「Self」と入力してからExplorlerボ タンをピックしてください。
こうすることで、シーン全体からオブジェクトをエクスプローラー上で探しに行く手間を省けます。(左:Self有り 右:Self無し)
 iceuv2_image008.jpg iceuv2_image009.jpg
そして上記エクスプローラーからSelf/Kinematics/Global Transform/Ori/Eulerと降りて行き
Euler をピックします。
 iceuv2_image010.jpg

次にConversionからSRT to Matrixを取得して上記GetDataから接続します。
 iceuv2_image011.jpg
このとき、
SRT to Matrixの出力ポートが黒く、未認識された状態になっています。
これはMatrixの型が定まっていないということなので、(ボクは3×3Matrixなの?4×4Matrixなの?)Math>Matrixか ら3×3か4×4Matrixを繋いで、
型を定義してあげる必要があります。
たとえばすでに法線ベクトルを計算するために繋がっている、Multiply Vector by Matrixが4×4Matrixになっているので、
4× 4Matrixを間に介して
繋ぐとすんなり繋がります。
ここは余分なノードだと思われがちですが、プログラムでは「型を定義」という行為は実は重要な意味を成しているので、ある意味納得のいく接続となります。
※将来的にここがフレキシブルになりかねないので、現バージョンのみかもしれませんがゥァ」
 iceuv2_image012.jpg
ここまでつなぎ終わった時点で、移動させていた上記オブジェクトのシェーディングがぴったり収まったと思います。
 iceuv2_image013.jpg
ここまでが前回の
fmt_LambertShaderの訂正点とな りますので、以下にコンパウンドを再公開しておきます。
fmt_LambertShader v0.7 ダウンロード

それではスペキュラの作成に入ります。
スペキュラの計算方式はいくつかありますが、今回は一番式が簡単そうな、Blinn-Phongモデルを選択します。
ライトベクトルと視線ベクトルの丁度半分を計算して、その角度をスペキュラ反射とするのが
Blinn -Phongモデルです。
ceuv2_image014.jpg
ハー フベクトル:H
視線ベクトル:V
ライトベクトル:L
とした場合
H = V + L
ということになります。簡単ですね。

まずは、視線ベクトルの作成です。
前回の環境マップUVとは違う方法で視線ベクトルを求めてみましょう。
カメラの位置と各頂点の位置を引くことで求められる視線ベクトルです。

カメラのGetDataはコンパウンドの外に出したいので、コンパウンド内ではGetDataにKine.global.posとだけ入力して、外部公開 入力からIn Nameポートに繋ぎ、
入力ポート名を(Vector Lightと合わせて)Vector Cameraとして、ポート名を
Vector Lightの下まで移動させました。
 iceuv2_image015.jpg
一回コンパウンド編集から抜けて、外に出ます。
そしてGetDataにシーン内にいるCameraをセットしてOut Nameをコンパウンドの新しいポートのVector Cameraに繋ぎます。
 iceuv2_image016.jpg iceuv2_image018.jpg
コンパウンド内に戻るとノードが青く、データが来ていることが確認できますので、次は頂点座標データツリーを作成します。
ほぼここは、法線データの取得部分と同じで、GetPointNormalがGetPointPositionに変わります。
ユーザー頂点というのが存在しないので、First Validノードが存在しません。
 iceuv2_image017.jpg
上二種類のカメラ位置と頂点位置をMath>Basic>Subtractで引き、Vector>Normalizeで正規化します。
この結果が視線ベクトルです。
 iceuv2_image019.jpg
もうすでにライトベクトルはこのコンパウンドの中にありますので、
H = V + Lを再現します。
上の結果とライトベクトルをMath>Basic>Addを使って足し、ハーフベクトルを求めます。
その結果と法線ベクトルの内積をもってスペキュラーのスカラーが求められます。
※Dot Productはすでにコンパウンド内にあったものを再利用します。
 iceuv2_image020.jpg
あとはDot Productの先ですが、Rescaleのみクランプにチェックを入れて、Target Endを0.999に設定してください。
スペキュラは輝度値の勾配が強くなるので、出来るだけ輝度1にならないように設定する必要があります。
 iceuv2_image021.jpg
UVだけではこれで終わりなのですが、折角頂点カラー用にColorにも出力しているので、パワー(減衰)も調整できるようにしましょう。

スペキュラのシェーダ計算式は
S = pow(max(dot(N,H),0),pow値)
となるので、
Dot Productの後にmax()の代わりにMath>Comparison>Maximumを繋ぎ、その後にpow()に相当する Math>Basic>Exponentを繋ぎます。
 iceuv2_image022.jpg
後はスペキュラーカラーと掛けるので、Multiply Color by Scalarをそのまま使い、外部公開のカラーをSpecular Colorとします。
こんかいはアンビエントはいらないのでアンビエントを削除し、Add Colorノードも省きました。
 iceuv2_image023.jpg
ExponentのPowerを外部公開に出力してPowerとします。
この値が頂点カラーの場合はスペキュラの減衰値になります。
 iceuv2_image024.jpg

変わって、UVに設定したテクスチャシェーディングの場合はテクスチャにグラデーションなどでスペキュラの減衰値と出来るわけです。

iceuv2_image025.jpg
image105.jpg
右図のテクスチャを使用すると左図のようになります。
 iceuv2_image026.jpg
今回のスペキュラーシェーダも以下リンクでダウンロードできるようにしておきます。

fmt_SpecularShader v0.5 ダウンロード


 3.レンダリング設定例
ここまでの3シェーダを使って、レンダリングをするため のレンダーツリー設定例を紹介したいと思います。

まずはデータの準備から。
適当にオブジェクトを作成してTextureProjectionを3つセットします。(今回はTorusを選んでみました)
オブジェクトの名前は「torus_toon」とし、TextureProjectionのタイプは何でもかまいません。
 iceuv2_image027.jpg
そしてそれぞれのTextureProjectionにSetDataするICEツリーを構成します。
下図ではGetDataをひとつで名前をSelfだけにして、Out NameをSetDataにそれぞれ繋ぐことで、SetData内でいちいちSelfを入力するのを省けています。
手順はまずGetDataのSelfを先に用意して、Out NameをSetDataのIn Nameへそれぞれ繋ぎます。
その後、SetDataのExplorlerボタンから各TextureProjectionのUVsを選択し、設定します。
 iceuv2_image029.jpg

このツリーへ、今まで作った「
fmt_LambertShader」「fmt_SpecularShader」 「fmt_SphereEnvironment UVs」を取り出します。
fmt_LambertShader」「fmt_SpecularShader」 はScalarからUVs(2DVector)に繋ぐのでScalar to 2D Vectorを介します。
シェーディンググラデーションを描く方向は横が見やすいと思いますので、Xポートのみに繋ぎます。
 iceuv2_image030.jpg

今回はトゥーンのものとソフトシェーディングの両方を作ってみたいので、上までのTorusをもう一個複製して、「torus_soft」とリネームしま す。
 iceuv2_image028.jpg
ここまででUVの準備は出来ました。
次はテクスチャの用意です。

まずはシェーディングテーブルから・・・
toon用テクスチャ
soft用テクスチャ
ランバート
toon_lambert.jpg
soft_lambert.jpg
スペキュラ
toon_specular.jpg
toon_specular_a.jpg
soft_specular.jpg
スペキュラテクスチャはtoon側はアルファを用意して(左下枠下側)、アルファブレンドできるように用意します。
soft側はRGBで一度に黒から色へのグラデーションを描きます。
※解説は後ほど、レイヤーセッティングのところと同時に・・・。

次は環境マップ用
toon用テクスチャ soft用テクスチャ
toon_environment.jpg
toon_environment_a.jpg
soft_environment.jpg
環境マップの方もスペキュラと同様にtoonとsoftで違う状態のものをそれぞれ用意します。

オブジェクトにそれぞれコンスタントでカラーが白のマテリアルを割り当て、それに接続していきます。
 iceuv2_image031.jpg

まずはtoonから。

レイヤーをConstantに三つ追加して、テクスチャをそれぞれ放り込んで繋ぎます。
それぞれのImageノードで設定するUVは、上でICEコンパウンドを繋いだ役割にあわせて設定します。
今回の場合LambertはTextrue_Projection、Specularは
Textrue_Projection1、 環境マップはTextrue_Projection2です。
 iceuv2_image032.jpg
そして各レイヤーを、すべてColorポートのレイヤーに設定します。
領域レンダリングで結果を確認すると、このような状態になっていると思います。
 iceuv2_image033.jpg iceuv2_image034.jpg

各レイヤーの設定を以下のようにします。※左からLambert用、Specular用、環境マップ用
ウェイトがレイヤー作成時には0.5になっているのですべて1.0にします。
モードはすべてオーバーにします。※通常のスペキュラは加算なのですが、トゥーンの場合スペキュラはアルファブレンディングにすると結構それっぽくなりま す。
スペキュラと環境マップはマスクモードを入力のアルファを使用にして、それぞれのテクスチャの持っているアルファをブレンドに使用することにします。
結果、環境マップが強すぎるように感じたのでウェイトモードを下げました。
 iceuv2_image035.jpg
結果はこんな感じになりました。
見やすいように、
ライトの向きを少し変えてあります。
 iceuv2_image036.jpg

ちょっとシェーディングテーブルの色が良くないので以下のように変更しました。
スペキュラのサイズであるアルファも調整してあります。
toon_lambert2.jpg
toon_specular2.jpg
toon_specular_a2.jpg
 iceuv2_image037.jpg
結果はこんな感じです。

・・・もうすこしLambertのシェーディングテーブルをいじってみましょう。

 toon_lambert3.jpg
例えばこのように反射光的な効果を入れて見ます。
すると、シェーディングでも効果が出ます。
調整しだすときりがないので、ここでとめておきますが、シェーディング調整の参考ということで・・・。
 iceuv2_image038.jpg

では次はSoftシェーディングです。
レンダーツリー上の構成はtoonと同じで、レイヤーのブレンド設定が変わります。

スペキュラと環境マップはブレンドモードをオーバーではなく、プラスに変更します。
下のレイヤーの色に対して色を加算するという設定です。
 iceuv2_image039.jpg
すると、このようになります。
通常のシェーディングのようですね??
 iceuv2_image040.jpg

たとえば、マテリアルのPhongのデフォルトのようにシェーディングの色味を設定すると・・・
soft_lambert2.jpg
soft_specular2.jpg

このようになります。
 iceuv2_image041.jpg

シェーディングがサーフェイスの裏側へ回り込むハーフランバートなんていうのも・・・
  soft_lambert3.jpg

いとも簡単に実現できてしまいます。
  iceuv2_image042.jpg


今回は環境マップもついでに付けてみましたが、スペキュラとランバートのセットを用意すると、
シェーディングテーブルの実験がとてもしやすくなると思います。

それでは今回使用したシェーディングのテクスチャをダウンロードできるようにしておきますので、
参考にしていただければ・・・。

シェーディングテーブル テクスチャダウンロード
 iceuv2_image043.jpg


 4.おまけ...
さらに実用例があると面白いかと思い、ユーザーノートの Ritaroさんより「絵美さん」モデルをお借りして、それにレンダリング設定を加えてみました。
 Kaosample
顎を引き、ニコリと笑って、スマイル。
顔の肌と髪の毛にこのICEを使ったシェーディングを利用しています。

シェーディング用のテクスチャはこんな感じ。
■肌
emi_toon_lambert.jpg
emi_toon_specular.jpg
emi_toon_specular_a.jpg

■髪
emi_toon_lambert_Hair.jpg
emi_toon_lambert_Hair.jpg
emi_toon_specular_Hair_a.jpg

レンダーツリー
ベースのテクスチャはすでに使用されていたもの、シェーディングのマスク用の頂点カラーも設定されていたものを使用しています。
■肌
 iceuv2_image044.jpg
各レイヤーの設定
 iceuv2_image046.jpg
■髪
 iceuv2_image045.jpg
  iceuv2_image047.jpg

ICEの構造は基本的に上までと同じものですが、髪の毛のスペキュラだけ、ライトを個別に持っています。
頭に対して垂直に真下に向かうライトを固定で持ちます。
 iceuv2_image048.jpg
こうすることで物理的には正しくありませんが、異方性スペキュラのような手書きのイメージで狙いやすい効果を出すことが出来ます。
 atama.jpg

以上、ここまでのものはただの一例ですので、皆様の好きなシェーディングを再現してみてください。



 5.First Valid について
このページで使っているfmt_LambertShader コンパウンド等を見て、気になった方もおられるかと思います。
 ceuv2_image049.jpg
このノードはXSIヘルプの文章をそのまま引用すると、

First Validノードは、ツリーブランチに接続されている入力ポートの中で、エラーが発生していない最初のものを通過させます。その他の入力ポートは、すべて 無視されます。
と、書いてあります。
つまり、このノードの上に繋がっているポートから順にエラーが出ていないものを優先的に出力ポートに送る。
という意味なんです。

上の画像(
fmt_LambertShaderコンパウンド)の場合、もしモデルにユー ザー法線(User_Normal_Property)がセットされていたら、そこから法線を取ってきて、
繋がっていなければ、下段のPointNormalを取得して次に送る。といった処理を行います。

FirstValidはユーザー法線があるかないか、使用する人のモデルによって異なり、こちらからはわからない場合のエラー回避処理として使用できま す。

スクリプトでよく使う、「~データがあるかないかを調べてあったら処理をする」というものに良く似ています。
コンパウンドの公開時に使用しているとちょっと親切ですね。

 
<前 へ
次へ>