カテゴリー別アーカイブ: Unity

Oculus Quest Hand Tracking

標準

Oculus Questのハンドトラッキングの作り方

ハンドトラッキングとは

公式サイトより

https://developer.oculus.com/documentation/unity/unity-handtracking/?device=QUEST

「ハンドトラッキングはTouchコントローラーを補完するものであり、高い精度が求められるゲームやクリエイティブツールなど、あらゆるシナリオでコントローラーに置き換わるものではありません」

「つまむ、放す、つまんだままにするなど、単純な手のジェスチャーにより、選択、クリック、スクロール、ドラッグアンドドロップ、戻る、終了などの操作を手で実行することができ」る
「手とコントローラーのどちらでも操作できるUIエレメントを開発でき」る
「PC上でのハンドトラッキングの使用はUnityエディターでサポートされてい」る

開発方法のお役立ちサイト

How to get started with Oculus Quest hands tracking SDK in Unity

↑こちらを参照する

【内容】左手の人差し指でタッチすると青、右では緑、ピンチポーズで赤に変わるサンプルを作る

How to get started with Oculus Quest hands tracking SDK in Unity – Textual Tutorial という解説動画も作ったらしい
(長いけど全部網羅されているという)

1.新しいプロジェクトをUnityで作成する(バージョン:チュートリアルはUnity 2019.2.10f1)

1)android開発にビルド設定を変更する

※ただ、これだと変更後、また情報を入力する必要があるので、別の設定方法が紹介されている

Fileメニュー→ビルド設定のウィンドウから、android開発に変更する代わりに、Player設定を選ぶ


Androidタブから「その他設定」を開き、①会社名を独自のものに変える ②グラフィクスAPIサポートのうち、VulkanAPIを削除する ③最小APIレベルをAndroid4.4(API19) にする。

2.Oculus ハンドトラッキングSDK をダウンロードする?

実は、特別なHand Tracking SDKがあるわけではなく、Oculus Unity SDK に含まれているので、Unityアセットストアから、Oculus Integration を探してUnityプロジェクトにインポートする (10分以上かかった…)

ここで、OVIPlugin とSpatializer pluginのバージョン確認が行われ、古い場合は、最新に変更するか?のウィンドウが出るので、Yesを選択する

3.Unity プロジェクト設定で、VRサポートにチェックをいれる

これはお約束の部分。XR設定のタブで、VRサポートに、Oculusを追加。

 

4.サンプルシーンを開く

AssetsフォルダにOculusフォルダが出来ているので、VR/Scenes/HandTestやSampleFrameworkフォルダ中の、mini-train (Usage\HandsInteractionTrainScene)などを開く

Back to the project: inside the Assets\Oculus folder, you should find the VR subfolder that now contains also scripts and prefabs for basic hands tracking interactions (you can check the scene Assets\Oculus\VR\Scenes\HandTest to see a basic integrations of the hands in Unity), and the SampleFramework folder with the famous example with the mini-train and the 3D buttons that you have surely already seen online (you can check the scene Assets\Oculus\SampleFramework\Usage\HandsInteractionTrainScene for a more complicated sample using hands in Unity).

5.サンプルシーンのビルド&ラン

JavaはUnityをインストールするときに一緒に持ってくるように変わっていた。。。ので、Unity Hubからモジュール追加(Android開発環境のJDKとOPENJDKを追加する)

で、Questをつないで、ビルド&ラン!

うっ!ビルドランは出来たけれど、手が見えない!

もう一つ秘密があるらしい

6.Hand Trackを有効にする~うーん、違う気がする すでに正式バージョンになったので…

How to enable hands tracking on your Oculus Quest

4′ .ビデオマニュアルに戻ってもう一度

Sample SceneからHand Tracking でCubeを動かすまで

①Main Camera を削除

②Prefabから OVRCameraRigをシーンにドラッグ

③インスペクターのOVRManagerタブから Quest Featuresの Hand Tracking Support項目

ここを Controllers and Handsに変更する

Tracking origin TypeをEye Levelから Floor Levelに変える

④OVRHandPrefabをそれぞれ、OVRCameraRig内、LeftHandAnchorとRightHandAnchorの上にドラッグ(子要素にする)

⑤ビルドandランで 手が出た!感動!

 

5´.サンプルシーンのビルド&ラン

ん?なぜか出来た?

7.注意事項

先ほどまでのチャプターでやっていないのは、一番最後の赤文字、OVRHandPrefab中の、OVR Skeeleton スクリプトで、Physics カプセルを有効にする、チェックの部分。両手とも友好にする。

  • Open the scene Assets\Scenes\SampleScene (Unity should have created it for you)
  • Remove the Main Camera gameobject
  • Put in the scene the OVRCameraRig prefab that you find it Oculus\Assets\VR\Prefabs
  • Select the OVRCameraRig gameobject you have just added to the scene. In the inspector, look for the Tracking Origin Type dropdown menu (in the Tracking section) and choose “Floor Level”
  • Always in the inspector of OVRCameraRig, look for Hand Tracking Support (in the Input section) and in the dropdown select “Controllers and Hands”. This will configure the manifest to use hands tracking or the controller. Technically, you can also choose “Hands Only”, but Oculus says that if you do this way, at the moment your app will be rejected from the store
  • Add a cube to your scene (use the little Create menu in the Hierarchy tab and select 3D Object->Cube)
  • Select the cube, and in the inspector, change its Transform so that its Position becomes (0; 1.25; 1) and its Scale 0.35 on all axes. This will be the cube we will interact with our hands
  • Look for the Box Collider component in the Cube and check the Is Trigger flag
  • Expand the OVRCameraRig gameobject, and expand its child. Also expand “LeftHandAnchor” and “RightHandAnchor”
  • Put in the scene the OVRHandPrefab prefab that you find in Oculus\Assets\VR\Prefabs, as a child of LeftHandAnchor. In the inspector of this new gameobject, look for the script OVR Skeleton and check “Enable Physics Capsules”. This will add a capsule collider and a rigidbody to every bone of the hand, so that we can detect its interactions with the other objects of the world.
  • Put in the scene the OVRHandPrefab prefab that you find in Oculus\Assets\VR\Prefabs, as a child of RightHandAnchor. Select it, and in the inspector, change all references from Left Hand to Right Hand (there should be three). Also here, look for the script OVR Skeleton and check “Enable Physics Capsules”.

8.Cubeをつつくスクリプトを導入

ありがとう!出来ました! Thank you ! SkarredGhost!

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

/// <summary>
/// Manages the Cube with the Oculus Hands base functionalities
/// When the Left Index touches the cube, it becomes blue;
/// When the Right Index touches the cube, it become green;
/// When the Left hand pinches the middle finger, it becomes red;
/// </summary>
[RequireComponent(typeof(Collider))]
public class Cube : MonoBehaviour
{
    /// <summary>
    /// Renderer of this cube
    /// </summary>
    private Renderer m_renderer;

    /// <summary>
    /// Reference to the managers of the hands. 
    /// First item is left hand, second item is right hand
    /// </summary>
    private OVRHand[] m_hands; //m_hands[0] 左手 m_hands[1] 右手

    /// <summary>
    /// True if an index tip is inside the cube, false otherwise.
    /// First item is left hand, second item is right hand
    /// </summary>
    private bool[] m_isIndexStaying; //m_isIndexStaying[0] 左手指先がCubeの中かどうか

    /// <summary>
    /// Start
    /// </summary>
    void Start()
    {
        m_renderer = GetComponent<Renderer>();
        m_hands = new OVRHand[]
        {
            GameObject.Find("OVRCameraRig/TrackingSpace/LeftHandAnchor/OVRHandPrefab").GetComponent<OVRHand>(),
            GameObject.Find("OVRCameraRig/TrackingSpace/RightHandAnchor/OVRHandPrefab").GetComponent<OVRHand>()
        };
        m_isIndexStaying = new bool[2] { false, false };

        //we don't want the cube to move over collision, so let's just use a trigger
        GetComponent<Collider>().isTrigger = true;
    }

    /// <summary>
    /// Update
    /// </summary>
    void Update()
    {
        //check for middle finger pinch on the left hand, and make the cube red in this case
        if (m_hands[0].GetFingerIsPinching(OVRHand.HandFinger.Middle))
            m_renderer.material.color = Color.red;
        //if no pinch, and the cube was red, make it white again
        else if (m_renderer.material.color == Color.red)
            m_renderer.material.color = Color.white;
    }

    /// <summary>
    /// Trigger enter.
    /// Notice that this gameobject must have a trigger collider
    /// </summary>
    /// <param name="collider">Collider of interest</param>
    private void OnTriggerEnter(Collider collider)
    {
        //get hand associated with trigger
        int handIdx = GetIndexFingerHandId(collider);

        //if there is an associated hand, it means that an index of one of two hands is entering the cube
        //change the color of the cube accordingly (blue for left hand, green for right one)
        if (handIdx != -1)
        {
            m_renderer.material.color = handIdx == 0 ? m_renderer.material.color = Color.blue : m_renderer.material.color = Color.green;
            m_isIndexStaying[handIdx] = true;
        }
    }

    /// <summary>
    /// Trigger Exit.
    /// Notice that this gameobject must have a trigger collider
    /// </summary>
    /// <param name="collider">Collider of interest</param>
    private void OnTriggerExit(Collider collider)
    {
        //get hand associated with trigger
        int handIdx = GetIndexFingerHandId(collider);

        //if there is an associated hand, it means that an index of one of two hands is levaing the cube, 
        //so set the color of the cube back to white, or to the one of the other hand, if it is in
        if (handIdx != -1)
        {
            m_isIndexStaying[handIdx] = false;
            m_renderer.material.color = m_isIndexStaying[0] ? m_renderer.material.color = Color.blue :
                                        (m_isIndexStaying[1] ? m_renderer.material.color = Color.green : Color.white);
        }
    }

    /// <summary>
    /// Gets the hand id associated with the index finger of the collider passed as parameter, if any
    /// </summary>
    /// <param name="collider">Collider of interest</param>
    /// <returns>0 if the collider represents the finger tip of left hand, 1 if it is the one of right hand, -1 if it is not an index fingertip</returns>
    private int GetIndexFingerHandId(Collider collider)
    {
        //Checking Oculus code, it is possible to see that physics capsules gameobjects always end with _CapsuleCollider
        if (collider.gameObject.name.Contains("_CapsuleCollider"))
        {
            //get the name of the bone from the name of the gameobject, and convert it to an enum value
            string boneName = collider.gameObject.name.Substring(0, collider.gameObject.name.Length - 16);
            OVRPlugin.BoneId boneId = (OVRPlugin.BoneId)Enum.Parse(typeof(OVRPlugin.BoneId), boneName);

            //if it is the tip of the Index
            if (boneId == OVRPlugin.BoneId.Hand_Index3)
                //check if it is left or right hand, and change color accordingly.
                //Notice that absurdly, we don't have a way to detect the type of the hand 
                //so we have to use the hierarchy to detect current hand
                if (collider.transform.IsChildOf(m_hands[0].transform))
                {
                    return 0;
                }
                else if (collider.transform.IsChildOf(m_hands[1].transform))
                {
                    return 1;
                }
        }

        return -1;
    }

}

 

Clusterに持って行くUnity

標準

Cluster社公式から Probuilderを使ってのガイド https://creator.cluster.mu/2020/05/04/howtocreate-probuilder-world/

当Blogでのだいぶ以前にProBuilderの記事書いていた

Cluster World作成メモ

※つかめるアイテム https://creator.cluster.mu/2020/03/30/howto-item-create/

※転がせるボール

※ポストプロセッシングを使ってワールドの光に現実味を与える方法 https://creator.cluster.mu/2020/04/01/howto-postprocessing/

Cluster World Sample Kitを使うまでに

導入の流れ

  • 1.Unityのインストール (2020/5/24現在) 対応バージョンは一つのみ Unity 2019.2.21f1
     インストール時に、追加モジュールが必要
    Windowsの場合

    • Android Build Support
    • iOS Build Support
    • Mac Build Support (Mono)

    macOSの場合

    • Android Build Support
    • iOS Build Support
    • Windows Build Support (Mono)
  • 2.Gitのインストール
    Gitを開いてDownloadからインストールファイルをダウンロードし、Gitをインストールする
    インストール時にいくつか選択肢が出てくるが、全てデフォルトの状態で大丈夫。
    インストール後はWindowsの再起動。
  • 3.Creator Kitの導入
    https://creator.cluster.mu/2020/02/27/helloworld/ を参照のこと)

    Creator Kit Sampleのダウンロード 

    ダウンロード

※Unity Student Pack ←Github Education アカウントから認証 (学生OK, 教員はNG)
(GitHub Student Developer Pack with some of our partners and friends: to give students free access to the best developer tools in one place so they can learn by doing.)

 

ゴージャス背景をFreeアセットで作成するヒント

Youtube

Sketch チャンネル
Assets used: – Post Processing Stack (Unity3D) ~ClusterのCreator Kit Sampleには既に含まれているので利用可
– Rock & Boulders (Manufactura K4)
– Fallen Tree Barrier – Free
– Medieval Chest (Jedairusz)
他にAsset Store Freeのもので

Oculus QuestでSteamVRゲームを遊ぶ VridgeとRiftCat

標準

参考動画(英語)
https://www.youtube.com/watch?v=FsUGO74Dlzw

How To Play Steam VR Games On Your Oculus Quest

(2019/5/14)

ALVR使っていたのですけど、Vridgeのほうがいいのでしょうか?
CyberShoesも動くということですし、、、

※既にOculus Questの開発環境が出来ていることが前提です

1)adb インストールで Oculus Questに Vridgeアプリをインストール

(ライブラリ 提供元不明アプリとして出てくるようです)

こちらのRiftCatのサイトから
https://support.riftcat.com/hc/en-us/articles/360005631080

下のほうにある、マニュアルインストレーションの上から2番目のHereをクリックすると、
apkファイルがダウンロードできる。
デバイスが認識できていることを確認し(adb devices)

adb install -g VridgeQuest5.apk

2)PC側には、RiftCatソフトウェアをインストール

https://riftcat.com/vridge からRiftCatソフトのインストーラーをダウンロードする

3)両方のアプリを立ち上げ、Steamゲームを選ぶ

無料と有料版
無料のRiftCatでは10分間で終了

有料買い切りは 約15ユーロ(1800円ぐらい)

Cybershoes 開発記

標準

<CyberShoesを使うために>

1.サンプルファイル(Unity プロジェクト)

https://github.com/CybershoesVR/CyberRunner?fbclid=IwAR06s3nbkHdaIXMOzmhzBovZBcl8x-ZiBrI-O6Erh_Px3t75o-5d3UVL8g4

Githubに置いてあるものなので、Zipでダウンロード解凍しておく(フォルダのまま)

2.CyverShoes用のドライバ

CyverShoes用のドライバ(と思われるもの)を、
http://cybershoes.io/support
ページの、Manual and Cybershoes software からダウンロードして、実行する 例えば Cybershoes-v19.10.11.exe

信用されないプログラムとして弾かれてしまう設定になってしまうので、詳細から、実行するを選んでいく
※最初についてきた紙の説明書と同じものがpdfファイルで置いてある

3.Oculusソフトウェア

Oculusソフトウェアをたちあげ(OculusソフトウェアはOculusサイトからダウンロードインストール可能。ただし、21GBぐらい、空き容量が必要)、Oculus Riftのセットアップをする

4.SteamVRを起動

5.CyberShoesの接続

CyberShoesをはく。
(チャンネルは青と緑の切り替えが可能。切り替えるためには、サイバーシューズのスイッチを押したほぼ直後に、一瞬インジケートが消えたときに、同じスイッチをすかさず押す。押すたびに、青と緑が切り替わる)
USBの口が足りなくなるので、USBハブ(USB3.0用)を用意するとよい

6.Steam  ホーム

Steam  ホームの画面で、CYボタンをクリックし、CyberShoesのキャリブレーションをする
そのときの注意は、頭の向きと足の向きをあわせてから、キャリブレーション。

□Z-Scalingチェックは、すわってキャリブレーションしていても、立っている位置と認識されるので、必要なときに使う

7. サンプルプロジェクトをプレイ

1.でダウンロード解凍したUnityサンプルプロジェクトフォルダを、Unity Hubでリスト追加し、開く(Unityバージョンは、2019.1.8f1で作成されたもののようです。VRとの関係で2019.1.2f1バージョンにダウングレードして開きましたが、問題なしです)

Raceというシーンを開き、プレイする→CyberShoesで動く!


<追記>

CyberShoes ソフトウェア(  Manual and Cybershoes software )がすでに Cybershoes-v19.10.18.exe  にバージョンアップしていた。

そちらに入っているpdfより
「(引用)

ソフトウェア起動順序
  HTC Vive. 1)Steam 起動 2)ハンドコントローラをオン 3)SteamVR
  Oculus Rift 1)Oculus起動 2)ハンドコントローラ接続 3)Steam起動 4)SteamVR起動
  

VR内で:

1)Cyアイコンをクリック (左手ジョイスティック下、メニューボタンで出る)
2)Calibrate 頭と足の向き合わせ
3)HELP>Start (Youtube ’Cybershoes bindings’参照
4)HELP>Walk/Jump シューズの使い方解説
5)HELP>Oculus Oculusストアゲームのプレイ
6)HELP>Quest VRRidgeアプリとRIFTCAT(PC側)ソフトと5Gルーターがあれば、Questで無線でSteamVRが遊べる

Manual and Cybershoes software より

Oculus Quest

標準

対応するUnity最新バージョンを確認する

Unityバージョンは、
こちらURLで最新対応バージョンが出ています。
2019/10/10現在では、
Unity 2019.1.2.f1です

adb devicesで認識されない

(参考サイト様 https://webbibouroku.com/Blog/Article/adb-interface-driver-update

>adbサーバーの再起動

adb kill-server
adb  start-server
adb devices

Oculusアプリで、そのデバイスの設定>その他の設定で開発者モードがオンになっているか

1.Unity Integrationのインポートとサンプルのビルド実行

assetストアからインストール可能。その時期の最新版に入れ替えを聞いてくるのでyesで。

SampleFramework>AvatarGrabのビルド実行
プレイヤー設定にあたり、会社名をデフォルトのOculusから自分の会社名(仮)に変更すること

結果1.腕のアバターは出ないが、モノをつかんで、それで他のものをふっとばせる

参考サイト様 https://raspberly.hateblo.jp/entry/OculusQuestGrabberGrabbable
【Oculus Quest開発メモ】物を掴む、物を投げる OVR Grabber & Grabbable編【Unity】

細かい設定箇所まで示してくれている参考サイト様
https://framesynthesis.jp/tech/unity/oculusquest/?fbclid=IwAR2w_3OFZAyrJid8fzxSpgYvXUwitohHuFaUBbYt686DtGjsh3ikfp9Pzzw

「(引用)

  • Build SettingsでプラットフォームをAndroidに変更する
  • Build SettingsのTexture Compression(テクスチャの圧縮方式)をASTCに変更する
  • Player Settings… で Graphics APIs の Vulkan を削除する
  • Player Settings… で、Minimum API Levelを「Android 6.0 ‘Marshmallow’ (API level 23)」以上に変更する
  • Package Nameの「com.Company.ProductName」のCompanyとProductNameを適当な組織名とプロダクト名で書き換える
  • XR Settingsにある「Virtual Reality Supported」をチェックして、右下の+ボタンを押してOculusを追加する
  • Asset StoreにあるOculus Integrationをインポート(OVRPlugin 等をアップデートするダイヤログが出たら従う)」

■Oculus Integration Versioin 2019/10/16現在 1.41

1.このバージョンでは、Buildのときに、IDが求められる。
試し用のIDは、こちら
https://developer.oculus.com/documentation/avatarsdk/latest/concepts/avatars-gsg-unity-mobile/#testing-your-integration

これらのうち、どれかをculus > Avatars > Edit Settings に入力する。

2.上と同じページ、下のほうに、モバイルでは、アバターが透明になって動かない対処法が書かれていた

Troubleshooting

Issue: On Mobile, Avatars are translucent and do not move.

Select Edit > Project Settings > Player Settings. Under Android settings, uncheck Auto Graphics API and make sure that only OpenGLES3 is present in the list that appears.

 

結果2:最新バージョンで成功(理由は不明)

Oculus Integration V1.40
Unity2019.1.2f1