본문 바로가기
Project

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

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

 < juggling 만들기 >

 

1. 공 한 개 정글링 ( 위아래 움직임만 반영 )

 

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

public class j : MonoBehaviour
{
    Frame frame;
    Controller controller;
    GameObject ball,R1;
    Rigidbody rigid,rh;
    public GameObject R,L;
    public bool oneHand;
    public bool twoHand;
    bool a = false;
    Vector v,vr;

    // Start is called before the first frame update
    void Start()
    {
        controller = new Controller();
        ball = GameObject.Find("ball");
        rigid = ball.GetComponent<Rigidbody>();

    }

    // Update is called once per frame
    void Update()
    {
        Hand hand, thand;
        frame = controller.Frame();
        if (frame != null && frame.Hands.Count >= 1)
        {
            hand = frame.Hands[0];
            thand = frame.Hands[1];
            rigid.useGravity = true;

            float grab = hand.GrabStrength;
            Vector yaw = hand.PalmNormal;
            
            if (a==false && yaw.x > 0 && yaw.y>0 && yaw.z>0)
            {
                if(hand.IsRight == true)
                {
                    ball.transform.position = new Vector3(L.transform.position.x, L.transform.position.y + 0.1f, L.transform.position.z);
                }
                else
                {
                    ball.transform.position = new Vector3(R.transform.position.x, R.transform.position.y + 0.1f, R.transform.position.z);
                }

                v = hand.PalmVelocity;
                
                if (v.y > 100 && v.x>50 && v.z>50)
                {
                    vr.x = v.x;
                    vr.y = v.y;
                    vr.z = v.z;
                    a = true;
                    ball.GetComponent<Rigidbody>().AddForce(new Vector3(0, vr.y * 0.4f, 0), ForceMode.Force);
                }
            }
            if(grab == 1)
                a = false;
        }
    }

}

 

기본적으로 공과 손에 대한 충돌처리 존재 -> 이 때문에 공을 쥐면 가만히 잡혀 있는 것이 아니라 튕겨 나가거나 굴려서 빠져나감 -> 공 생성 직전에는 위치를 고정 시켜 줌.

 

손바닥을 위로하여 쥐고 피면 공이 다시 생기게 설정 -> 손이 가리키는 방향의 노말 벡터를 이용( palmnormal )

 

손의 Y축 가속도를 이용하여 공에 물리적 힘을 가해 줌. ( 이때 : 위아래만 움직이는 공을 실험 )

 

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

 

결과동영상 : https://youtu.be/9zIk_AREHv8

 

문제점 : 중간에 제대로 공이 날라가지 않는 문제 -> 손을 쥘 때 공이 다시 생성되게 하였는데 이때 공을 던진 상태에서 애매한 손을 쥘 때로 인식하여 공을 다시 가져오는 문제 

 

고려할 점 1. 거리가 멀다고 공이 떨어졌다고 볼 수 없음. (높게 위로 던진 경우도 고려) -> 거리로 판단 X

 

이를 해결하기 위한 방법 1. 공의 y위치보다 손의 y축 위치가 크면 공이 손에서 떨어졌음 인식 가능  

반응형

댓글