CG・コンテンツ制作
  1. CG・コンテンツ制作トップ
  2. DAIKIN CG Channel
  3. UsersNotes
  4. ICE
  5. XSI ICE活用 UVデータ :UV(TextureProjection)2
SUITE USERS NOTES
XSI ICE活用 UVデータ
:UV(TextureProjection)2

このドキュメントは

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

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


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.テクスチャシェーディング:スペキュラーバージョンと訂正

まず始めに、1で準備したICEのSet DataのUVsのポートにConversion>Scalar to 2D Vectorを繋ぎます。

iceuv2_image001

そしてスペキュラーの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

とりあえずコンパウンドが赤いままだと落ち着かないので前回同様に、Get Dataでライトを接続してあげてください。

iceuv2_image003

次に fmt_LambertShader の Scalarポートを Scalar to 2D Vectorに繋ぎます。

iceuv2_image004iceuv2_image005.jpg

ここで前回と同じLambertのトゥーンマップが再現できます。
ですが、とあるブログで指摘されていました。このままの状態ですと、オブジェクトを動かすとあれあれ?

iceuv2_image006

シェーディング用のUVがオブジェクトの移動についていきません。
今回はここの修正から入ります。

それではこの
fmt_LambertShaderを右クリックし、メニュー一番上のコンパウンドの編集で、コンパウンドの中に入ります。
問題はここの、Get Dataのglobal座標をMatrixとして渡している部分です。
これですと、Globalの位置がMatrixとして渡されてしまうので、法線情報に対して位置情報がかかってしまいます。

iceuv2_image007

申し訳ありません。m(_ _)m それでは以下修正です。

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

iceuv2_image008iceuv2_image009.jpg

そして上記エクスプローラーからSelf/Kinematics/Global Transform/Ori/Eulerと降りて行き Euler をピックします。

iceuv2_image010

次にConversionからSRT to Matrixを取得して上記GetDataから接続します。

iceuv2_image011

このとき、SRT to Matrixの出力ポートが黒く、未認識された状態になっています。
これはMatrixの型が定まっていないということなので、(ボクは3×3Matrixなの?4×4Matrixなの?)Math>Matrixから3×3か4×4Matrixを繋いで、型を定義してあげる必要があります。
たとえばすでに法線ベクトルを計算するために繋がっている、Multiply Vector by Matrixが4×4Matrixになっているので、4×4 Matrix を間に介して繋ぐとすんなり繋がります。
ここは余分なノードだと思われがちですが、プログラムでは「型を定義」という行為は実は重要な意味を成しているので、ある意味納得のいく接続となります。
※将来的にここがフレキシブルになりかねないので、現バージョンのみかもしれませんがゥァ」

iceuv2_image012

ここまでつなぎ終わった時点で、移動させていた上記オブジェクトのシェーディングがぴったり収まったと思います。

iceuv2_image013

ここまでが前回の fmt_LambertShader の訂正点となりますので、以下にコンパウンドを再公開しておきます。

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

それではスペキュラの作成に入ります。
スペキュラの計算方式はいくつかありますが、今回は一番式が簡単そうな、Blinn-Phongモデルを選択します。
ライトベクトルと視線ベクトルの丁度半分を計算して、その角度をスペキュラ反射とするのが Blinn-Phong モデルです。

ceuv2_image014

ハーフベクトル: H
視線ベクトル: V
ライトベクトル: L
とした場合
H = V + L
ということになります。簡単ですね。


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

カメラのGetDataはコンパウンドの外に出したいので、コンパウンド内ではGetDataにKine.global.posとだけ入力して、外部公開入力からIn Nameポートに繋ぎ、
入力ポート名を(Vector Lightと合わせて)Vector Camera として、ポート名を Vector Light の下まで移動させました。

iceuv2_image015

一回コンパウンド編集から抜けて、外に出ます。
そしてGetDataにシーン内にいるCameraをセットしてOut Nameをコンパウンドの新しいポートのVector Cameraに繋ぎます。

iceuv2_image016iceuv2_image018.jpg

コンパウンド内に戻るとノードが青く、データが来ていることが確認できますので、次は頂点座標データツリーを作成します。
ほぼここは、法線データの取得部分と同じで、GetPointNormal が GetPointPosition に変わります。
ユーザー頂点というのが存在しないので、First Validノードが存在しません。

iceuv2_image017

上二種類のカメラ位置と頂点位置をMath>Basic>Subtractで引き、Vector>Normalizeで正規化します。
この結果が視線ベクトルです。

iceuv2_image019

もうすでにライトベクトルはこのコンパウンドの中にありますので、

H = V + Lを再現します。
上の結果とライトベクトルをMath > Basic > Addを使って足し、ハーフベクトルを求めます。
その結果と法線ベクトルの内積をもってスペキュラーのスカラーが求められます。
※Dot Productはすでにコンパウンド内にあったものを再利用します。

iceuv2_image020

あとはDot Productの先ですが、Rescaleのみクランプにチェックを入れて、Target Endを0.999に設定してください。
スペキュラは輝度値の勾配が強くなるので、出来るだけ輝度1にならないように設定する必要があります。

iceuv2_image021

UVだけではこれで終わりなのですが、折角頂点カラー用にColorにも出力しているので、パワー(減衰)も調整できるようにしましょう。

スペキュラのシェーダ計算式は
S = pow(max(dot(N,H),0),pow値)
となるので、
Dot Productの後にmax()の代わりにMath>Comparison>Maximumを繋ぎ、その後にpow()に相当する Math>Basic>Exponentを繋ぎます。

iceuv2_image022
後はスペキュラーカラーと掛けるので、Multiply Color by Scalarをそのまま使い、外部公開のカラーをSpecular Colorとします。
こんかいはアンビエントはいらないのでアンビエントを削除し、Add Colorノードも省きました。
iceuv2_image023
ExponentのPowerを外部公開に出力してPowerとします。
この値が頂点カラーの場合はスペキュラの減衰値になります。
iceuv2_image024

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

iceuv2_image025
iceuv2_image105

右図のテクスチャを使用すると左図のようになります。

iceuv2_image026

今回のスペキュラーシェーダも以下リンクでダウンロードできるようにしておきます。

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


3.レンダリング設定例

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

まずはデータの準備から。
適当にオブジェクトを作成してTextureProjectionを3つセットします。(今回はTorusを選んでみました)
オブジェクトの名前は「torus_toon」とし、TextureProjectionのタイプは何でもかまいません。

iceuv2_image027

そしてそれぞれの TextureProjection に SetData する ICEツリーを構成します。
下図では GetData をひとつで名前をSelfだけにして、Out Name を SetData にそれぞれ繋ぐことで、SetData内でいちいちSelfを入力するのを省けています。
手順はまず GetData の Self を先に用意して、Out NameをSetData の In Name へそれぞれ繋ぎます。
その後、SetData の Explorler ボタンから各TextureProjection の UVs を選択し、設定します。

iceuv2_image029

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

iceuv2_image030

今回はトゥーンのものとソフトシェーディングの両方を作ってみたいので、上までのTorusをもう一個複製して、「torus_soft」とリネームします。

iceuv2_image028

ここまででUVの準備は出来ました。
次はテクスチャの用意です。

まずはシェーディングテーブルから・・・

toon用テクスチャ soft用テクスチャ
ランバート
toon_lambert
soft_lambert
スペキュラ
toon_specular
toon_specular_a
soft_specular

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

次は環境マップ用

toon用テクスチャ soft用テクスチャ
toon_environment
toon_environment_a
soft_environment

環境マップの方もスペキュラと同様にtoonとsoftで違う状態のものをそれぞれ用意します。

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

iceuv2_image031

まずはtoonから。

レイヤーをConstantに三つ追加して、テクスチャをそれぞれ放り込んで繋ぎます。
それぞれのImageノードで設定するUVは、上でICEコンパウンドを繋いだ役割にあわせて設定します。
今回の場合LambertはTextrue_Projection、Specularは

Textrue_Projection1、環境マップは Textrue_Projection2 です。

iceuv2_image032

そして各レイヤーを、すべてColorポートのレイヤーに設定します。
領域レンダリングで結果を確認すると、このような状態になっていると思います。

iceuv2_image033 iceuv2_image034

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

iceuv2_image035

結果はこんな感じになりました。
見やすいように、ライトの向きを少し変えてあります。

iceuv2_image036

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

toon_lambert2
toon_specular2
toon_specular_a2
iceuv2_image037

結果はこんな感じです。

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

toon_lambert3

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

iceuv2_image038

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

スペキュラと環境マップはブレンドモードをオーバーではなく、プラスに変更します。
下のレイヤーの色に対して色を加算するという設定です。

iceuv2_image039

すると、このようになります。
通常のシェーディングのようですね??

iceuv2_image040

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

soft_lambert2
soft_specular2

このようになります。

iceuv2_image041

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

soft_lambert3

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

iceuv2_image042

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

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

 < シェーディングテーブルテクスチャダウンロード > 

iceuv2_image043

4.おまけ...

さらに実用例があると面白いかと思い、ユーザーノートの Ritaroさんより「絵美さん」モデルをお借りして、それにレンダリング設定を加えてみました。

Kaosample

顎を引き、ニコリと笑って、スマイル。
顔の肌と髪の毛にこのICEを使ったシェーディングを利用しています。

シェーディング用のテクスチャはこんな感じ。

■肌

emi_toon_lambert
emi_toon_specular
emi_toon_specular_a

■髪

emi_toon_lambert_Hair
emi_toon_lambert_Hair
emi_toon_specular_Hair_a

レンダーツリー
ベースのテクスチャはすでに使用されていたもの、シェーディングのマスク用の頂点カラーも設定されていたものを使用しています。

■肌

iceuv2_image044

各レイヤーの設定

iceuv2_image046

■髪

iceuv2_image045
iceuv2_image047

ICEの構造は基本的に上までと同じものですが、髪の毛のスペキュラだけ、ライトを個別に持っています。
頭に対して垂直に真下に向かうライトを固定で持ちます。

iceuv2_image048

こうすることで物理的には正しくありませんが、異方性スペキュラのような手書きのイメージで狙いやすい効果を出すことが出来ます。

atama

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


5.First Valid について

このページで使っている fmt_LambertShader コンパウンド等を見て、気になった方もおられるかと思います。

ceuv2_image049

このノードはXSIヘルプの文章をそのまま引用すると、

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

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

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

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



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

Daikin CG News お申し込み

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

Twitter

ページの先頭へ