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;
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>
Reference
이 문제에 관하여(LeapMotion에서 라이브 2차원 모델의 손가락 이동), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Tokinashi/items/ee43f99b8f2892cd3d8a
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(LeapMotion에서 라이브 2차원 모델의 손가락 이동), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Tokinashi/items/ee43f99b8f2892cd3d8a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)