Unityでアバタを動かす方法!(VRM&Final IK編)

2020年12月3日木曜日

Unity VR アバタ 技術

t f B! P L

 前置き


こんにちはTOKIです

突然ですが皆さんUnityでアバタ動かしたいですよね?
私は動かしたいです

ということで今回はFinal IKを使ってアバタを動かしてみましょう!

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

方法論!

とは言ってもこれ系の記事はいっぱいあるので以下の記事を参考に少し簡潔にまとめたものをここから書いていきます

参考

環境
  • Unity 2019.4.10f.1
  • VIVE Pro EyeのHMD
  • Valve Indexのコントローラ(VIVE Proのコントローラでも動作確認はしました)

インポートするやつ(多少バージョン違っても大丈夫なはず)

手順

前準備

まず上記のインポートするやつをインポートする
するとSteamVRから以下の警告が出るのでAccept Allをクリック

SteamVRからの警告

するとなんかいい選択をしたねみたいな文が表示されるけど
まだ警告が残る場合があるのでその場合は
Assets¥SteamVR\Editor\SteamVR_UnitySettingsWindow.cs
のスクリプト内で
recommended_ShowUnitySplashScreen = false;
のfalseをtrueに変更する
こうすれば警告の下がCloseになって以降表示されなくなる

次にUnityのヘッダーにある
Window->SteamVR Input->(Yes)->Save and generate->(Save)
をクリックし
使いたいVRMアバタをAssetsフォルダ以下に入れる

Hierarchy(Scene)にVRMアバタ
Assets\SteamVR\Prefabsの中にあるCameraRigをそれぞれ入れ
HierarchyでCameraRig内のcameraを選択しInspectorにSteamVR_CameraをAdd Componentする

ここでCameraRigをUnpack Prefab
SteamVR_CameraExpandをクリック
(するとCamera(head), Camera(eye), Camera(ears)が勝手にできる)

Camera(head)の子階層にTargetHead的な名前でEmptyを作る
同様にController(left)とController(right)の子にそれぞれTargetLeftとTargetRightを作る

以下のリンク先の
CameraControllerFirstPersonByTOKI.csをダウンロードまたは作成し
TargetHeadにAdd Compornentする

VRMアバタのInspectorのVRMFirstPerson内のFirstPersonOffsetの値を
さっき付けたTargetHeadのCameraControllerFirstPersonコンポーネントの
FirstPersonOffsetのXYZにそれぞれ代入する
(この時事前にVRMFirstPerson内のFirstPersonOffsetがアバタの目の間に来るようにするとよい)

この時点でのHierarchyは以下の感じ(AvatarがVRMアバタ)

Hierarchyの例

Final IKを使う

HierarchyのVRMアバタのInspectorにVR IKをAdd Component
VRMアバタのVR IKのSolver
  • SpineのHeadTargetにTargetHead
  • LeftArmのTargetにTargetLeft
  • RightArmのTargetにTargetRight
を入れる

VRMアバタの身長を体験者の身長で割った値
(もしくはVRMアバタの目までの高さを体験者の目までの高さで割った値)
CameraRigのScaleのXYZに代入する
(これによって瞳孔間距離が変化してしまうため,そのままにしたい場合はHierarchyのCamera(head)のScaleに逆数を代入する)

TargetLeftのInspectorのTransformの
Positionに-0.03,0.025,-0.12をRotationに-40(Index コントローラなら40),0,90を代入し
TargetRightのInspectorのTransformの
Positionに0.03,0.025,-0.12をRotationに-40(Index コントローラなら40),0,-90を代入する

↓あとはお好みで足の間隔とかを設定する(アバタによって違ったりする)

HierarchyのVRMアバタのInspectorのVR IK内において
  • Left Leg内Swivel Offsetを15
  • Right Leg内Swivel Offsetを-15
Locomotion内
  • Foot Distanceを0.15
  • Step Thresholdを0.2
  • Max Velocityを0.3
  • Velocity Factorを0.3
  • Root Speedを30

邪魔な頭を1人称視点で表示しないようにする

Unityのヘッダーにある
Edit->ProjectSetting->Tags and Layers->Layers
  • User Layer 9FIRSTPERSON_ONLY_LAYER
  • User Layer 10THIRDPERSON_ONLY_LAYER
を代入する

Camera(eye)のInspectorのCamera内Culling Maskのタブを開いて
THIRDPERSON_ONLY_LAYERのチェックを外す

FirstPersonSetup.csをいただき
VRMアバタにAdd Compornentする

実行してみよう!

ここまできたら実行してみてください
HMDをかぶればアバタを一人称視点で動かせたかと思います

この時HMDの画面にSteamVRの警告のようなものが出てきても
すべて閉じればUnityのSceneに戻れます

またコントローラの3Dオブジェクトが表示された場合
HierarchyのController (left)とController (right)のそれぞれの子階層にある
ModelをDeleteもしくはModelのInspectorのチェックを外せば非表示になります

以上でアバタをUnity上で動かす最低限のことはできたと思います!
ですがこれではまだ問題点があるので次回それを解決しましょう!!

次回枠

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


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

ではではノシ

QooQ