« ポリゴンオブジェクトの指定したポイントから、エッジで繋がっている隣のポイントを取得するノード | トップページ | XPressoで、「スプラインの交点をマークする」ノード…失敗に終わる… »

net検索で、C4Dの「オブジェクト衝突判定」でここに来た人がいるので、XPressoを試してみる。

画面右の「検索フレーズランキング」で、「衝突判定」がランキングに入りました。
C4Dでオブジェクトの衝突判定をするなら、XPressoの「衝突判定」ノードを使うことになる。

一般ユーザ(自分も含めて)は、物理的、数学的、プログラミング的に衝突処理が難しいだろう。
「衝突判定」(オブジェクトが重なっているか?)ではなく、「衝突処理」(オブジェクトのめり込み防止や反射)を自動で処理してほしいと思うだろう。
オブジェクトが重なっている事が判っても、どうして良いのか分からないよね?
DynamicsやMoccaモジュールがあれば、クロスシミュレーション等が数値入力である程度簡単にできるわけだけど…

では、物理的、数学的、プログラミング的に足りない自分の脳ミソで考えてみます…

XPressoの「衝突判定」ノードから、何を得ることができるのだろう?

入力は、オブジェクト(ポリゴンオブジェクトのみ)、衝突検知距離。
出力は、「衝突タイプ」の条件下で出力されるもの、されないものがある。

下の表はR9マニュアルの「衝突判定」ノードの項目の文章を簡単に表にまとめました。
衝突判定は、全ての衝突タイプに対応しています。(当たり前か…)

境界ボックス オブジェクト 距離 許容値
衝突判定 重なりの有無
ポリゴン番号 × × × 交わっているポリゴンの最初の番号
ポイント × × × × オブジェクト間の一番短いポイントのローカル座標
距離 × × × 2つのオブジェクトの最短距離

衝突判定ノードで得られるポイントやポリゴンは、どのようなものなのか?
ポイントは、衝突しているとき(衝突判定:TRUE)オブジェクト間の最短のポイント。ポイントといっても、ポリゴンオブジェクトのポイントデータではありません。一番近い地点です。ですから、ポリゴン上だったり、エッジ中、ポイントだったりします。この座標はローカル座標です。

Collision_01
オブジェクトの最短地点

ポリゴンは、ポリゴン同士が交差しているポリゴンの最初のポリゴン番号です。
複数枚の時は、ノードの属性で指定したポリゴン選択タグを捜査して取得する必要があります。
あとは、交差しているポリゴンですから、オブジェクトに完全にめり込んでしまったポリゴンは対象外になります。

Collision_02
交差しているポリゴン

説明は不足しているが、次に進みましょう。
めり込み処理と反射…ですが…
反射と言うのは、オブジェクトが動いていて、ある面に当たって、その法線を対称に跳ね返るわけだよね…

今回は、動いていない「めり込み防止処理」と…

Collision_04

では、ポイント1からポイント2に向かうベクトルを、衝突検知距離から距離を引いた長さに調整し、オブジェクトBの位置に足す。
この処理を衝突判定で衝突を検知したときに実行するようにすれば、めり込むことがなくなるだろう。
でも、衝突検知距離以上に移動させればめり込んでしまいますが…

では、こんなオブジェクトを用意しました。
「マスを左右に動かしても、玉が突き抜けない」ようにしてみよう。

Collision_09

構成は…

Collision_10

最初に、ポイントAからポイントBへ向かうベクトルを任意の長さにスケーリングしてベクトルCにするXGroupを作ってみよう。

Collision_05_2

これが、判定距離にめり込んだときの、オブジェクトBの移動ベクトルになります。

ポイントA,Bは「衝突判定」ノードのポイント1,2を入力。
長さは、衝突検知距離から「衝突判定」ノードの距離を引いた値。

では、衝突判定ノードです。

オブジェクトAとオブジェクトBを判定してオブジェクトBの位置を調整することにします。
オブジェクトA,Bと衝突判定ノードを追加します。
端子は次のように追加します。

Collision_06

オブジェクトA、Bにはグローバルマトリクスを追加します。
これは、衝突判定のポイント1、2にマトリクスを掛けてグローバル座標に変換します。
衝突検知距離は、調整しやすくユーザデータを使うことにします。
検知距離と距離の差を計算する「計算」ノードも追加します。
さらに「マトリクス*ベクトル」を追加しつなげます。

Collision_07

「衝突判定」ノードの衝突タイプは、距離です。

先ほどのポイントAからBに向かうベクトルの長さの調整のXGroupをつなげます。

後半部は、こんな感じ。
オブジェクトBの絶対座標に調整されたベクトルを足します。
足した結果はオブジェクトBの絶対座標に戻します。
この時、この計算は衝突が起きているときだけなので、最後のオブジェクトBの入力端子ONに「衝突判定」ノードの衝突判定をつなぎます。

Collision_08

これで、衝突判定をしてめり込みを防止します。
これは一例であり、万全ではありません。
オブジェクトを乱雑に動かすと、ポリゴンのつなぎ目から突き抜けてしまいます。
他に、もっと良い方法があると思います。皆さんも探ってみてください。

今回のファイル9.5は、「collision.ZIP」です。

|

« ポリゴンオブジェクトの指定したポイントから、エッジで繋がっている隣のポイントを取得するノード | トップページ | XPressoで、「スプラインの交点をマークする」ノード…失敗に終わる… »