Help us understand the problem. What is going on with this article?

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

前書き

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

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

必要なもの

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

使い方

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

https://github.com/kotauchisunsun/KotauchiTrackerCalibrator

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

image.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

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

image.png

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

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

image.png

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

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

⑨Playボタンを押し,トラッカーを付けた人は,下のような画像のポーズを取ってください.
image.png

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

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

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

image.png

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

image.png

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

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

image.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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away