遊んで航海記

思いつきで遊んだり、ゲームを作ったり、寝たり

Oculus TouchでUnityちゃんの指を動かして遊ぼう

Oculus Touchが届いてヒャッハーしている今日この頃です。アバター衣装とかあきらかにモヒカンキャラいますよね。開発でも、もっとヒャッハーしたいですね。

えーと、じゃなくって、この記事はOculus Advent Calendar 2016、12/19の記事です。

qiita.com

前日は、きゅーこんさんの「OculusStoreでの配布方法」でした。こういう実録情報は本当ありがたいです。一歩踏み出せそうな気がしますよね。

今日は、Oculus TouchでUnityちゃんの指を動かせるスクリプトを作って共有します!

f:id:n_ryota:20161218041816p:plain

スクリプトの処理は、指だけなのでご注意を。手や足、全身のIKなどは各自Unity標準IKやFinal IKのVRIKを使うなどで対処してみてください。

君の指は。自作に至る流れ

さて、Oculus Touchは位置や姿勢のトラッキングができるのが嬉しい他に、ボタンやアナログスティックがついたコントローラーでありながら、いくつかのボタンやトリガーには近接センサーを装備していて、なんとなく手っぽい感じで操作できます。

そうするとこういうこと考えちゃうわけですよ。

Oculusのアバターじゃなくて、好きなMechanimなキャラクターの指を動かしたい

あとアニメーションのブレンドとかじゃなくて、プログラムから自由に動かしたい!

で、自作してみることにしました。TポーズのUnityちゃんの指の姿勢や構造を見ていたら、わりとシンプルだったので。

結果 ~連動して動く指~

やってみると……あまりトラブルなく意外と簡単にできました。Avator SDKのコードも一切見ずに書いたので標準的な感じではないですが。VR Walk & RunのUnityちゃんに反映したら、こんな感じです。

はい。結構それっぽく動きますよね。

ちなみにピースは中指側のトリガーをゆるめるという、だいぶテクニカルな操作をするとできます:D

もちろん、拳を握ったり、手を開いたり、人差し指で指さして方向を示したり、カメラマンジェスチャーしたり、親指を立ててグッジョブしたり、OKサインしたりもできます。

さらに、ナチュラルに中指を立てるようなポーズもできてしまっていたのですが、それを防ぐ設定もいれておきました(デスメタルな雰囲気のVRを作るときは設定改変を……?)。

Touchのボタン状態取得などは、こりんさんのWebに超わかりやすくまとまっていて、助かりました(ありがとうございます!)。

framesynthesis.jp

スクリプトの内容と設定方法

指を動かす処理としては、UnityChanの各指の根本にスクリプトをはりつけ、回転軸を設定して、ボタンの状態にあわせて回転させる感じです。

指先にむけて曲がり方の係数なども設定できます。

各値の設定方法を解説しようと思ったのですが、その記事を書く方が面倒……! なので、スクリプトを貼り付けるだけで指の名前を見て全自動で設定するようにしました。

Thumb、Index、Middle、Ring、Pinckyといった親指、人差し指、中指、薬指、小指に対応する名前がついているGameObjectにスクリプトを貼り付けて、FingerTypeがAUTOになっていればOKです。

f:id:n_ryota:20161218041159j:plain

このスクリーンショットは左手の5本に設定した図です。設定というか単にスクリプトを各指の根本のGameObjectに貼り付けるだけ。右手も同様に貼り付けましょう。

自動設定する値についてはUnityちゃん用に調整した値なので、他キャラで調整する場合は、コンポーネントメニューからAutomatic Setupしたあと、各値を調整してみてください。またはソースコードのSetupFingerType()の中身を調整するのでもよいです。

MMDキャラはY方向ではなくZ方向を軸にしたFinger Angleにすると調整しやすいかも?(ほぼ未確認ですが)

シーンに読み込んだキャラクターの初期ポーズは、Tポーズなど指先を伸ばしたポーズにしておいてください。この初期ポーズを手が開いた状態として、そこからスクリプトで曲げる感じになっています。

雑然としてますが、スクリプトはこちらです。パラメータの意味についてもToolTipやコメントを入れておきました。

ボタン入力の判定にOVRInputを使うので、Oculus Utilities for Unity 5を別途インポートして、OVRManagerコンポーネントを1つカメラなどに付けておいてください。

gist1bff13989d3c501249ae93ca46dc9287

もともとは120行くらいのスクリプトだったのですが、コメント、Tooltip、自動設定機能などを入れたら長くなっちゃいました。

ちょっと読みづらいですが、いい感じに修正・改造して、その結果をまた公開してもらえるとありがたいです!(他力本願)

明日(12/20)はblkcatmanさんの「GearVRとStreamingMesh」です。GearVRは持っていないのですが、モバイルVRにはモバイルVRの良さがあるので、どんなネタか気になります! StreamingMeshは以前テストプログラムの実験に(しょぼいWiFiで)参加させていただいたりもしたのですが、とても面白い(将来性のあるすごい)技術です!