Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

DVRSDK DMM VR Connect SDKについて 3

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

19 足がクロスする!

Slide 20

Slide 20 text

20 腰が捻じれる!

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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