[Unity] AR Face Mask 변경하기

limce·2025년 3월 29일

Unity

목록 보기
1/6
post-thumbnail

AR Face Mask 변경하기

이전 글에서 언급했듯, 자폐 아동을 위한 감정/표정 학습 게임을 개발하고 있다.
학습 1단계에서는 표정을 따라할 수 있도록 아동의 얼굴 위에 표정 가이드 이미지를 오버레이 하려고 한다.
이를 위해 Face Mask를 가이드 이미지로 변경하려고 한다.

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

public enum EEmotion
{
    Happy,
    Sad,
    Angry,
    Surprise
}

public class ARFaceImageOverlay : MonoBehaviour
{
    private ARFaceManager arFaceManager;
    public EEmotion CurEmotion = EEmotion.Happy;

    // 표정 가이드라인 Material 배열
    public Material[] EmotionMaterials;

    private void Awake()
    {
        arFaceManager = GetComponent<ARFaceManager>();
    }

    void Update()
    {
        ApplyFaceMaterial();
    }

    void ApplyFaceMaterial()
    {
        Material FaceGuideMaterial = null;

        switch (CurEmotion)
        {
            case EEmotion.Happy:
                FaceGuideMaterial = EmotionMaterials[0];
                break;
            case EEmotion.Sad:
                FaceGuideMaterial = EmotionMaterials[1];
                break;
            case EEmotion.Angry:
                FaceGuideMaterial = EmotionMaterials[2];
                break;
            case EEmotion.Surprise:
                FaceGuideMaterial = EmotionMaterials[3];
                break;
            default:
                Debug.LogWarning("Invalid Emotion!");
                break;
        }

        if (FaceGuideMaterial != null)
        {
            foreach (ARFace face in arFaceManager.trackables)
            {
                face.GetComponent<MeshRenderer>().material = FaceGuideMaterial;
            }
        }
    }
}

코드는 다음과 같다.
enum EEmotion 변수 값을 통해 현재 학습하려는 감정(행복, 슬픔, 분노, 놀람)을 선택할 수 있다.
EmotionMaterials 머티리얼 배열에는 4개의 표정 가이드가 들어있고 CurEmotion 값에 따라 FaceGuideMaterial 값을 설정한다.

foreach (ARFace face in arFaceManager.trackables)
{
    face.GetComponent<MeshRenderer>().material = FaceGuideMaterial;
}

인식한 얼굴을 순차적으로 탐색하여 해당 페이스 마스크 머티리얼을 FaceGuideMaterial로 설정하는 코드이다.

https://www.youtube.com/watch?v=fSdnZS0XUzs
직접 짠 코드이지만 위 영상을 보면 동작 원리 이해에 도움이 될 것 같다.

문제는 입을 벌리는 등의 행동을 하면 이미지가 사용자의 얼굴에 따라 늘어나면서 표정 가이드의 이목구비 위치가 실제 얼굴과 일치하지 않는다.
이런 문제를 개선하기 위해 가이드라인 이미지를 눈, 입으로 따로 저장하고 사용자의 눈, 입 위치 위에 올려보는 방식으로 수정해보고자 한다.

0개의 댓글