>   >  スクリプト兵法書 〜MAX Script編〜:Vol.4:スクリプトの具体的な作り方(後編)
Vol.4:スクリプトの具体的な作り方(後編)

Vol.4:スクリプトの具体的な作り方(後編)

後半:影になっていない部分を削除する

先ほどまでは腕慣らしで、ここからが本番です。さて、あるパーティクルがライトから見て、ジオメトリの陰になっているかどうかを判断するにはどうすればよいのでしょうか? この方法は幾つか考えられますが、一番最初に考えられるのはライトマップを生成し、何とかしてパーティクル位置のライトマップの値を取得する方法でしょうか。しかし、これはちょっと考えただけでも何だか面倒くさそうですね。
そこで、ちょっと一工夫します。パーティクルから光源に向かって Ray を飛ばし、Ray がジオメトリと交差するかを判断してみるのです。「Ray を飛ばすって、レイトレースレンダリングするの? 何だか大変そう〜」と思ってしまったかもしれませんが、実は MAXScript には、 Ray とジオメトリの交点を計算する機能があるのです。この機能は覚えておくと、意外な使い道があるんですよ。

Ray 値は、Ray の始点と方向を持ちます。始点を各パーティクルの位置、方向を光源の向きに指定します。位置は直ぐに判りますが、方向はどうやって計算すればいいのでしょうか? ここは、昔々に数学や物理で習った ベクトル を思い出してください。

空間ベクトルの例

(空間)ベクトルの例

上の画像のように、原点を O 、そこから点 A、B に向かうベクトルを各々 A→ B→ とします。その時、B から A へ向かうベクトルは「 A→ - B→ 」になります。ここで A を「光源」、B を「パーティクルの位置」とすれば、光源の位置からパーティクルの位置を引いた値がパーティクルから光源に向かうベクトルとなります。

また、Ray とジオメトリの交点を求めるには「 intersectRayEx 」関数を使用します。 intersectRayEx は引数にジオメトリと Ray を渡すと、レイとジオメトリの交点を返します。ジオメトリと Ray が交差しない場合は undefined を返します。今回は交差するかしないか判定するだけでよいので、undefined かどうかを判断するだけで十分です。処理の内容を分かりやすく図にすると以下のようになります。

Ray とジオメトリの交点の計算概念図

「Ray とジオメトリの交点の計算概念図」。 intersectRayEx 関数を用いて、Ray とジオメトリが交差しない場合は、undefined を返す仕組みになっている

その他の連載