はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】パソコンのカメラからモーションキャプチャをしてAnimationClipを作成する

はじめに

先日このようなツイートを見かけました。


この三次元姿勢推定を用いて、お手軽にモーションキャプチャをしてゲームなどのキャラクターのモーション(AnimationClip)を作れるのでは?と思ったのでやってみました。

f:id:hanaaaaaachiru:20200217210139g:plain

必要なものは普通のカメラ一つだけなので、これほど導入が簡単で個人でも楽々利用できるのは革命的なのではないのかなと思ったり。

ただしGitHubのライセンスは必ず読んでから利用するようにしましょう。

では早速やっていきます。

環境

Macbook pro 2019 16-inch (GPUは強ければ強いほど良いです)
Unity 2019.2.17f1
UnityRecorder v2.1.0

ThreeDPoseUnityBarracudaをダウンロード

まずは先程Twitterで紹介されていた3次元姿勢推定のプロジェクトであるThreeDPoseUnityBarracudaをダウンロードします。

github.com


慣れているかたはcloneをしてもいいですが、今回は分かりやすくDownload ZipにてZipをダウンロードして解凍をしました。

f:id:hanaaaaaachiru:20200217184223p:plain


またこのプロジェクトはBarracudaという機械学習のライブラリを用いていて、学習済みデータを必要とします。

その学習済みファイルである.onnxを以下のURLからダウンロードしておいてください。(更新される可能性があるので、GitHubにあるURLからダウンロードした方がより良いです)
http://digital-standard.com/threedpose/models/Resnet34_3inputs_448x448_20200212.onnx

プロジェクトを開く

ダウンロードしたプロジェクトを開き、先程ダウンロードしたonnxファイルAssets / Scripts / Model /の中に配置してください。

f:id:hanaaaaaachiru:20200217185652p:plain


Sceneフォルダに入っているSampleSceneを開きます。

f:id:hanaaaaaachiru:20200217185918p:plain


BarracudaRunnerゲームオブジェクトのインスペクターにあるNN Modelという欄に、先程Assets / Scripts / Model /にいれたNN Model(onnx)を選択します。

f:id:hanaaaaaachiru:20200217190500p:plain

ウェブカメラを使う

ここまでの準備ができたら、再生ボタンを押すと実際に3次元姿勢推定が始まるはずです。

f:id:hanaaaaaachiru:20200217191238g:plain

このようにビデオで行いたい場合は、Video PlayerゲームオブジェクトのインスペクターにあるVideoPlayerコンポーネントVideo Clipを変更することで動画を変更することができます。

f:id:hanaaaaaachiru:20200217191551p:plain


ただし自分のモーションを録画した場合には、ウェブカメラを使うこともできます。

やり方は簡単で、MainTextureゲームオブジェクトにインスペクターにあるVideo CaptureコンポーネントUse Web Camにチェックを入れることでできます。

f:id:hanaaaaaachiru:20200217195348p:plain

UnityRecorderをインポートする

Unityちゃんの動きを録画するにあたって、3次元姿勢推定のプロジェクトの作成者はEasy Motion Recorderを推しています。

github.com


ただし似たような機能で、Unityの公式が出しているUnity RecorderでもGameObjectの動きをAnimationClipに記録できる機能があります。


公式という安心感からこちらでやっていきたいと思います。

インポートするにはAsset Storeではなく、Package Managerを用いて行ってください。

f:id:hanaaaaaachiru:20200217192609p:plain

モーションを録画する

録画するにはまずWindow -> General -> Recorder -> Recorder Windowからウィンドウを開きます。

f:id:hanaaaaaachiru:20200217193006p:plain


Add New RecordersをクリックしてAnimation Clipを選択します。

FrameRateのPlayBackConstant -> Variableに変更することで、より滑らかなアニメーションが録画できるはずです。

次に対象のゲームオブジェクトを選択してください。

f:id:hanaaaaaachiru:20200217193633g:plain

最後にRecorded Target(s)Everytingにすることにより設定は完了になります。

f:id:hanaaaaaachiru:20200217202207g:plain


あとは再生ボタンより3次元姿勢推定を行い、撮りたい時にSTART RECORDINGを押せばOKです。

終了したいときにSTOP RECORDINGを押せばAnimationClipが出力されます。

f:id:hanaaaaaachiru:20200217194141p:plain

AnimationClipについて

AnimationClipAnimationTypeにはGenericHumanoidの2種類(一応Legacyもある)があります。

UnityRecorderで撮影した場合はAnimationTypeGenericで出力されます。

しかしUnityちゃんなどの人型モデルではHumanoidの方が良い場合も多々あると思うので、変換したい場合は以下の記事を参考にしながら変換してみてください。

www.hanachiru-blog.com

さいごに

3次元推定のときにカクカクになってしまう場合にどこがネックになっているかを調べてみたところ、GPUが足りないっぽかったです。

Barracudaは強化学習をするライブラリなのでおそらくそうだろうなと思いましたが、逆にCPUはかなり暇を持て余していたのでここをうまく計算のお手伝いができればもっとパフォーマンスが出そうだなっと思ったり。

加えてWebカメラでモーションキャプチャをするよりも、一度撮りたいモーションの動画を撮った後にそれを3次元姿勢推定した方が安定していて、パフォーマンス的にも良さそうでした。

是非うまく活用してみてください。

ではまた。