Unity3D總結記錄(十八) Unity中leapMotion與粒子系統互動

NO IMAGE
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

      Unity中,Leapmotion一共由兩個元件組成,在leapmotion的untiy官方包中有預製物體,一個HandModels一個Leap Motion Controller,在HandModels中更換手的樣式,具體程式設計和演算法需參考官方SDK,連結如下:

https://developer-archive.leapmotion.com/documentation/csharp/api/Leap.Hand.html?proglang=csharp

      在其中選擇自己適合的程式語言,值得注意的是,我看了官方SDK的說明後,發現把很多朋友說的Gesture這個類,好像是取消了,找了很久都沒找到這個類,有待後期挖掘。

      在SDK的操作中,如果需要對finger或者Bone操作,整體的思路就是首先要在Update中尋找CurrueFrame.然後,再在Frame中對手進行遍歷,尋找到自己需要的左右或者右手,再把自己需要操作的手進行遍歷尋找到finger,再把finger遍歷尋找bone,這樣一層一層的找下去,在對應的層中,才能對相應的物件進行操作。按照SDK中的解說,可對每一項進行向量或者float,length的操作。

      如需要使用粒子系統跟蹤手的位置,需要對粒子進行操作的話,我這裡實驗了很久,參照官方API,先獲取粒子,然後對粒子進行遍歷,在遍歷中對粒子的positon進行設定,試了很久都不行。也不知道為什麼,可能是我本人的方法不對。最後,我改變方向,獲取粒子後,對粒子的速度進行設定,設定粒子的速度為tartget.postion-particles.postion,這樣達到了我的預期,粒子會跟著手動了,完美解決。

     如在leapmotion中需要攝像機跟著leapmotion的手指方向進行旋轉,只需要將攝像機LookAt(finger.TipPosition)即可。但是,這樣會旋轉的非常快,靈敏度很高,如真的在開發中使用此功能,需要優化。

                        Vector3 fingerTip = finger.TipPosition.ToVector3();
                        gameObject.transform.LookAt(fingerTip);

    現將程式碼貼出來,分享給大家:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Leap;
using Leap.Unity;

public class particleSystemStrip : MonoBehaviour
{
    ParticleSystem m_System;
    LeapProvider provider;
    ParticleSystem.Particle[] m_Particles;

    public float m_Drift = 0.01f;
    public float speed = 0.01f;

    private void Start()
    {
        //m_System = FindObjectOfType<ParticleSystem>();
        m_System = gameObject.GetComponent<ParticleSystem>();  //獲取粒子系統
        provider = FindObjectOfType<LeapProvider>() as LeapProvider;  //尋找leapmotion控制器

    }

    private void Update()
    {
        Frame mFrame = provider.CurrentFrame;   //獲取Leapmotion的Frame
        m_Particles = new ParticleSystem.Particle[m_System.particleCount];

        int cout = m_System.GetParticles(m_Particles); //獲取當前活著的粒子數

        foreach (Hand hand in mFrame.Hands)
        {
            if (hand.IsLeft)

            {

                foreach (Finger finger in hand.Fingers)
                {
                    if (finger.Type==Finger.FingerType.TYPE_INDEX&finger.IsExtended)
                    {
                        Vector3 tipFinger = finger.TipPosition.ToVector3();
                        for (var i = 0; i < cout; i )
                        {
                            m_Particles[i].velocity = tipFinger – m_Particles[i].position;  //設定每一個粒子的速度,方向
                            m_System.SetParticles(m_Particles, cout);   //設定該粒子系統的粒子
                        }
                    }
                }
            }
        }

    }
}

程式語言 最新文章