Unityでのアバタ使用時に身体所有感を向上させる方法!

2020年12月7日月曜日

Unity VR アバタ 技術

t f B! P L

前置き

こんにちはTOKIです

突然ですが皆さんUnityでアバタを動かしたいってことありますよね?
私はあります

でもいざFinal IK等を使うと手をいろんな方向に動かしたときに
まだ腕を伸ばしきってないのにアバタの腕だけは伸びきっちゃったり
その逆に腕を伸ばしきってるのにアバタの腕はまだ曲がったまま
何てことが多々起こります
VR上でアバタを使う上ではこれが身体所有感(いずれブログにまとめます)を低下させる一因となることがあるので
これは何としてでも解決したい

Unityで[Camera Rig]のScaleを変化させてもよいですがXYZ軸で別の値を入れると頭を傾けたときにICD(IPD, 詳しくは→ HMDの瞳孔間距離不整合による世界変形)が変化してしまいサイズ知覚などに影響してしまいます
またVIVE Trackerなどでトラッキングしてもいいのですが個人で10点トラッキングなどをするには少々お金がかかります
ということで今回はICDを変化させず,かつお金も最低限しかかけずこの問題を解決しようと思います!

御託はここまで
早速やってみよう!

方法論!

とは言ってもまずはIK使って動かすところからという事で
を読んでね!

...読んだね!??

では始めよう!

手順

前準備

まずCameraRig等のScaleを変化させてた場合はすべて1に戻す
次に上の記事の最後の状態のHierarchyで図1のように
CameraRigと同じ階層にControllerPositionLeftとControllerPositionRight的な名前の
Emptyを作成し
CameraRigの子階層にCameraPositionY的な名前のEmptyを作成する

そして
  • ControllerPositionLeftの子階層にTargetLeft
  • ControllerPositionRightの子階層にTargetRight
  • CameraPositionYの子階層にCamera (head)以下
を入れる

図1,変更後のHierarchy

ControllerのPositionのスケール変換

ここまで出来たら以下のリンク先の
ControllerPositionByTOKI.csをダウンロードまたは作成し
ControllerPositionLeftControllerPositionRightにAdd Compornentする

するとInspectorのControllerPositionByTOKI内に
BaseControllerとBaseBoneという項目およびScaleが3軸分出てくるので
  • BaseControllerにController (left)またはController (Right)
  • BaseBoneにアバタのUpperChest辺りのボーン
を入れる
例えばControllerPositionLeftのInspectorであれば次の図2のようになる

図2,Inspectorの例

次にControllerPositionByTOKIの
  • Scale XにTポーズにおけるアバタの右手指先から左手指先にかけての長さを体験者の同様の長さで割った値
  • Scale Yにアバタの身長を体験者の身長で割った値
        (もしくはアバタの目までの高さを体験者の目までの高さで割った値)
  • Scale ZにTポーズにおけるアバタのUpperArmの付け根から指先にかけての長さを体験者の肩から指先にかけての長さで割った値
を代入する

視点の調整

最後に視点の調整をする
まずCamera (head)のScaleのXYZにControllerPositionByTOKIのScale Yに入れた値
(アバタの身長を体験者の身長で割った値もしくはアバタの目までの高さを体験者の目までの高さで割った値)
を代入する
次にCameraPositionYPositionY
アバタの身長から体験者の身長を引いた値
(もしくはアバタの目までの高さから体験者の目までの高さを引いた値)
を代入する

実行してみよう!

ここまできたら実行してみてください
VR上で腕を前や横,上下に動かせば腕を伸ばしきったタイミングでアバタの腕も伸びきるかと思います

Y軸方向にうまくいかないときは...

HierarchyのController (left)もしくはController (right)の子階層のModelに
チェックを入れた状態で(Unityでコントローラを表示した状態で)
実行しコントローラを地面に置きます
この状態でもしコントローラが浮いていたり,逆に床より下に入っていた場合
その差分をInspectorでアバタのPositionのYと床とかその他オブジェクトのPositionのYに入れる
と一応ちゃんとなるんだけども
根本的な解決ではないので
おそらくおかしくなってるSteamVRのルームセットアップとかをやり直してみましょう!


一応これで手順としては全部なのですが
原理的な部分はいずれ記事にしようかと思います

なにかあればコメントください

ではではノシ

QooQ