メモログ

Oculus RiftでバーチャルYoutuberになる方法

forte1st
2017/12/30 23:00


Oculus Riftで↓の動画のようにバーチャルYoutuber的なことをやった時の作業メモです。

バーチャルYoutuberになりました(使用機材はOculus Rift + Touch) pic.twitter.com/mSDHgyXTzY

— フォルテ (@forte1st) 2017年12月28日

 

※Unityの基本事項が分かっていることを前提にしています。

※試しにちょっとだけ遊んでみたい人向けです。本格的にやりたい場合はFinalIKという有料アセットを利用したほうが良いと思います。

 

用意するもの

・Oculus Rift CV1 + Touch

・Unity5 (2017でも大丈夫だと思います)

 

1.ユニティちゃんをダウンロード

http://unity-chan.com/contents/guideline/
このサイトから「ユニティちゃん 3Dモデルデータ」をダウンロードして新規プロジェクトにインポートします。

Scenesフォルダの中の「SecondaryAnimation」というシーンを開きます。

シーンに配置されている「unitychan_dynamic」に貼ってあるスクリプト「IKCtrlRightHand」にチェックを入れて有効化します。
その中のIsIkActiveにもチェックを入れておきます。

シーンを再生するとユニティちゃんが右手でボールを掴んでいるはずです。

ボールの親オブジェクト「Locator_IKtarget」を動かすとユニティちゃんの右手がそれに合わせて動くと思います。


© Unity Technologies Japan/UCL

以降、このシーンを元に改造していきます。

 

2.OVRCameraRigの導入

Oculus公式サイト(https://developer.oculus.com/downloads/unity/)からOculus Utilities for Unityをダウンロードしてインポートします。

Prefabsフォルダの中の「OVRCameraRig」をユニティちゃんの顔あたりに配置します。(X, Y, Z) = (0, 1.35, 0)くらい?

この時点でシーンを再生すれば既にVRでシーン内を見回せる状態になっているはずです。あとはユニティちゃんを自分の動きと連動させるだけです。

 

3.ユニティちゃんとOVRCameraRigを連動させる

unitychan_dynamicのIKCtrlRightHandスクリプトの「TargetObj」に、OVRCameraRigの中の「RightHandAnchor」をアタッチします。

この時点でシーンを再生すると、ユニティちゃんの右手がOculus Touchの右コントローラと連動するはずです。

以上が確認できたので左手と頭も同様に連動させればいいと思ったのですが、頭に関しては一工夫する必要がありました。
Unity標準のIKは「手先・足先・体の中心の座標を元に手足の関節角度を決める」ことはできますが、「頭の座標を元に首や体の関節角度を決める」ことはできないようです(FinalIKという有料アセットを使えばできるらしいです。FinalIKを使う場合は他の記事を参照してください)。
そこで、体が常に地面に対して垂直であると仮定して、頭の座標から体の中心の座標を推測してIKを行うことにします。

IKCtrlRightHand.csの中の2ヶ所を以下のように書き換えてください。
 

1.Awake()の前
---------------------------------------------------------------------------------------
public Transform targetObj = null;
      ↓
public Transform targetHead = null;
public Transform targetRightHand = null;
public Transform targetLeftHand = null;
public Transform targetRightFoot = null;
public Transform targetLeftFoot = null;
---------------------------------------------------------------------------------------

 

2.OnAnimatorIK()の中
---------------------------------------------------------------------------------------
anim.SetIKPositionWeight (AvatarIKGoal.RightHand, mixWeight);
anim.SetIKRotationWeight (AvatarIKGoal.RightHand, mixWeight);
anim.SetIKPosition (AvatarIKGoal.RightHand, targetObj.position);
anim.SetIKRotation (AvatarIKGoal.RightHand, targetObj.rotation);
           ↓
anim.SetIKPositionWeight (AvatarIKGoal.RightHand, mixWeight);
anim.SetIKRotationWeight (AvatarIKGoal.RightHand, mixWeight);
anim.SetIKPosition (AvatarIKGoal.RightHand, targetRightHand.position);
anim.SetIKRotation (AvatarIKGoal.RightHand, targetRightHand.rotation);

anim.SetIKPositionWeight(AvatarIKGoal.LeftHand, mixWeight);
anim.SetIKRotationWeight(AvatarIKGoal.LeftHand, mixWeight);
anim.SetIKPosition(AvatarIKGoal.LeftHand, targetLeftHand.position);
anim.SetIKRotation(AvatarIKGoal.LeftHand, targetLeftHand.rotation);
                
anim.SetIKPositionWeight(AvatarIKGoal.RightFoot, mixWeight);
anim.SetIKRotationWeight(AvatarIKGoal.RightFoot, mixWeight);
anim.SetIKPosition(AvatarIKGoal.RightFoot, targetRightFoot.position);
anim.SetIKRotation(AvatarIKGoal.RightFoot, targetRightFoot.rotation);

anim.SetIKPositionWeight(AvatarIKGoal.LeftFoot, mixWeight);
anim.SetIKRotationWeight(AvatarIKGoal.LeftFoot, mixWeight);
anim.SetIKPosition(AvatarIKGoal.LeftFoot, targetLeftFoot.position);
anim.SetIKRotation(AvatarIKGoal.LeftFoot, targetLeftFoot.rotation);
                
anim.bodyPosition = targetHead.position + Vector3.down * 0.45f; //頭の座標から体の座標を計算(数値は適当に調整してください)
anim.bodyRotation = Quaternion.identity;

anim.SetBoneLocalRotation(HumanBodyBones.Head, Quaternion.Euler(-targetHead.eulerAngles.y, targetHead.eulerAngles.z, -targetHead.eulerAngles.x)); //HMDの傾きをそのまま頭の傾きに適用するとおかしくなるので適当に変換(もっとまともな方法があると思います)
---------------------------------------------------------------------------------------
 

そして、targetHeadにCenterEyeAnchor、targetRightHandにRightHandAnchor、targetLeftHandにLeftHandAnchorをアタッチします。
足はトラッキングできないので、Create Emptyで適当なオブジェクトを2つ用意して両足先に配置し、TargetRightFootとTargetLeftFootにアタッチします。

以上で頭と手が連動するようになっているはずです。頭の位置がおかしい場合はOculusのメニュー画面でRecenterする(https://support.oculus.com/200305533724698/)か、以下のスクリプトをどこかに貼り付けてTouchのボタンでRecenterできるようにすると良いでしょう。

---------------------------------------------------------------------------------------
void Update () {
    // TouchのXボタンでRecenter
    if (OVRInput.GetDown(OVRInput.RawButton.X)) {
        InputTracking.Recenter();
    }
}
---------------------------------------------------------------------------------------

 

4.撮影用カメラの設定

ここまでの作業でユニティちゃんになることはできますが、主観視点の映像しか出力されないのでYoutubeに上げるための動画が撮影できません。

PC画面に別視点の映像を出力する方法は以下の記事が参考になります。
https://qiita.com/Rauziii/items/5fc45844b551f33184b3

後はお好みで背景を変えたりオブジェクトを配置したりしてみましょう。

 

これであなたもバーチャルYoutuber!

  • 2541
  • 0.02018

この投稿に最初のコメントをしましょう!

forte1stさんのおすすめメモログ!

どんどこわっしょい http://forte1st.com
Twitterのロゴマーク

スポンサーリンク
PR

広告募集中!!

広告スペースをMONAで販売中です。
この投稿に最初のコメントをしましょう!

モナゲして応援しよう!

Loginすることで、モナゲが可能になります。