유니티로 Vtuber용 표정 제어 장비 만들기

9468 단어 UnityVtuber

자기소개


안녕하십니까, 저는 유자입니다@Yuzu_Unity

입문


저는 Vtuber의 표정 컨트롤 방법이 몇 가지가 있다고 생각해요.
나는 나의 가장 좋은 시스템을 고려해 보았다.
실시간 및 후속 수정
일단 원하는 기능은요.
OVR 립싱크
수동 (컨트롤러 스냅 포함)
아이폰 등의 얼굴 추적(스냅 포함)
또한 이러한 혼합 상황의 조정, 기록 기능, 타임라인의 재생 모드 밖 표시
여기까지 왔으면 더 이상 원하는 게 없겠지.
VtuberFacialRigDemo pic.twitter.com/aK3fh9cmpI - 유자(@Yuzu_Unity)2019년 4월 30일

설계


기본적으로 3DCG의 혼합 변형된 얼굴 장비를 참고하여 제작되었습니다.p>

FacialWeight를 사용하여 FacialRig 매개변수의 혼합 정도를 관리합니다.

수조(기록시스템 참조)를 사용할 수 없기 때문에 상당히 번거롭다


레코드 시스템


몇 편의 보도를 보았는데, 왜 json으로 저장하고 있는지 모르겠다
자제하는 경우가 많지만 처리도 무거워 사용하기 어렵다p>

※ 유니티는 표준 애니메이션 편집 기록 기능이 있습니다!!(편집기 전용)

GameObjectRecorder(※ Unity 버전에 따라 API가 다르므로 공식 참조)

https://docs.unity3d.com/2018.3/Documentation/ScriptReference/Animations.GameObjectRecorder.html

이거 알면 다들 갈아타세요~(봉)

물론 처리할 부하도 없고, 프레임의 차이가 없으면 키프레임도 맞지 않는다p>
근데... 좀 안 쓰인다

구성 요소를 포착하면 모든 차이가 포착됩니다.

필요하지 않은 부분을 배제할 수 없습니다... (방법이 있으면 알려주세요...)

따라서 포획 전용 구성 요소(C# 클래스)를 별도로 생성해야 합니다

유니티 애니메이션에서 스크립트 변수를 옮긴 적이 있는 분들은 아실 거예요.
키프레임을 치는 조건은 다음과 같다.p>

서열화(public 또는 [SerializeField])

배열이나 리스트가 아니라...배열을 사용할 수 없습니다. 매우 번거롭습니다.

(편집기 확장을 사용해도 해결되지 않음...키프레임이 제대로 작동하지 않음)


BlendShape의 모든 매개변수 등 키프레임의 몇 분 동안 변수를 배치합니다.

다시 다른 배열을 넣을게요.p>


FacialRigcs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//プレイモード外でも実行
[ExecuteInEditMode]
public class FacialRig : MonoBehaviour
{
    [Range(0, 100)]
    public int a, i, u, e, o, blink;

    [HideInInspector]
    public int[] facilValue=new int[6];


    void Update()
    {
        facilValue[0] = a;
        facilValue[1] = i;
        facilValue[2] = u;
        facilValue[3] = e;
        facilValue[4] = o;
        facilValue[5] = blink;
    }
}


이후 기록용 스크립트를 준비하면 완성됩니다.

재생 시 레코드 시작


RecordFacialRig.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//忘れずに
using UnityEditor.Animations;
public class RecordFacialRig : MonoBehaviour
{
    public AnimationClip clip;
    private GameObjectRecorder gameObjectrecorder;

    void Start()
    {
        // Animatorコンポーネントをつけるオブジェクト
        gameObjectrecorder = new GameObjectRecorder(gameObject);

        /* ここにバインドしたいコンポーネント記述(今回はFacialRig
        このスクリプトがアタッチしているオブジェクトからGetComponentを行う)*/
        gameObjectrecorder.BindComponentsOfType<FacialRig>(gameObject, true);
    }

    void LateUpdate()
    {
        if (clip == null)
            return;

        // フレームごとにキーフレームを打つ
        gameObjectrecorder.TakeSnapshot(Time.deltaTime);
    }

    void OnDisable()
    {
        if (clip == null)
            return;

        if (gameObjectrecorder.isRecording)
        {
            // アニメーションクリップに保存
            gameObjectrecorder.SaveToClip(clip);
        }
    }
}



다음은 OVRLLipSync를 편집하여 파라미터를 FacialRig로 흐르게 하고 포착한 것입니다


디자인 기반 FacialManager 스크립트 만들기


마지막으로 FacialManager에서 매개변수를 혼합하여 메쉬에 적용합니다.

FacialRig.cs의facilValue를 사용하여 FacialWeightValue를 곱한 값

Clamp를 가산하는 간단한 작업이기 때문에 코드가 생략되었습니다

※ [Execute InEditMode] 잊지 마세요p>

FacialRig 구성 요소가 Timeline에 설치되어 다양한 AnimationTrack의 그림
구성


iPhoneX계의 표정 획득 방법 향후 기술

좋은 웹페이지 즐겨찾기