最近「〇〇してみた」という入門編の記事ばかりですね。継続力が無くてつらい。。
ということで、表題の通り、超有名なモーションセンサー、LeapMotionを購入して届いたので使ってみました。
LeapMotionは発売は結構古いにもかかわらず、ソフトウエアのアップデートで継続的に機能が強化され、指の動きを取得するセンサーとしてデファクトスタンダードになっている製品です。最近はLooking Glassにバンドルされていたりでまた利用者が増えたようです。
購入したきっかけは、たるこすさんのツイートでした。
HoloLens の上に Leap Motion を取り付け、MRTK v2 の入力として使えるようにするコードを公開しました!
Leap Motion は有線で PC と接続し、Unity Editor から Horographic Remoting を使って HoloLens に画面を表示しています。https://t.co/NcjVgeEjtY#HoloLens #LeapMotion #MRTKv2 pic.twitter.com/Hsb853jyUe— たるこす (@tarukosu) 2019年5月24日
ちょっと前にHoloLens 2のチュートリアルをやった時に、指の動き(ジェスチャー)をEditorやエミュレーターで再現するのは相当無理がある、と感じていた矢先のことでした。初代HoloLensは実質AirTapしか無かったのでマウスでもなんとかなりましたが、2はジェスチャーの種類も増加したのでマウスではかなりの無理があります。
ということで、たるこすさんがLeapMotionと初代HoloLensで、MRTK v2を使ってジェスチャーを認識する仕組みをソースコード付きで公開されたのを見て衝撃を受けました。天才的ですね。。
さっそくLeapMotionをアマゾンで購入しました。(Oculus Questのkonozama事件の被害者なのでAmazonは使いたくなかったのですが、結局最安値ですぐ届くので使っちゃうんですよね。。)
届いたので、ドライバを入れてセットアップし、たるこすさんのGitHubの説明通りにしたところ、動きました。
たるこすさんのLeapMotion + MRTK v2動いた!画期的すぎる。https://t.co/ygB6y1Fzo6 pic.twitter.com/iddhBOf0iT
— とりカシュ (@torikasyu) 2019年5月25日
ただやはり、初代HoloLensの視野角に対して手が大きすぎるような感じを受けるので、早くHoloLens 2で試したいですね。
さて、動きはしたものの、どういう仕組みで動いているのかは全く理解していません。MRTK v2もチュートリアルを齧っただけでその構造はほとんど理解できていませんし、LeapMotionも届いたばかりでさっぱりです。ということで、まずはLeapMotionの仕組みを知るためにチュートリアルをやってみました。
ところが、LeapMotionのSDKはどんどん改良されるらしく、最新のSDKとは異なっていてうまくいきませんでした。結局、SDKに入っているサンプルのScneneを見ながら作ってみました。以下は「Leap_Motion_Core_Assets_ 4.4.0.unitypackage」を使った場合の手順です。(ドライバなどは入っており、サンプルシーンが動く状態なのが前提)
まずは新規Sceneを作成し、Assets>LeapMotion>Core>Prefabs>LeapHandController をシーンに配置します。ところが、LeapHandControllerにアタッチされている何かのスクリプトが最初からMissingになっています。(僕のインポートの方法がおかしかったのかもしれませんが。。)
なので、シーンに配置後にUnPack Prefabを選択してPrefabと切り離し、MissingになっているものをRemoveしました。
LeapMotionに入門しようとしているが、LeapHandControllerにアタッチされているスクリプトが初めからmissingだったり、QiitaだとLMHeadMountedRigに当たるものがLeap Rigというぞんざいな名前になってたりでググりながら調べる勢にはツライw pic.twitter.com/9bz1t31z6s
— とりカシュ (@torikasyu) 2019年5月25日
そして、HandModelsという空オブジェクトを作り、その中に手のモデル、
LoPoly Rigged Hand Left
LoPoly Rigged Hand Right
RigidRoundHand_L
RigidRoundHand_R
を配置しました。
先ほど配置したLeapHandControllerの「Hand Model Manager」コンポーネントのModel PoolのSizeを2にして、Group_NameをそれぞれGraphics_Hands、Physical_Handsにします。この名称はサンプルシーンを参考にしたのですが、正式な命名規則はまだ理解できていません。
先ほどシーンに配置した手のモデルをインスペクタにドラッグ&ドロップします。
Is Enabled、Can Duplicateにチェックを入れます。
この状態で再生すれば、手のモデルが表示されるのが確認できると思います。
ということで、手の動きを認識して、それに合わせて手のモデルを表示する過程で直接参照されているスクリプトは、LeapHandControllerにアタッチされているLeapServiceProvider.csと、HandModelManager.csの2つだけとなります。だんだん構造がわかってきました。
その後、Planeを配置して、RidgidBobyを持ったボールを配置して、ボールが飛んでいかないように壁をCubeで作ったらば、ボール遊びができる状態になりました。
LeapMotion完全に理解した(お約束 pic.twitter.com/sibNtZyeYe
— とりカシュ (@torikasyu) 2019年5月25日
ということで、本当に最低限のしくみは分かったので、ここから更に理解を深めていきたいと思います。