2008/09/10

Real Time Ambient Occlusion via ICE

0 comment
リアクション: 
うひゃー。とても疲れました。

でも、ワタクシでも出来ました。
リアルタイムアンビエントオクルーヂョン。



めちゃくちゃ苦労しました・・・。
しかも、出来たものは激重・・・。
このシーン2000ポリしか無いんですが、CPUメーターがすぐ70%とか行ってしまいます。
しかも、落ちやすいし・・・。
さらに、VertexColorにコネクト出来ず、WeightMap止まりです。

アルゴリズムの簡略化というものは、奥が深すぎます。
ICE、奥が深すぎます。

しかしながら、AOのアルゴリズムは、比較的簡単です。

あるポイントから、ランダムに複数のレイを飛ばし、その遮蔽率でそのポイントの明るさを決定するものです。

一行で終わるのか・・・orz

なんだけど、CGの世界では、ベクトルが、物に当たるということを表現するのに物凄い労力が必要なのです。
衝突判定の勉強をしていて良かったと思いました。
とはいえ、最適化までは、手が伸びず、挫折しましたけど・・・。

このICEノードで、苦労したところはー

ポイントに対して、どうやって、ランダムレイをジェネレイトするのか。
んー、まったく思いつきませんでした。
それを解決したのは、コレ。

Random Integer
http://community.softimage.com/downloads.php?do=file&id=138

Moduloで、ランダム値を発生させるとは・・・。アメイズィング!ジーニアス!
素晴らしすぎるので、5ツ星を付けてみました。
こういう単純なものって、宝物ですわね。
Halfdan Ingvarsson様に感謝です。

あとは、helge mathee様のTutorial - Arrays in ICE on Vimeoです。


Tutorial - Arrays in ICE from helge mathee on Vimeo.

ArrayのValueをリニアに作ることすら出来なかったワタクシには、とてつもなく参考になりました。
感謝です。ありがとうございます。

XSI7のtrialが、今日切れるので、しばらくお預けですな。
でも、出来てほっとしましたYO!

次は、何作ろうかなー。

2008/09/01

ICE - Deformation Basic

0 comment
リアクション: 
ICEを使った、とても基本的なDeformationです。

現状のバージョンでは、基本的にICEは、Kinematicsに値を入れることは出来なくなっています。
環境変数を変えれば可能ですが、サポート対象外です。なんでかはナゾですが。

ですので、ポイント情報を、ヌルの変換にそのまま追従させる、poseコンストもどきをやってみました。



ICE Treeの構造です。

cubeに、ICE Treeを構築します。
Set Dataに、self.PointPositionをセットします。
Multiply Vector by Matricsノードを繋ぎます。
Get Dataノードに、self.PointPositionをセットし、上記ノードのvectorに接続します。
別のGet Dataノードに、null.kine.localをセットし、Matrixに接続します。



以上で、nullの動きを伝えるICE Treeが完成です。

次に、WeightMapを利用して、2つのnullをコントローラーとした
Envelopeの基本のICE Treeです。



Set Dataにself.PointPositionをセットします。
Multiply Vector by Matrixに接続します。
Get Dataノードに、self.PointPositionをセットし、上記ノードVectorに接続。
Linear Interpolateノードを取得し、MVbMのMatrixに接続します。
上記ノードのFirstにGet Dataノード、null.kine.localを接続します。
SecondにGet Dataノード、null1.kine.localを接続します。
Blendに、Get Weight Map Valueをつなげれば、完成です。



多分、これをたーくさん増やしていけば、ICE Envelopeが完成するはずです。
でも、面倒なので、やってません・・・。
ハッキリ言って、Compounds待ちです。そこまで、頭良く無いのです。残念ながら・・・。
Dual Quaternionが待ち遠しいなぁ。

早く登場しないかなー。