DMM meetup #27 〜DMMのVR/3Dアバター領域の0→1を語る夜〜で使用した資料です。
キャリブレーション【令和最新版】意のままに身体を動かすキャリブレーションDMM VR lab あきら@VMC2021/04/12
View Slide
あきらDMM VR lab所属チーフエンジニア/コミュニティマネージャーバーチャルモーションキャプチャーの作者ですTwitter: @sh_akiraGitHub: sh-akira
DVRSDKDMM VR Connect SDKについて3
DVRSDKとはDMM VR ConnectをUnityで使えるようにする為のSDK4誰でもつかえる簡単サンプルシーンを開くだけですぐに動きます無料現在使用料は無料です。まずは試してみて下さい
基本の流れ認証して5アバター選んで すぐに動く
簡単なのは分かったロードしてから何をするの?6
7BOW MANの場合DVRAuthアバターをロードしたいAbout BOW MANDVRCameraカメラを第三者視点にして動かしたい※近日公開DVRStreaming画面をそのままゲーム配信したい
アバター×VR一番やりたいのは・・・?8
9アバターを自分の体として動かす
10環境を選ぶOculus Oculus QuestとかはこれSteamVR PCVRとかトラッカー 扱いたいときはこれUnityXR Unity標準のもの とりあえず 動かしたいときはこれ
11環境を選ぶOculus Oculus QuestとかはこれSteamVR PCVRとかトラッカー 扱いたいときはこれUnityXR Unity標準のもの とりあえず 動かしたいときはこれ
12SteamVRむずかしいんですけどSteamVR 1.x →トラッカーはIndex番号で管理するSteamVR 2.x →トラッカーは役割(ロール)で管理する(ボタンはBindingして・・・指はSkeletalで・・・)
13SteamVRむずかしいんですけどSteamVR 1.x →トラッカーはIndex番号で管理するSteamVR 2.x →トラッカーは役割(ロール)で管理する(ボタンはBindingして・・・指はSkeletalで・・・)例えば2.xで腰(Waist)にトラッカーを割り当てて使いたいときはPoseのActionをSteamVR_Inputに定義して、SteamVRでそのActionをバインディングして、それをデフォルトバインディングとしてアプリに入れて、Actionのフルパスを取得して、Actionのハンドルを取得して、InputSourceハンドルを取得して、ActionとInputSourceからPoseを取得して、生のMatrixからUnity座標を取得します。
14SteamVRむずかしいんですけどSteamVR 1.x →トラッカーはIndex番号で管理するSteamVR 2.x →トラッカーは役割(ロール)で管理する(ボタンはBindingして・・・指はSkeletalで・・・)例えば2.xで腰(Waist)にトラッカーを割り当てて使いたいときはPoseのActionをSteamVR_Inputに定義して、SteamVRでそのActionをバインディングして、それをデフォルトバインディングとしてアプリに入れて、Actionのフルパスを取得して、Actionのハンドルを取得して、InputSourceハンドルを取得して、ActionとInputSourceからPoseを取得して、生のMatrixからUnity座標を取得します。?
15もちろん大丈夫です3点(頭と両手)~11点(頭、両手、両ひじ、胸、腰、両ひざ、両足)をトラッカー3つまではVRChat方式でロール関係なく自動で、それ以上はロールを参考に自動で割り当てます
トラッカーが取得できるのは分かったでも一番難しいのは・・・16
F i n a l I Kそうですね。Final IKですね17
18とりあえずネットにあるサンプルをコピペする・手の向きがおかしい!・腕が伸びきる!・3点しかないじゃん!←私の渾身の記事
19足がクロスする!
20腰が捻じれる!
21下を向いたら宙に浮く!
22もうばもきゃのソース使うか?(MITライセンスだし)人は急に正しいTポーズなどできない
というわけで本題【令和最新版】意のままに身体を動かすキャリブレーション23
24そもそもキャリブレーションってなに←2年以上使いまわしている画像リアル人間の大きさとアバターの大きさが違うこの差を良い感じに埋める処理
25新しい手法の概要・身長から大体の腕の長さを算出する・アバターの腕の長さとの比率でスケールを合わせる・目の位置をアバターと合わせる・足の長さで出た誤差の分高さを変える・スケールが合った状態でトラッカーとのオフセットを算出する
26人体寸法データベースAIST人体寸法データベース 1991-92https://www.airc.aist.go.jp/dhrt/91-92/data/list.htmlこの他に1997-98や2003などがある。
27リアル身長を推定するHMDの座標は大体目の高さ。目の高さから頭頂部までの長さ(124.6mm)を足すと大体身長になります。
28身長から腕の長さを推定する身長(1654.7mm)と腕の長さ(上腕長(301.2mm)+前腕長(240.5mm))の平均から比率(大体0.327)を求めて、リアル身長から腕の長さを算出する
29身長から肩峰幅(骨の肩幅)を推定する身長(1654.7mm)と肩峰幅(378.8mm)とアバターと人間の骨位置の違い(80mm位)から比率を求めて、リアル身長から肩峰幅を算出する
30ところで肩幅って必要?肩峰幅(骨の肩幅)はリアルの場合、身長x0.229くらいが平均でアリシアちゃんは身長150cmなので大体34cmの幅があっても良い所なんと13cmしかないので見ないとキャリブレーションが難しいです(お手元のメジャーで自分の肩幅を測るときっと40cm位あります)13cm
31肩幅と腕の長さからスケールを算出するアバターの腕の長さ + アバターの肩幅 / 2リアルの腕の長さ+リアルの肩幅 /2この二つの比率でトラッキングスペースのスケールを変更する※これでリアルの腕の長さとアバターの腕の長さが同じになりました
32アバターを目線(HMD)の位置に移動するリアルの目(HMD)とアバターの目(VRMFirstPersonから取得)を合わせる※腕の長さが同じで頭の位置も合わせたので、アバターの方が 足がリアルより長かった場合、アバターの足が床に埋まった状態です
33足がクロスする対策をする(1)前提知識:FinalIKは初期化の際にボーンの曲がっている方向を関節の曲がり方向として認識します。
34足がクロスする対策をする(2)なので両膝をほんの少しだけ前方向に最初から曲げておきます
35いよいよFinal IKをアタッチしますVRIKをコードからアタッチするときに必要な呼び出しをおまじないのように呼んでおきます(全部必要です)←足トラッカーが無い時の Locomotionの設定は好みで 良い感じ(?)にします
36頭のIKターゲットの生成簡単に言うとHMDの子オブジェクトをモデルのHeadボーンの位置に生成します。そしてイイカンジの補正度合いを入れます。ついでに後々便利なアバターの腰についてくるオブジェクトも生成
37両手のIKターゲットの生成手のターゲット(コントローラー)があるときは固定値のオフセットで子にオブジェクトを生成します。無い時は腰の横にイイカンジの位置で生成してHMDだけでも動きます
38腰のIKターゲットの生成腰は普通に作ると大体失敗します。実際の腰位置より低い位置にオフセットすると綺麗に動きます。頭と腰のターゲットが近づいた時、骨をそこに収めるために無理やりな曲げ方をするためです。ついでにmaintainPelvisPosition = 0で3点時の腰の捻じれが直ります
39足のIKターゲットの生成(1)(後に頭トラッカーに対応するためにTODOだらけですが)大体はアバターの足が床に埋まっているので、トラッキングスペースとアバターを両方床の上に持ち上げます(トラッキングスペースは浮く)
40足のIKターゲットの生成(2)BendGoal(膝を曲げる方向)のターゲットを足の子の前方に生成します。ウェイトは70%です。つまりつま先の方向に膝が7割ついてきます。この割合は体感で決定していますがフィードバック募集中です足トラッカーがあるとき足トラッカーの子オブジェクトをモデルの足ボーンの位置に生成して
41足のIKターゲットの生成(3)同じくBendGoalのターゲットをこちらは腰の子の前方に生成します。腰の向いている方向に膝を向けてあげる事で、無理な体勢をしたときの破綻をなるべく無くす試みです足トラッカーが無いとき
42足のIKターゲットの生成(4)ここまでの処理の流れによってはアバターの高さが違う場合があるので高さを正しくします。そして腰か足トラッカーがある場合必ずVRIKRootControllerが必要です腰の処理が足より後に来て膝の向きが壊れるのを防ぐコンポーネントです
43手首のねじれを防止するデフォルトだと手首を回したときに手首だけ捻じれて雑巾しぼりのようになってしまうので、Final IKにはそれを防ぐTwistRelaxerがある・・・のですがFinal IK 2.0のTwistRelaxerはVRMSpringBoneと干渉(?)して腕が暴れまわるのでオリジナルのコンポーネントが入ってます。(手のコライダーが胸のSpringBoneに当たった時に暴れまわる・・・)
44キャリブレーション完了!最後にIKPositionWeightを100%にしてVRIKを有効化しますここでUpdateSolverExternalを1回実行します。これは直ちにIKの計算を走らせてくれる関数です。実行せずに終わると次のUpdateまでIKの計算が走らず、一瞬Tポーズのアバターが見えてしまう場合があります。これでキャリブレーション完了です。お疲れさまでした。
むずかしすぎる真似して実装するの嫌すぎる45
46なんとDVRSDKにはソースコードごと全て入ってますすべてを詰め込んだキャリブレーション処理もDVRSDKを入れれば誰でもご利用可能です!(さらに指のSkeletal Inputとスティックでの表情変更も入ってます)
47DVRSDKのコンポーネントたちDVRAuthConnectの認証ユーザーデータの取得アバターデータの取得他者のアバターの取得も可能DVRStreamingUnityから直接RTMP配信YouTube/Twitch等に配信可能Oculus Quest/Quest2対応Windowsも対応DVRCamera(近日配布予定)第三者視点カメラカメラワークオートシーケンス複数カメラの制御DVRAvatarVRMの様々な制御キャリブレーション表情制御や自動まばたき指の制御
48さらに!今ならなんと!アバター入れたら必ず欲しくなる鏡もセットです!(VRじゃなくても使える!これ目当てでSDK入れるのもアリです)
49触ってくれる開発者さん募集中!ダウンロードはこちらDMM VR Connect For DevsあなたのアプリをConnectの世界へ繋げよう公式DiscordサーバーDMM VR lab Communityご質問や要望、最新情報も。ご参加お待ちしてます!