読者です 読者をやめる 読者になる 読者になる

ぼっちプログラマのメモ

UE4とかVRとかについて書いたり書かなかったり。

UE4小ネタ:衝突相手が自分から見てどの方向いるか

「箱庭の彼女」で作ったBP小ネタを、ちょいちょい出していく

はじめに

BPのコリジョン周りの説明で、自動ドアが例・課題としてよく取り上げられますdocs.unrealengine.com

ただ「プレイヤーが近づいたら開いて、遠ざかったら閉まる」で終わってるものが多く、
以下の情報の取得まではしていません

  • キャラクターはどの方向から来た?
  • キャラクターはドアを通り過ぎた?

この情報が分かると、下図のような実装も可能になります
f:id:pafuhana1213:20150823230247j:plain
(入る時は「いらっしゃいませ」、
出る時は「ありがとうございました」というボイスを再生)

通り過ぎたという情報も、どの方向から来たことさえ分かれば
フラグ管理で推測することができます


実装

実装手段としては、以下の2通りがあると思います


どちらも試してみたのですが、前者はフラグ管理が面倒なので止めて
スマートに実装できる後者を選びました


で、解説の前にBPぺたぺた
https://dl.dropboxusercontent.com/u/30427841/0823/%E3%82%B3%E3%83%B3%E3%83%93%E3%83%8B%E3%83%89%E3%82%A2.JPG
テスト環境はこんな感じ
黄色い枠がキャラクターを検出するエリアです。自動ドアのセンサ部分ですね
f:id:pafuhana1213:20150823231839j:plain
結果はこんな感じ


(見えにくいかもしれませんが、左から右へ通り過ぎる時は「いらっしゃいませ」
 右から左へ通り過ぎる時は「ありがとうございました」が出力されてます)

ぷち解説

BP内で使っている、InverseTransformLocationノードが今回の肝です
これは、座標に対して指定した行列の逆行列をかける処理を行ってくれます

今回の場合だと、衝突相手の座標に対して、
コリジョンコンポーネントのワールド変換行列の逆行列をかけています
これにより、衝突相手の座標がコリジョンコンポーネントのローカル座標系の値に
変換されるので、その値を元にどの方向から来たかを識別しています

「互いの座標からベクトルを求めて、それで判別した方が処理速度的に良いんじゃね」
とも思いましたが、ドアの向きも考慮し始めると、
結局行列計算が必要になるので考えないことにしました
f:id:pafuhana1213:20150823232952p:plain
ローカル座標系とワールド座標系の関係
バーテックスシェーダによる座標系変換 - けんごのお屋敷 より


日本語でおkという方は、
「指定した座標を、検出用BPのBPエディタ上での座標に変換してる」
という説明でどうでしょうか…
f:id:pafuhana1213:20150823234231j:plain


…なんかドツボに嵌ってきたので、ここで解説終わり
座標変換周りを知っておくと、色々と出来ることが広がるので、
調べてみることオススメです
(数学が絡んでくると、説明難しい…今後は避けよっと…)