🕶️

Nreal Light② 指先からパーティクルを出す

2021/11/13に公開

Nreal Lightのハンドトラッキングのデモシーンを起動する方法を紹介した記事は沢山あるけど、実際に自分のプロジェクトを作成する時にどのように実装すれば良いのか分からずお困りではありませんか?

今回は三部に分けて指先からパーティクルを出す方法や、ピンチポーズ(摘まむポーズ)をすることでポイントライトをオンにする方法を初心者の方にも分かりやすいように解説していきます。

https://www.youtube.com/watch?v=m3UUt0CXHTc

第一部 ハンドトラッキング準備
第二部 指先からパーティクルを出す
第三部 ピンチポーズでライトをオンにする

もくじ

  • 環境開発
  • 手のモデルを非表示にする
  • スクリプトを作成
  • パーティクルを作成
  • 作成したパーティクルを指先に適用

開発環境

Unity 2020.3.17f
NRSDK 1.6.0

https://nrealsdkdoc.readthedocs.io/en/v1.7.0/Docs/Unity_EN/Develop/Quickstart for Android.html

手のモデルを非表示にする

必須ではありませんが、手のモデルが見えない方が指先から出るパーティクルを目立たせられるので非表示にします。

HierarchyのNRHand_Rの子になっているNRhandCapsuleVisual_Rを選択してInspectorでチェックを外してください。

左手も同様に行ってください。

NRhandCapsuleVisualはモデルを表示させるためのものなので、あくまで手のモデルが非表示になっただけで手の認識はされています。

スクリプトを作成

Projectウィンドウで右クリックしてCreate → C# Scriptを選択するとスクリプトを作成できるので任意の名前を付けてください。

ここではShowHandParticleにしました。

作成したShowHandParticleスクリプトをHierarchyのNRHand_Rにドラッグ&ドロップしてください。

これでNRHand_RにShowHandParticleスクリプトがアタッチされて関連付けられました。

続いてスクリプトの内容を記述していきますのでShowHandParticleスクリプトをダブルクリックしてMicrosoft Visual Studioなどコードを記述するソフト(IDE)を開いて下記のコードを記述してください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using NRKernal; //NRSDKの機能を使用する場合は必ず記載。

public class ShowHandParticle : MonoBehaviour
{
    public HandEnum handEnum; //ハンドトラッキングの様々な情報を参照できる。
    public GameObject[] particles = new GameObject[2]; //指先から出すパーティクルをInspectorから入れる。
    private Vector3[] fingerPositions = new Vector3[2]; //パーティクルの出す位置として各指の位置の情報を保管。
    
     // Start is called before the first frame update
    void Start()
    {
       
    }

    // Update is called once per frame
    void Update()
    {
        var handState = NRInput.Hands.GetHandState(handEnum); //Update()の中に記述することで常に手の状態をチェックして更新する。
        if (handState.isTracked) //グラスの視界内に手が映ってトラッキングされているかどうか判定。
        {
            fingerPositions[0] = handState.GetJointPose(HandJointID.ThumbTip).position; //fingerPosition[0]に親指の位置を指定。
            fingerPositions[1] = handState.GetJointPose(HandJointID.IndexTip).position; //fingerPosition[1]に人差し指の位置を指定。
            for (int i = 0; i < fingerPositions.Length; i++)
            {
                particles[i].SetActive(true); //各パーティクルをオンにする。
                particles[i].transform.position = fingerPositions[i]; //各パーティクルを出す位置を指定。 
                if (particles[1])
                {
                    particles[1].transform.position = fingerPositions[1];
                }
            }
        }
        else if (!handState.isTracked)
        {
            for (int i = 0; i < fingerPositions.Length; i++)
            {
                particles[i].SetActive(false); //グラスの視界内に手が映ってトラッキングされていない場合は各パーティクルをオフにする。
            }
        }
    }
}

今回は親指と人差し指の先端からのみパーティクルを出すので各配列を[2]に設定していますが全ての指先から出したい場合は各配列を[5]に設定してif分の中で他の指先も指定して追記してください。

各指先の指定に使用する名前は以下の通りです。

名前
親指 ThumbTip
人差し指 IndexTip
中指 MiddleTip
薬指 RingTip
小指 PinkyTip

https://nrealsdkdoc.readthedocs.io/en/v1.7.0/Docs/Unity_EN/Develop/Hand Tracking.html

パーティクルを作成

UnityエディターのHierarchyウィンドウで右クリックしてEffects → Particle Systemを選択してパーティクルを作成します。

作成したパーティクルを選択してInspectorから各項目を以下のように設定してください。

Transform
Scale X 0.03 Y 0.03 Z 0.03

Particle System
StartSpeed 0
Start Color 任意の色を指定

Shape
Shape Sphere
Radius 0.3

設定が完了したら作成したパーティクルをHierarcheyで右クリック、Duplicateを選択してパーティクルを複製してください。

複製したパーティクルの色を変えておくと違いがわかり易いかもしれません。

作成したパーティクルを指先に適用

HierarchyのNRHand_Rを選択してInspectorで先ほどアタッチしたShowHandParticle(Script)のHandEnumをRightHandに設定。

同じくShowHandParticle(Script)でParticlesの左にある矢印をクリックして、枠内に作成したパーティクルをHierarchyからそれぞれドラッグ&ドロップします。

Unityエディターでシーンを再生してみましょう。

Gameビューのタブを選択した後、Shiftを押しながらマウスを動かすと親指と人差し指の先端の位置からパーティクルが出ていることが確認できます。

Discussion