LeapMotion에서 라이브 2차원 모델의 손가락 이동

입문


Unity(C#)에서 LeapMotion에서 손가락 각도를 가져와 라이브 2D 모델을 실시간으로 이동하는 방법
그렇구나!!생각보다 손가락 구부림 쉬워요!!!(개인 차이는 매개 변수를 조정해야 할 수 있다. 도대체 내 손에 최적화된 것이다) 모형을 사용하여 새 총수@bird_w_cooking를 빌려 제작 중인 모형의 팔#leapmotion#Live2D#Unity-무시(@KalsaKey)pic.twitter.com/U1mGrNsQTk

환경


Unity : 2019.2.2f1

Live2D SDK : 4.0-beta.2

LeapMotion SDK : 4.4.0

Live 2D 모델 내보내기 파일: 다음 이미지

December 11, 2019

이번에 사용된 팔 모형은 Live2D 삽화가·모형사의 새 총수의 허가를 받아 사용한 것이다

준비


Live2D


공식 튜토리얼 페이지의 에 따라 SDK 및 모델 가져오기

LeapMotion


SDK 가져오기에서 UnityPackage
가져오기
여기서부터 문제지

대부분 LeapHandController 프리젠테이션을 hierruki에 넣는다고 쓰여 있지만 적어도 내 환경에서는 몇 번 문제를 가져와도 스크립트는missing이기 때문에 사용할 수 없습니다.

Unity용 SDK

따라서 SDK와 함께 제공되는 예제 장면에서 복사합니다.

참고로 아래의 기술이다p>


Assets/LeapMotion/Core/Examples/Capsule Hands(Desktop)에서 LeapMotionController와 HandModels를 복사하여 장면에 붙여넣습니다.

참조


실제 코드


이 스크립트를 Live2D 모델에 추가

MovingArm.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Leap;
using Live2D.Cubism.Core;
using Live2D.Cubism.Framework;

public class MoveArm : MonoBehaviour
{
    private CubismModel _model;
    private Controller controller;
    private Dictionary<Leap.Finger.FingerType, CubismParameter> modelfingers;

    // Start is called before the first frame update
    void Start()
    {
        controller = new Controller();
        _model = this.FindCubismModel();

        modelfingers = new Dictionary<Leap.Finger.FingerType, CubismParameter>();
        modelfingers.Add(Leap.Finger.FingerType.TYPE_INDEX, _model.Parameters[1]);
        modelfingers.Add(Leap.Finger.FingerType.TYPE_MIDDLE, _model.Parameters[2]);
        modelfingers.Add(Leap.Finger.FingerType.TYPE_RING, _model.Parameters[3]);
        modelfingers.Add(Leap.Finger.FingerType.TYPE_PINKY, _model.Parameters[4]);
        modelfingers.Add(Leap.Finger.FingerType.TYPE_THUMB, _model.Parameters[5]);
    }
    private void LateUpdate()
    {
        Frame frame = controller.Frame();

        if (frame.Hands.Count != 0)
        {
            List<Hand> hand = frame.Hands;
            var fingers = hand[0].Fingers;
            foreach (Finger finger in fingers)
            {
                if (finger.Type == Leap.Finger.FingerType.TYPE_UNKNOWN) continue;

                var angle = Mathf.PI - finger.Direction.AngleTo(hand[0].Direction);
                var param = EditParam(angle, 0f, Mathf.PI, -30, 30);

                if (finger.Type == Leap.Finger.FingerType.TYPE_THUMB)
                {
                    angle = finger.Direction.AngleTo(hand[0].PalmNormal);
                    param = EditParam(angle, 1.0f, 1.27f, -30, 30);
                    Debug.Log("THUMB " + angle + " " + param);
                }

                modelfingers[finger.Type].Value = param;
            }
        }
    }
    private float EditParam(float param,float leapmin,float leapmax, float modelmin,float modelmax)
    {
        return (param - leapmin) * ((modelmax - modelmin) / (leapmax - leapmin)) + modelmin;
    }
}



해설


using


LeapMotion 기능 → using Leap;

Live2D 기능 → using Live2D.Cubism.Core;
using Live2D.Cubism.Framework;


modelfingers 이 사전은 무엇입니까


Finger류에서 얻은 Finger형 대상의 손가락 종류(엄지, 검지, 중지, 약지, 새끼손가락, 불분명)는 얻을 수 있다LeapMotion+Unity에서 Go Jochi Pa 식별모델의 각 손가락 매개 변수의 순서에 따라(예를 들어 이번 모델의 검지는 두 번째 위치에 있기 때문에 0부터_model.Parameters[1]) 각 손가락의 종류와 모델의 매개 변수 대상

FingerType


앵글이 뭐예요?


finger.Direction 손가락이 가리키는 각도
hand[0].Direction 손가락 각도(Vector)
AngleTo()에서 각 벡터 간의 각도 얻기

이번 모델의 동작(Angle 매개 변수 최대(30), 손가락 스트레칭 최소(-30) 손가락 구부림)과 AngleTo가 얻을 수 있는 수치는 상반되기 때문에 180도Mathf.PI 반전

EditParam(angle, 1.0f, 1.27f, -30, 30);


미안하지만, 나는 얻은 값을 로그에서 펼치고, 직접 값의 최대 최소값을 입력한다
엄지손가락만 구부러진 각도가 많이 달라요...

여기가 더 많은 방법이 있을 것 같아요.

마지막


만약 오류, 설명이 부족한 부분이 있으면 메시지를 남기거나 편집을 요구하십시오p>

좋은 웹페이지 즐겨찾기