본문 바로가기
Project

[unity + leap motion project] 립모션 제스처 만들기 프로젝트 4번째 정리

by 배애앰이 좋아 2020. 3. 25.
반응형

< juggling 만들기 >

 

3번째 프로젝트의 오류 보완과 공의 움직임 보완하여 다시 짠 코드

 

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

public class j2 : MonoBehaviour
{
    Frame frame;
    Controller controller;
    public GameObject ball1;
    public GameObject R, L;
    Rigidbody rigid;
    Vector v, vr;
    bool check = true;
    bool a = false;

    void Start()
    {
        controller = new Controller();
        rigid = ball1.GetComponent<Rigidbody>();
        ball1.transform.position = new Vector3(-0.009f, 0.117f, 0.241f);
    }

    void Update()
    {
        if (Input.GetKey(KeyCode.Space))
        {
            rigid.useGravity = true;
            ball1.GetComponent<ConstantForce>().enabled = true;
        }

        Hand hand, otherhand;
        Vector3 handposition;
        frame = controller.Frame();
        if (frame != null)
        {
            if(frame.Hands.Count == 1)
            {
                hand = frame.Hands[0];
                if(a == false)
                {
                    if (hand.IsRight == false)
                    {
                        handposition = new Vector3(L.transform.position.x, L.transform.position.y, L.transform.position.z);
                        if (Vector3.Distance(handposition, ball1.transform.position) < 0.12)
                        {
                            rigid.useGravity = true;
                            ball1.GetComponent<ConstantForce>().enabled = true;
                            ball1.transform.position = new Vector3(L.transform.position.x, L.transform.position.y + 0.07f, L.transform.position.z);
                            check = false;
                        }
                    }
                    else
                    {
                        handposition = new Vector3(R.transform.position.x, R.transform.position.y, R.transform.position.z);
                        if (Vector3.Distance(handposition, ball1.transform.position) < 0.12)
                        {
                            rigid.useGravity = true;
                            ball1.GetComponent<ConstantForce>().enabled = true;
                            ball1.transform.position = new Vector3(R.transform.position.x, R.transform.position.y+ 0.07f, R.transform.position.z);
                            check = false;
                        }
                    }
                }

                v = hand.PalmVelocity;

                if (Mathf.Abs(v.y) > 500 && check == false)
                {
                    //Debug.Log("던졌음");
                    a = true;
                    vr.x = v.x;
                    vr.y = v.y;
                    vr.z = v.z;
                    ball1.GetComponent<Rigidbody>().AddForce(new Vector3(vr.x * 0.0001f, vr.y * 0.01f, vr.z), ForceMode.Force);
                }
            } 
            else
            {
                int num = 0;
                hand = frame.Hands[0];
                otherhand = frame.Hands[1];
                if (a == false)
                {
                    handposition = new Vector3(L.transform.position.x, L.transform.position.y, L.transform.position.z);
                    if (Vector3.Distance(handposition, ball1.transform.position) < 0.12)
                    {
                        rigid.useGravity = true;
                        ball1.GetComponent<ConstantForce>().enabled = true;
                        ball1.transform.position = new Vector3(L.transform.position.x, L.transform.position.y + 0.07f, L.transform.position.z);
                        check = false;
                        num = 2;
                    }
                    handposition = new Vector3(R.transform.position.x, R.transform.position.y, R.transform.position.z);
                    if (Vector3.Distance(handposition, ball1.transform.position) < 0.12)
                    {
                        rigid.useGravity = true;
                        ball1.GetComponent<ConstantForce>().enabled = true;
                        ball1.transform.position = new Vector3(R.transform.position.x, R.transform.position.y + 0.07f, R.transform.position.z);
                        check = false;
                        num = 1;
                    }
                }

                if (hand.IsLeft == true)
                {
                    if(num == 2)
                    {
                        v = hand.PalmVelocity;
                    }
                    else
                    {
                        v = otherhand.PalmVelocity;
                    }
                }
                else
                {

                    if (num == 1)
                    {
                        v = hand.PalmVelocity;
                    }
                    else
                    {
                        v = otherhand.PalmVelocity;
                    }
                }

                if (Mathf.Abs(v.y) > 500 && check == false)
                {
                    Debug.Log("던졌음");
                    a = true;
                    vr.x = v.x;
                    vr.y = v.y;
                    vr.z = v.z;
                    Debug.Log(Mathf.Abs(v.y));
                    ball1.GetComponent<Rigidbody>().AddForce(new Vector3(vr.x * 0.00001f, vr.y * 0.001f, vr.z), ForceMode.Force);
                }

            }
        }
    }

    public void colliderCube()
    {
        rigid.velocity = new Vector3(0, 0, 0);
        rigid.useGravity = false;
        ball1.GetComponent<ConstantForce>().enabled = false;
        ball1.transform.position = new Vector3(-0.009f, 0.117f, 0.241f);
        a = false;
        check = true;
    }

}

 

공의 움직임을 스무스하기 위해 중력값을 조정

 

[leap motion project] test 1 : 공 한 개와 한 손으로 해 본 결과( 위아래 움직임(Y축)만 공에 적용 )

 

결과 동영상 : https://youtu.be/8LjSGBfECL4

 

[leap motion project] test 2 : 공 한 개와 두 손으로 해 본 결과( 위아래좌우 움직임(X, Y축)만 공에 적용

 

결과 동영상 : https://youtu.be/UhkWxrwfuMA

 

보다싶이 두 손을 가지고 주고 받는 것이 잘 되지 않음. 이를 해결하기 위해 정글링 동영상을 살펴본 결과 중점적으로 본 특징 2가지가 있음.

 

1. 공이 포물선을 그린다.

 

2. 공이 손에 쥐어줬다가 다시 빠져나간다.

 

그 다음 프로젝트에서는 포물선을 그리는 것부터 다시 구현할 계획.

반응형

댓글