手の動きに合わせて棒を振り回す方法(ジャイロセンサーなし)
第一回は2020年5/3の動画で身に着けた手法についてつらつら書きます。
ボディトラッキングはできている前提なのでよろしくお願いします。
ちなみにこの動画です。(生声、実写注意)
この動画では、実写のままUnityで作った世界に入り込んで敵を倒すゲームをプレイしています(動画的には世界を救っています)。動画の冒頭で剣をふるっているのですがこれをどのように実装したかについて忘れないように書いていきます。(このやり方は手軽だから今後も使えそう)
通常、何かしら棒を振り回すゲーム(Wiiスポーツとか)ではWiiリモコンとかスイッチのコントローラとかVIVEのコントローラとかジャイロセンサのついたものを振り回すと思うのですが、ぶっちゃけよくわからないですよね。設定めんどくさそうだし。一番手軽であろうものとして、UnityでJoy-Conを使う方法もあるんですが、この動画を出したときは思いつかなかったので今回はジャイロセンサーを使わない方法について書いていきます。
手の関節の情報を取得
まず、何かしらの手段で自分の関節の位置を取得しましょう。取得する方法はUnityで使えれば何でもいいと思います。個人的にはKinnectが一番手軽だと思いますが、VIVEのトラッカーでもいいし、そのほかの深度カメラを使うのもありだと思います。普通の3Dモデルを使う場合はそのまま使えば大丈夫なはず…(Vtuber的に動かせているならボディトラッキングできているはずだし。)一つ注意してほしいのが、3次元的に棒を動かしたい場合は何かしらの深度データ(奥行きの情報)が必要となるのでそこは注意してください。2Dゲームだったら別に問題ないとは思います。(作りたいものによるけど)
肘と手の情報を取得
そして、この手法で使うのは「肘」と「手」の位置情報です。これを聞いてもう皆さんはピンときたかもしれません。
そうなんです!
肘から手の延長として棒を持たせると結構それっぽく見えるんです!!
割と自然ですよね(笑)振っている感じだけを出したいのならこの手法で十分だと思います。細かい動きしたいならジャイロセンサーは絶対いるでしょうけど、これで十分な気もします。
肘から手への向き情報を取得
で、具体的な方法なんですけど、剣の始点は手のひらあたりにないとだめなので、先ほどトラッキングしているはずの手の位置に剣を持ってこさせて、その手の位置と同期さえたらいけます。(僕はそれぞれの関節情報をGemeObjectにしているので、手のGameObjectの子クラスとしちゃいましたが、角度を変えることを考えると子クラスにしちゃうのが一番楽だと思います)
そして、剣の角度を肘から手を見たときの角度に設定して上げらばいいんです。これに関してはUnityが用意してくれたLookAtを使えば一発ですね!例えば、右ひじのオブジェクトをhiziRIght、右手のオブジェクトをhandRIghtとすると、
hiziRight.transform.LookAt(handRIght.transform); handRight.transform.rotation = hiziRIght.transform.rotation;
で剣を振っている感じを出すことができます。ちなみに、handRIghtに代入したのは棒がhandRIghtの子クラスになっているからであって、そうでないのであれば、hiziRIghtの角度情報を棒に代入してあげればいいと思います。
ということで、ジャイロセンサーなしでそれっぽく見せる方法でした!
ここまで見てくれたなら動画も見てね!