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

ぼっちプログラマのメモ

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

VR空間に手を出す為にしたこと(MotionControllerコンポーネントと両手用モデルの連動編) その2

UE4

はじめに

超今更ですが、↓の記事の続きを書きます。
pafuhana1213.hatenablog.com


もう記憶が怪しいので、前回の記事を読むと…
どうやら、MotionControllerコンポーネントの設定までは説明したようです。

次は、MotionControllerコンポーネントと両手用のモデルを連動させます。
これで、手を模したデバイスの動きをUE4上の手モデルに反映させることができます。
www.youtube.com
こんな感じに


両手用のモデルを準備する

まずは、右手・左手を模したモデルを用意する必要があります。
デバイス的に、ボーンが入っている手のモデルが理想です。

手のような複雑なモデルを作れる人ならいいのですが、
作れない人はどこからか入手する必要があります。できれば、怪しくない場所から…

ということで、UE4のマーケットプレイスで販売されている
両手モデルを購入します。
pafuhana1213.hatenablog.com
http://cdn-ak.f.st-hatena.com/images/fotolife/p/pafuhana1213/20151203/20151203003641.jpg
https://www.unrealengine.com/marketplace/item/00650940855b48e5b7f434f88834fd90

このモデル、一つだけ難があります。
それは腕の部分です。こんな感じに手首がねじ切れてしまいます。

勿論、調整に調整を重ねれば自然になると思いますが、
正直やってられません。

そもそも、
VRでは腕の部分を表示しないほうが違和感が出にくいです
(腕の部分を出す場合、頭と手のトラッキング結果から
腕のTransformを逆算する必要があります。地獄ですね)

ので、今回はMayaLTを使って腕の部分のポリゴンを削りました。
結果は、こんな感じです。
f:id:pafuhana1213:20160106225429p:plain

ついでに、BulletTrainな感じにしてみました。
何故かと言うと、VR空間上でリアルな手を出すと気持ち悪いからです。
こんな感じに、少しSFチックな表現にした方がいいです。

…って、ToyBoxの講演で話してました
f:id:pafuhana1213:20160106225606p:plain

マテリアルの中身はこんな感じです。
フレネルを使っています。簡単に使えるので、一度お試しあれ
f:id:pafuhana1213:20160106225716p:plain
docs.unrealengine.com


ここまでで、とりあえず両手用のモデルは準備出来ました!

両手モデルとMotionControllerコンポーネントの連動

あとは、MotionControllerコンポーネントのTransformを
用意した両手モデルに反映させてあげると、今回の目標を達成できます。

が、少しだけ面倒です。
何故なら、これが両手用モデルだからです。

片手用のモデルなら、右手・左手用のコンポーネント
メッシュを親子付けすればいいだけなのですが、
両手用モデルはそうはいきません…

そこで、IKを使って、コンポーネントのTransformを反映させてみます。

IKと聞くと難しいイメージがありますが、
UE4だと簡単に使うことができます。こんな感じです。
f:id:pafuhana1213:20160106230530p:plain

Two Bone IKノードでコンポーネントの位置を反映、
Transform(Modify)Boneノードでコンポーネントの回転を反映
させてます。

コンポーネントのTransformはこんな感じで設定してます。
f:id:pafuhana1213:20160106231053p:plain

Invert Transformノードを使ってローカル座標系に変えているのは、
回転の計算・設定がワールド座標系のままだと複雑になるからです。
理由は手首のボーンのTransformです…
この辺りは使用するモデルで事情が変わってくると思います。


これで、デバイスの動きに合わせて
UE4上の手モデルが動くようになりました!やったね!


両手モデルの指と、デバイスとの連動

最後に、手モデルの指とデバイスの入力を連動させます。
コレが出来れば、冒頭の動画にあったように握ったり開いたりできます。
OculusTouchのような手を模したデバイスだと、この対応は必須です。

…難しそうに聞こえるかもしれませんが、
やることはとても単純です。

デバイスの入力に応じて、各指の関節の回転を制御してあげるだけです。
渡すパラメータは、デバイスの入力イベントを元に調整します。
f:id:pafuhana1213:20160106232047p:plain

…超簡単ですが、超地味な作業です。
(パラメータの調整をミスると、指が複雑骨折したり、掌にめり込んだり…)


これで、指の動きもそれっぽく再現することができます。
ちょっとした事ですが、VRでの没入感を高める効果はかなり高いです。オススメです。

最後に

ここまでで、両手モデルとデバイスの連動が一通り完了しました。

以降は、指の握り具合で物を掴む判定をしたり、
コリジョンや物理を使って物を弾いたりすることになると思います。
自分なりに納得のいく実装ができたら、この記事の続きとして解説しようと思います。



…さて、Oculus Rift製品版の予約をしに行ってきますか!