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

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

sh_akira
April 12, 2021

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

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

sh_akira

April 12, 2021
Tweet

More Decks by sh_akira

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

  4. DVRSDKとは
    DMM VR ConnectをUnityで使えるようにする為のSDK
    4
    誰でもつかえる
    簡単
    サンプルシーンを開くだけで
    すぐに動きます
    無料
    現在使用料は無料です。
    まずは試してみて下さい

    View Slide

  5. 基本の流れ
    認証して
    5
    アバター選んで すぐに動く

    View Slide

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

    View Slide

  7. 7
    BOW MANの場合
    DVRAuth
    アバターをロードしたい
    About BOW MAN
    DVRCamera
    カメラを第三者視点にして動かしたい
    ※近日公開
    DVRStreaming
    画面をそのままゲーム配信したい

    View Slide

  8. アバター×VR
    一番やりたいのは・・・?
    8

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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座標を取得します。

    View Slide

  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座標を取得します。
    ?

    View Slide

  15. 15
    もちろん大丈夫です
    3点(頭と両手)~11点(頭、両手、両ひじ、胸、腰、両ひざ、両足)を
    トラッカー3つまではVRChat方式でロール関係なく自動で、
    それ以上はロールを参考に自動で割り当てます

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  19. 19
    足がクロスする!

    View Slide

  20. 20
    腰が捻じれる!

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  31. 31
    肩幅と腕の長さからスケールを算出する
    アバターの腕の長さ + アバターの肩幅 / 2
    リアルの腕の長さ+リアルの肩幅 /2
    この二つの比率でトラッキングスペースのスケールを変更する
    ※これでリアルの腕の長さとアバターの腕の長さが同じになりました

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  47. 47
    DVRSDKのコンポーネントたち
    DVRAuth
    Connectの認証
    ユーザーデータの取得
    アバターデータの取得
    他者のアバターの取得も可能
    DVRStreaming
    Unityから直接RTMP配信
    YouTube/Twitch等に配信可能
    Oculus Quest/Quest2対応
    Windowsも対応
    DVRCamera(近日配布予定)
    第三者視点カメラ
    カメラワーク
    オートシーケンス
    複数カメラの制御
    DVRAvatar
    VRMの様々な制御
    キャリブレーション
    表情制御や自動まばたき
    指の制御

    View Slide

  48. 48
    さらに!今ならなんと!
    アバター入れたら必ず欲しくなる鏡もセットです!
    (VRじゃなくても使える!これ目当てでSDK入れるのもアリです)

    View Slide

  49. 49
    触ってくれる開発者さん募集中!
    ダウンロードはこちら
    DMM VR Connect For Devs
    あなたのアプリを
    Connectの世界へ繋げよう
    公式Discordサーバー
    DMM VR lab Community
    ご質問や要望、最新情報も。
    ご参加お待ちしてます!

    View Slide