이전에 마스크를 얼굴에 씌워봤는데 이번에는 동영상을 올려보겠다.

하이라키+를 누르고 CreateEmpty만들고 이름을 FaceModel로 하고 Transform을 리셋한다. 삼점을 누르면 된다.

 

FaceModel을 선택하고 MeshFilter, MeshRendere, MeshCollider, AR Face, AR Mesh Visualizer를 추가한다.

 

얼굴에 덮을 이미지를 적당히 찾는다 png가 좋다.

유니티 Material Folder로 가져온후 인스펙터에서 Transparecy 체크하고 apply

Material을 하나 만들고 M_Face로 하나 만들고 Redering Mode를 Cutout PNG를 Albedo 왼쪽에 끌어다 놓는다.

 

하이라키 FaceModel을 선택하고 머터리얼 M_Face를 끌어다 Materials Element 0 에 넣어준다.

이제 하이라키의 FaceModel을 프로젝트 Prefabs폴더에 끌어다 놓고 프리팹으로 만든다.

만든 프리팹을 하이라키의 AR Session Orign을 선택하고 AR Face Manager컴포넌트의 Face Prefab에 끌어다  적용한다.

하이라키의 FaceModel은 지운다.

빌드앤런 해보면 잘된다. 마스크가 3D로 적용된다 .

첫날은 MyMask라는 빈 오브젝트에 Mask라는 Quad에 M_Mask를 머터리얼로 얹은 2D 평면이었지만 이번에 만든 FaceModel은 3D화 되었다.

 

빈오브젝트에 이것저것 넣어서 만들기 귀찮으면

하이라키에서 우클릭후 AR Default Face를 추가하고 M_Face 머터리얼을 추가해고  AR Face Manager 프리팹에 적용해도 같은 효과가 난다.

 

이제 동영상을 마스크 대신 띄워보자 인터넷에서 영상을 캡쳐해서 머터리얼 폴더로 끌고오자.

하이라키에 CreateEmpty를 만들고 이름을 FaceVideo로 하자

VideoPlayer Component를 추가하고 비디오를 끌어다 Source에 연결해주자 Loop 체크하고 Mute를 체크해서 소리를 꺼준다.

 

프로젝트창 우클릭후 Create>RenderTexture를 만든다. 이름은 FaceVideoRT로 변경하고 이걸 하이라키의 FaceVideo의 TargetTexture에 넣어준다.

프로젝트창에 Create>Material만들고 이름을 M_FaceVideo로 한다. 알베도 왼쪽에 FaceVideoRT를 넣어준다.

 

아까 만든 FaceModel 프리팹을 열어 Matarial에 M_FaceVideo를 연결해준다. 

하이라키의 AR Session Orign>AR Face Manager의 Face Prefab에 Face Model을 연결해주자

정리해보면 M_FaceVideoRT 를 FaceVideoRT>알베도에 놓고 FaceVideoRT 를 M_FaceVideo->Target Texture 에 넣고 M_FaceVideo를 Face Mdel->Material-에 넣고 Face Mode을 AR FaceManager->Face prefab에 넣는다.

빌드런 해보면 잘된다.

 

Cavas 버튼을 2개더 복사해서 좌우로 펼쳐준다

 

버튼을 선택하고 이미지를 지워주자

 

Text를 Image Video로 바꾸고 폰트사이즈를 48로 키워준다.

UI_Manager 스크립트에 머터리얼 행 변수와 SwitchMaterial()함수를 만들어준다

    public Material[] faceMats;

    public void SwitchMaterial(int num)
    {

    }

하이라키의 Canvas를 선택하고 UI Manager(Script)의 Face Mats +를 2번 눌러 Element를 2개 만들고 Material을 2개 연결해준다.

 

2개의 버튼이 함수는 SwitchMaterial로 똑같지만. Button Image OnClick()은 0,ButtonVideo OnClick()은 1로 설정한다.

해본면 안된다. 아직 SwitchMaterial()함수를 정의 안해서 그런것 같다.

눈코입 위치 인식하기

C#스크립트를 만들고 FindDetection 이라고 한다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARCore;
using Unity.Collections;

public class FindDetection : MonoBehaviour
{
    public ARFaceManager afm; 
    public GameObject cube;  //얼굴에 띄워줄 cubeObject
    List<GameObject> faceCubes = new List<GameObject>();
    ARCoreFaceSubsystem subSys;
    NativeArray<ARCoreFaceRegionData> regionData;
    // Start is called before the first frame update
    void Start()
    {
        //얼굴 위치 표시를 위한 큐브 3개 생성
        for(int i = 0; i < 3; i++)
        {
            GameObject go = Instantiate(cube);
            faceCubes.Add(go);
            go.SetActive(false);
        }
        //얼굴 인식 함수 연결
        afm.facesChanged += OnDetectPoints;  //얼굴이 변화될때 아래 정의된 함수를 델리게이션 추가
        subSys = (ARCoreFaceSubsystem)afm.subsystem; //서브시스템의 정보를 가져와 저장한다.
    }
    //얼굴이 인식될 대마다 실행할 함수
    void OnDetectPoints(ARFacesChangedEventArgs args)
    {
        //얼굴 정보가 갱신된 것이 있다면
        if (args.updated.Count > 0)
        {
            //인식된 얼굴에서 특정 위치를 가져옴
            subSys.GetRegionPoses(args.updated[0].trackableId, Allocator.Persistent, ref regionData);
            //인식된 얼굴을 특정 위치에 오브젝트 배치
            for(int i = 0; i < regionData.Length; i++)
            {
                faceCubes[i].transform.position = regionData[i].pose.position;
                faceCubes[i].transform.rotation = regionData[i].pose.rotation;
                faceCubes[i].SetActive(true);
            }
        }
        //얼굴 정보를 잃었다면
        else if (args.removed.Count > 0)
        {
            //큐브오브젝 비활성화
            for( int i = 0; i< regionData.Length; i++)
            {
                faceCubes[i].SetActive(false);
            }
        }
    }
    // Update is called once per frame
    void Update()
    {
        
    }
}

하이라키+를 눌러 빈게임 오브젝트를 만들고 이름을 FaceElements로 한다  FindDetection을 끌어다 놓고 AR Session Origin을 끌어다 afm에 연결해준다.

하이라키+ 3D 오브젝트>Cube를 추가한다. 스케일을 0.02로 한다.

Cube를 프리팹폴더로 옮겨서 프리팹으로 만들고 FaceElements를 선택해서 Cube프리팹을 끌어다 놓는다.

빌드앤런 해보면 잘된 아까 페이스 위에 큐브 3개가 나온다.

+ Recent posts