XPressoでオブジェクトを移動させても、地面ポリゴンオブジェクトに密着させる。
オブジェクトを地面の凹凸に合わせて移動させたい時があるよね。
移動させるオブジェクトが、パスに沿って移動するなら、パス自体を地面の凹凸に合わせると(スプラインを十分に分割して、構造メニュー/スプラインを編集/投影を実行)簡単に地面に沿って移動するアニメーションが作れるわけですよね。
でも、パスに沿わないで、自由に動かしたい場合は、どうします?
それでは、地面ポリゴンメッシュに円錐プリミティブを密着させてみよう。
XPressoは、「光線の衝突」ノードを使います。
光線の開始と終了のポイントは、「境界ボックス」ノードを利用します。
オブジェクトの角度は、衝突ポリゴンの法線を利用します。
「境界ボックス」/「光線の衝突」ノードはグローバルモードで使用します。
境界ボックスは…オブジェクトが空間を占めている領域です。
グローバルモードの場合、オブジェクトがグローバル空間を占めている領域です。
地面ポリゴンメッシュのグローバル空間を占めている領域の最大Yと最小Yを利用します。あとのXZは沿わせるオブジェクトの値を使います。
「境界ボックス」ノードがグローバルモードなので、地面オブジェクトが回転していても、どこに配置されていても問題ありません。
ここまでのXPressoです。
まずは、ベクトルのY値を変更するXGroupをつくります。
こんな感じです。
次のXPressoは…
地面オブジェクトの「境界ボックス」から最大・最小Y値を取得。
最大・最小Y値を沿わせるオブジェクトの絶対座標のY値に入力。
「光線の衝突」の光線の開始・終了に入力する。
この後のXPressoは…
「光線の衝突」ノードの衝突位置に沿わせるオブジェクトの絶対座標に入力します。
「光線の衝突」ノードのポリゴンの法線に沿わせるオブジェクトのY軸を合わせます。
まず、衝突位置から…
衝突位置を沿わせるオブジェクトの絶対位置に入力するのですが、XZ値も入力してしまうと衝突位置から動けなくなるので、Y値のみの変更にします。
オブジェクト位置の処理は、終了です。
オブジェクトの角度を変更します。
ベクトルがY軸になるようにマトリクスに変換し、更にマトリクスからHPB回転に変更します。HPB回転をベクトルに変更します。
計算/「ベクトル->マトリクス」ノード(Y軸)
計算/「マトリクス->HPB」ノード
変換/「実数->ベクトル」ノード
結果を見てみよう。
法線をY軸に合わせたにもかかわらず、円錐(+Y)が下を向いてしまっている。
地面の法線は、逆向きではありません。
試しにこの様なオブジェクトを配置してみます。
計算/「ベクトル->マトリクス」ノードの軸を(Y軸/X軸/Z軸)切り替えてみます。
ZX軸は法線に合っているのですが、Y軸のみが法線の反対を向いています。
対処方法は法線を反転すればよいのですが…
良いのだろうか?こんな事で…
計算/「ベクトル->マトリクス」ノードが悪いのか?他の2つのノードが悪いのか?
計算/「マトリクス->HPB」ノード
変換/「実数->ベクトル」ノード
は、この段階ではわかりません。
では別のノードで試してみよう。
法線からマトリクスに変換するのだから、オブジェクトのグローバルマトリクスに入力するといいだろう。
マトリクスのV0に衝突位置を入力して、オブジェクトのグローバルマトリクスに入力します。
これで、計算/「ベクトル->マトリクス」ノードの軸を(Y軸/X軸/Z軸)切り替えてみます。
全ての軸が法線に合いました。
では、オブジェクトを移動させてみよう。
これで、Y軸の方向も位置も問題ありません。
ただし、XZ軸の方向を定めていません。
今回は、オブジェクトを移動しても地面に密着させるのが目的なので、ここで終了します。
このXPressoは、汎用性があるのでXGroupにまとめます。
赤い枠内をXGroupにしておきます。
今回のファイル9.5は、「OntheGround.ZIP」です。
| 固定リンク