Unityで10点トラッキング専用のトラッカー自動認識

# 前書き

先日，[Unityで10点トラッキングをする方法](https://qiita.com/kotauchisunsun/items/19d828383a63ed7fdece)という記事を書きました．
しかし，これを実運用するにあたり，撮影の際の準備のコストが非常に大きかったです．
10点トラッキングは，頭，右手，左手のコントローラーの3点に加え，右ひじ，左ひじ，腰，右ひざ，左ひざ，右足，左足の7点を追加して行うトラッキングです．

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%82%AD%E3%83%A3%E3%82%B9%E3%83%88?src=hash&amp;ref_src=twsrc%5Etfw">#バーチャルキャスト</a> の3点・6点・10点トラッキング比較ですが、ソーラン節を踊ってみました。トラッカーの導入の参考にしてみてはいかがでしょうか？ 引き続きアバターは <a href="https://twitter.com/hashtag/V%E3%82%AB%E3%83%84?src=hash&amp;ref_src=twsrc%5Etfw">#Vカツ</a> で制作しましたフルトラマンです！ <a href="https://t.co/zfyM3zGn5h">pic.twitter.com/zfyM3zGn5h</a></p>&mdash; しゃら@超会議両日出没 (@syara_don) <a href="https://twitter.com/syara_don/status/1088129396081287168?ref_src=twsrc%5Etfw">2019年1月23日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

HTC Viveで行う場合，トラッカーを7つも利用するため，どの体の部位にどのトラッカーを付けたのか，Unity上で対応をとる必要があります．その対応を確認する作業に時間がかかります．**今回，トラッカーを付けてポーズをとるだけで，10点トラッキング用のトラッカーがVRIKに自動で設定されるスクリプトを制作しました．**


# 必要なもの

- FinalIK
- HTC Vive
- [KotauchiTrackerCalibrator](https://github.com/kotauchisunsun/KotauchiTrackerCalibrator)

今回は，前提として，FinalIKで3Dモデルを動かしたことがある方を対象にしています．


# 使い方

① 下記のURLのリポジトリから，csファイルをすべてダウンロードし，自分のAssetsフォルダにコピーしてください．

https://github.com/kotauchisunsun/KotauchiTrackerCalibrator

➁ 動かしたい3DモデルにC#のスクリプトを追加し，VRIKを選んでアサインしてください．
一般的なFinalIKの使い方と同じです．わからない場合は参考リンクをご参考ください．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/da4b2cd4-92f7-4cfe-2dab-1a9f04bb3385.png)

参考：VRMで遊ぶ① ～ WindowsMR + VRMでやってみる～
https://qiita.com/amidaMangrove/items/dabb2cda8ae52767b685

③ 空オブジェクトを作成し(ここではMyController)，Add ComponentでC#のスクリプトの「KotauchiVRIKController」を追加してください．

④ Kotauchi VRIK Controllerの設定を行います．

Ikに➁でVRIKをアサインした3Dモデルを設定してください．
**前回と違って，Head TrackerなどTrackerを設定をする必要がありません．**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/70784ce0-54f5-32f5-6427-cd6d72d2f743.png)

⑤ 10個のTrackerを設定したオブジェを作成します．
空のオブジェクトを作成し，それらに対してトラッカーを設定して下さい．
ここではわかりやすさのため，Head,Body,LeftElbow...などの名前にしていますが，実際はTracker01,Tracker02などの適当な名前のオブジェクトにトラッカーを設定すれば大丈夫です．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/e5d7a19d-e321-cee1-3f1a-4df54222a2fb.png)

⑥ 空オブジェクトを作成し(ここではMyDetector)，Add ComponentでC#のスクリプトの「KotauchiTrackerDetectController」を追加してください．

⑦「Kotauchi Tracker Detect Controller」の設定を行います．
「Controller」に④で設定した「KotauchiVRIKController」が設定されたオブジェ(MyController)を設定して下さい．
Tracker01-Tracker10は，⑤で制作した，トラッカーを設定したオブジェを設定して下さい．このオブジェクトに関しても，順番を気にする必要はありません．ただ10個のオブジェクトを設定するだけで構いません．
これで設定自体は完了です．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/314014e6-7ba9-f3da-3525-270a4ac04401.png)

⑧体にトラッカーを付けてください．

- 頭はHTC Vive
- 右手，左手はコントローラー
- 右ひじ，左ひじ，腰，右ひざ，左ひざ，右足，左足はTracker

⑨Playボタンを押し，トラッカーを付けた人は，下のような画像のポーズを取ってください．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/9669495a-5b09-063d-8b6c-851b45afc01e.png)

便宜上，「Lポーズ」と呼んでます．普通に立っていただいて，左手は横．右手は前にして立ってください．

⑩「Lポーズ」の状態でキーボードの「P」を押してください．

元々，「Kotauchi VRIK Controller」はこのようにTracker部分が空白です．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/c221db6d-4f9b-00b4-8900-44ee0bc986c8.png)

「P」キーを押して，うまく設定されると，

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/a8c00a80-8fb3-2eed-f72a-bbee7e4b3447.png)

このようにTracker部分にオブジェクトが自動で設定されます．

⑪このあと，トラッカーを付けた方は「Tポーズ」を取り，キーボードの「C」を押すと，10点トラッキングのキャリブレーション完了です．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139643/b683a553-4fab-96c9-f1f1-ea4106df8a33.png)


# バーチャルモーションキャプチャーのトラッカー自動認識方法

@sh_akira さん作のバーチャルモーションキャプチャーではControlWPFWindow.csのGetTrackerTransformBySerialNumberあたりに，トラッカーの自動認識系のコードが見受けられます．

https://github.com/sh-akira/VirtualMotionCapture/blob/5fa25a33fdfa56e6355ca97d26faf9f3e7ed389c/Assets/Scripts/ControlWPFWindow.cs#L832

ざっくりとした解説ですが，

1. トラッカーの詳細情報(HMD,Controller,Trackerの区分)から，「頭」，「左手，右手」と「その他」を分類．
2. 「左手」，「右手」の見分け方はコントローラーのx座標が一番小さいものが「左手」，そうでないものが「右手」
3. 「その他」の中で一番，y座標が高いものが「腰」
4. 「腰」を除く「その他」のトラッカーの中で，x座標が一番小さいもの「左足」そうでないものが「右足」

となっています．ひざ．ひじの認識のコードは，見つかりませんでした．

# KotauchiTrackerCalibratorのトラッカー自動認識方法

KotauchiTrackerCalibratorの場合は，KotauchiTrackerDetector.csのDetectにあります．

https://github.com/kotauchisunsun/KotauchiTrackerCalibrator/blob/master/KotauchiTrackerDetector.cs#L21

ざっくりと解説します．

1. トラッカーをy座標で逆順ソートしたものをsortedTrackersとします．この時点で，0番目の要素が「頭」，5番目の要素が「腰」になります．
2. sortedTrackersの1～4番目の要素が「左手，右手，左ひじ，右ひじ」になります．このうち，「腰」に近い2つのトラッカーが「左ひじ，右ひじ」，遠い2つが「左手，右手」になります．この手のトラッカーをhandGroupとします．
3. ここで，「右」と「左」の判別をします．仮に，「腰」から「右手」へのベクトル，「腰」へ「左手」のベクトルの外積を取ります．この結果は，y軸方向に向きます(右手系)．handGroupの0番目のトラッカーを「右手」として，先ほどの計算をして，結果がy軸方向に向いた場合，handGroupの0番目は「右手」，1番目は「左手」となります．しかし，結果がy軸方向ではなかった場合，handGroupの0番目は「左手」，1番目は「右手」となります．(ソースコード見てもらうほうが分かりやすいと思います．)
4. 「左手」と「腰」のトラッカーが判別できたので，体の「左」の方向が分かります(leftVec)
5. 「左ひじ，右ひじ」のうち，「腰」から見てleftVec方向のベクトルが「左ひじ」，そうでない方向が「右ひじ」になります．
6. sortedTrackersの中で，6,7番目が「左ひざ，右ひざ」となります．5.と同様に左右の判別をします．
7. sortedTrackersの中で，8,9番目が「左足，右足」となります．5.と同様に左右の判別をいます．

このような形で，KotauchiTrackerCalibratorのほうは，位置座標だけでトラッカーの判別をしています．そのため，普通の「Tポーズ」では左右の判断が難しかったため，「Lポーズ」といった独自のポーズをしてもらっています．

# 感想

今回，トラッカー自動認識のスクリプトを公開しました．前の記事にも書きましたが，HTC Vive所有しておらず，仮想環境で作っています．今回のコードは実際のHTC Viveで動かしてないので，結構動作は未確定です．仮想的なオブジェクトにノイズを加えて動作させて確認しているので，動くとは思います．動作確認できたり，バグや要望・質問がありましたら，githubのIssueか，@kotauchisunsunのTwitterアカウントに報告していただければと思います．

# 支援リンク

このプロダクトを支援いただける方は下記リンクからよろしくお願いします．
頑張ってHTC ViveとゲーミングPC買おうと思います．

Fanbox
https://www.pixiv.net/fanbox/creator/12173373

欲しいものリスト
https://www.amazon.jp/hz/wishlist/ls/18OKOS7JPDKNQ?ref_=wl_share

# ライセンス

ユニティちゃんは　© UTJ/UCL　のもと頒布されています．

# 参考URL

- [Unityで10点トラッキングをする方法](https://qiita.com/kotauchisunsun/items/19d828383a63ed7fdece)
- [UniVRM+SteamVR+Final IKで始めるVTuber](https://qiita.com/sh_akira/items/81fca69d6f34a42d261c)
- https://github.com/sh-akira/VirtualMotionCapture