« 更にXPressoでくり返し | トップページ | C4D XPresso「値を記憶」ノードで遊んでみる。 »

C4D XPressoの「光線の衝突」ノードで遊んでみる。

「光線の衝突」と名前が付いているが、ベクトルとポリゴンの交点を検出するノードです。
今回は、「光線の衝突」ノードを使って、こんなイメージのアニメーションを作ってみる。

手書き風というわけではありません。

かなり前に、ちょっと使ったことがある程度なので、うまく使えるだろうか…
今回は、ファイルを保存するのでR9.5です。
レーザー光線がオブジェクトに当たって、当たった位置からパーティクルを飛ばしてみます。

それでは、ヌルオブジェクトを追加してXPressoを添付。
新規ノード/XPresso/一般/「光線の衝突」ノードを追加。
とりあえず、出力「衝突位置」を追加。

Raycollision_01
Raycollision_02

この「光線の衝突」ノードは、「光線の開始」位置から「光線の終了」位置までの直線上のポリゴンオブジェクトの交点を「衝突位置」から出力します。交点がある場合は「衝突判定」からTRUEを出力します。
ただし、「光線の衝突」ノードの属性の「テストのみ」のチェックをはずさないと、「衝突位置」が出力されません。

では、レーザー光線をロフトNURBSと2個の円形スプライン(半径10、XY平面)で作成。
1個目の円形はロフトNURBSの原点、もう1個の円形は+Z軸上2000くらいの位置に配置。「光線の衝突」ノードの「光線の開始」はロフトNURBSののグローバル座標、「光線の終了」はロフトNURBSのグローバル座標に(0.0 , 0.0 , 2000.0)を足した値。

Raycollision_03

Raycollision_04

ロフトNURBSはスケーリングしない事を前提に、グローバルマトリクスのZ軸ベクトル(長さ1.0)を2000倍し、ロフトの絶対位置に足した値を、光線の衝突ノードの「光線の終了」に入力。

次に「立方体」を追加し、編集可能(ポリゴン化)にします。適当にロフトNURBSの真ん中あたりに配置します。

Raycollision_05
Raycollision_06

立方体をXPressoに追加し、「光線の衝突」の入力「オブジェクト」に連結します。
これで、既に「衝突位置」が出力されています。
ただし、衝突していないときは「光線の衝突」に入力されたオブジェクトのグローバル座標が出力されます。
仮に、ロフトNURBSの原点ではないほうに配置した円形スプラインを衝突位置と連結して確認します。

Raycollision_08
Raycollision_07

連結したら、いきなり短くなりました。
ならなかった場合は、「光線の衝突」ノードの属性の「テストのみ」のチェックが外れているか確認してください。

ロフトNURBSを上下に動かしてみてください。立方体から外れそうになると立方体の真ん中に伸びているのがわかります。
この、衝突がなくなったときに、まっすぐになるよう「光線の終了位置」が必要になります。

if (「衝突判定」) out = 「衝突位置」 else out = 「光線の終了位置」

こんな感じのXPressoノードは無いものかと見てみたら、「条件分岐」ノードでできそうな…
条件分岐はC.O.F.F.E.E.のswitch()と同じで複数の入力に対して入力番号を与えると、そのの番号の入力が出力される。
あとは、スイッチに「光線の衝突」の「衝突判定」(ブール値)を入力。ブールはTRUE/FALSEで、ようは1/0というわけです。

Raycollision_09

これでロフトNURBSを上下に動かして確認してください。まともに動作しています。

Raycollision_10

最後にパーティクルエミッタを追加します。
「衝突位置」にパーティクルエミッタの「絶対位置」。
「衝突判定」にはエミッタの「可視性」を連結します。これで衝突している間だけパーティクルを噴出します。
パーティクルの方向は、今回は面倒なのでロフトNURBSの方向になるようターゲットエクスプレッションを使いました。

Raycollision_11

Raycollision_12

今回の説明は、ここで終了します。
後は適当に演出してみてください。
適当に付け加えたらこんな具合になりました。

説明はしませんでしたが、「衝突判定」ノードも使って見ました。
今回のファイルはR9.5「RayCollision.ZIP」です。

|

« 更にXPressoでくり返し | トップページ | C4D XPresso「値を記憶」ノードで遊んでみる。 »

コメント

この記事へのコメントは終了しました。