Upgrade to Pro — share decks privately, control downloads, hide ads and more …

【令和最新版】意のままに身体を動かすキャリブレーション

 【令和最新版】意のままに身体を動かすキャリブレーション

DMM meetup #27 〜DMMのVR/3Dアバター領域の0→1を語る夜〜で使用した資料です。

091c8449decb2f3549c695b5f903865a?s=128

sh_akira

April 12, 2021
Tweet

Transcript

  1. キャリブレーション 【令和最新版】意のままに身体を動かすキャリブレーション DMM VR lab あきら@VMC 2021/04/12

  2. あきら DMM VR lab所属 チーフエンジニア/コミュニティマネージャー バーチャルモーションキャプチャーの作者です Twitter: @sh_akira GitHub: sh-akira

  3. DVRSDK DMM VR Connect SDKについて 3

  4. DVRSDKとは DMM VR ConnectをUnityで使えるようにする為のSDK 4 誰でもつかえる 簡単 サンプルシーンを開くだけで すぐに動きます 無料

    現在使用料は無料です。 まずは試してみて下さい
  5. 基本の流れ 認証して 5 アバター選んで すぐに動く

  6. 簡単なのは分かった ロードしてから何をするの? 6

  7. 7 BOW MANの場合 DVRAuth アバターをロードしたい About BOW MAN DVRCamera カメラを第三者視点にして動かしたい

    ※近日公開 DVRStreaming 画面をそのままゲーム配信したい
  8. アバター×VR 一番やりたいのは・・・? 8

  9. 9 アバターを自分の体として動かす

  10. 10 環境を選ぶ Oculus  Oculus Questとかはこれ SteamVR  PCVRとかトラッカー  扱いたいときはこれ UnityXR  Unity標準のもの

     とりあえず  動かしたいときはこれ
  11. 11 環境を選ぶ Oculus  Oculus Questとかはこれ SteamVR  PCVRとかトラッカー  扱いたいときはこれ UnityXR  Unity標準のもの

     とりあえず  動かしたいときはこれ
  12. 12 SteamVRむずかしいんですけど SteamVR 1.x →トラッカーはIndex番号で管理する SteamVR 2.x →トラッカーは役割(ロール)で管理する (ボタンはBindingして・・・指はSkeletalで・・・)

  13. 13 SteamVRむずかしいんですけど 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座標を取得します。
  14. 14 SteamVRむずかしいんですけど 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. 15 もちろん大丈夫です 3点(頭と両手)~11点(頭、両手、両ひじ、胸、腰、両ひざ、両足)を トラッカー3つまではVRChat方式でロール関係なく自動で、 それ以上はロールを参考に自動で割り当てます

  16. トラッカーが取得 できるのは分かった でも一番難しいのは・・・ 16

  17. F i n a l I K そうですね。Final IKですね 17

  18. 18 とりあえずネットにあるサンプルをコピペする ・手の向きがおかしい! ・腕が伸びきる! ・3点しかないじゃん! ←私の渾身の記事

  19. 19 足がクロスする!

  20. 20 腰が捻じれる!

  21. 21 下を向いたら宙に浮く!

  22. 22 もうばもきゃのソース使うか?(MITライセンスだし) 人は急に正しいTポーズなどできない

  23. というわけで本題 【令和最新版】意のままに身体を動かすキャリブレーション 23

  24. 24 そもそもキャリブレーションってなに ←2年以上使いまわしてい る画像 リアル人間の大きさと アバターの大きさが違う この差を良い感じに 埋める処理

  25. 25 新しい手法の概要 ・身長から大体の腕の長さを算出する ・アバターの腕の長さとの比率でスケールを合わせる ・目の位置をアバターと合わせる ・足の長さで出た誤差の分高さを変える ・スケールが合った状態でトラッカーとのオフセットを算出する

  26. 26 人体寸法データベース AIST人体寸法データベース 1991-92 https://www.airc.aist.go.jp/dhrt/91-92/data/list.html この他に1997-98や2003などがある。

  27. 27 リアル身長を推定する HMDの座標は大体目の高さ。 目の高さから頭頂部までの長さ(124.6mm)を足すと 大体身長になります。

  28. 28 身長から腕の長さを推定する 身長(1654.7mm)と腕の長さ(上腕長(301.2mm)+前腕長(240.5mm))の 平均から比率(大体0.327)を求めて、 リアル身長から腕の長さを算出する

  29. 29 身長から肩峰幅(骨の肩幅)を推定する 身長(1654.7mm)と肩峰幅(378.8mm)と アバターと人間の骨位置の違い(80mm位)から比率を求めて、 リアル身長から肩峰幅を算出する

  30. 30 ところで肩幅って必要? 肩峰幅(骨の肩幅)はリアルの場合、身長x0.229くらいが平均で アリシアちゃんは身長150cmなので大体34cmの幅があっても良い所 なんと13cmしかないので見ないとキャリブレーションが難しいです (お手元のメジャーで自分の肩幅を測るときっと40cm位あります) 13cm

  31. 31 肩幅と腕の長さからスケールを算出する アバターの腕の長さ + アバターの肩幅 / 2 リアルの腕の長さ+リアルの肩幅 /2 この二つの比率でトラッキングスペースのスケールを変更する

    ※これでリアルの腕の長さとアバターの腕の長さが同じになりました
  32. 32 アバターを目線(HMD)の位置に移動する リアルの目(HMD)とアバターの目(VRMFirstPersonから取得)を合わせる ※腕の長さが同じで頭の位置も合わせたので、アバターの方が  足がリアルより長かった場合、アバターの足が床に埋まった状態です

  33. 33 足がクロスする対策をする(1) 前提知識: FinalIKは初期化の際にボーンの曲がっている方向を 関節の曲がり方向として認識します。

  34. 34 足がクロスする対策をする(2) なので両膝をほんの少しだけ前方向に最初から曲げておきます

  35. 35 いよいよFinal IKをアタッチします VRIKをコードからアタッチするときに必要な呼び出しを おまじないのように呼んでおきます(全部必要です) ←足トラッカーが無い時の  Locomotionの設定は好みで  良い感じ(?)にします

  36. 36 頭のIKターゲットの生成 簡単に言うとHMDの子オブジェクトをモデルのHeadボーンの 位置に生成します。 そしてイイカンジの補正度合いを入れます。 ついでに後々便利なアバターの腰についてくるオブジェクトも生成

  37. 37 両手のIKターゲットの生成 手のターゲット(コントローラー)があるときは固定値のオフセットで 子にオブジェクトを生成します。 無い時は腰の横にイイカンジの位置で生成してHMDだけでも動きます

  38. 38 腰のIKターゲットの生成 腰は普通に作ると大体失敗します。実際の腰位置より低い位置に オフセットすると綺麗に動きます。頭と腰のターゲットが近づいた時、骨をそこ に収めるために無理やりな曲げ方をするためです。 ついでにmaintainPelvisPosition = 0で3点時の腰の捻じれが直ります

  39. 39 足のIKターゲットの生成(1) (後に頭トラッカーに対応するためにTODOだらけですが) 大体はアバターの足が床に埋まっているので、トラッキングスペースと アバターを両方床の上に持ち上げます(トラッキングスペースは浮く)

  40. 40 足のIKターゲットの生成(2) BendGoal(膝を曲げる方向)のターゲットを足の子の前方に生成します。 ウェイトは70%です。つまりつま先の方向に膝が7割ついてきます。 この割合は体感で決定していますがフィードバック募集中です 足トラッカーがあるとき 足トラッカーの子オブジェクトをモデルの足ボーンの位置に生成して

  41. 41 足のIKターゲットの生成(3) 同じくBendGoalのターゲットをこちらは腰の子の前方に生成します。 腰の向いている方向に膝を向けてあげる事で、無理な体勢をしたときの 破綻をなるべく無くす試みです 足トラッカーが無いとき

  42. 42 足のIKターゲットの生成(4) ここまでの処理の流れによってはアバターの高さが違う場合があるので 高さを正しくします。 そして腰か足トラッカーがある場合必ずVRIKRootControllerが必要です 腰の処理が足より後に来て膝の向きが壊れるのを防ぐコンポーネントです

  43. 43 手首のねじれを防止する デフォルトだと手首を回したときに手首だけ捻じれて雑巾しぼりのように なってしまうので、Final IKにはそれを防ぐTwistRelaxerがある ・・・のですがFinal IK 2.0のTwistRelaxerはVRMSpringBoneと干渉(?) して腕が暴れまわるのでオリジナルのコンポーネントが入ってます。 (手のコライダーが胸のSpringBoneに当たった時に暴れまわる・・・)

  44. 44 キャリブレーション完了! 最後にIKPositionWeightを100%にしてVRIKを有効化します ここでUpdateSolverExternalを1回実行します。 これは直ちにIKの計算を走らせてくれる関数です。 実行せずに終わると次のUpdateまでIKの計算が走らず、 一瞬Tポーズのアバターが見えてしまう場合があります。 これでキャリブレーション完了です。お疲れさまでした。

  45. むずかしすぎる 真似して実装するの嫌すぎる 45

  46. 46 なんと DVRSDKには ソースコードごと 全て入ってます すべてを詰め込んだキャリブレーション処理もDVRSDKを入れれば 誰でもご利用可能です! (さらに指のSkeletal Inputとスティックでの表情変更も入ってます)

  47. 47 DVRSDKのコンポーネントたち DVRAuth Connectの認証 ユーザーデータの取得 アバターデータの取得 他者のアバターの取得も可能 DVRStreaming Unityから直接RTMP配信 YouTube/Twitch等に配信可能

    Oculus Quest/Quest2対応 Windowsも対応 DVRCamera(近日配布予定) 第三者視点カメラ カメラワーク オートシーケンス 複数カメラの制御 DVRAvatar VRMの様々な制御 キャリブレーション 表情制御や自動まばたき 指の制御
  48. 48 さらに!今ならなんと! アバター入れたら必ず欲しくなる鏡もセットです! (VRじゃなくても使える!これ目当てでSDK入れるのもアリです)

  49. 49 触ってくれる開発者さん募集中! ダウンロードはこちら DMM VR Connect For Devs あなたのアプリを Connectの世界へ繋げよう

    公式Discordサーバー DMM VR lab Community ご質問や要望、最新情報も。 ご参加お待ちしてます!