BallController Script를 만든다

 

SetBallPosition()이라는 함수를 만든다.

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

public class BallController : MonoBehaviour
{
    Rigidbody rb;  //녹색은 값을 넣어줘야함.
    //공이 준비 상태인지 확인하는 변수
    bool isReady = true;
    // Start is called before the first frame update
    void Start()
    {
        rb = GetComponent<Rigidbody>();
        //리지드 바디의 물리 능력을 비활성화
        rb.isKinematic = true;
     
    }

    // Update is called once per frame
    void Update()
    {
        //공을 카메라 전방 하단에 배치
        SetBallPosition(Camera.main.transform);
    }

    void SetBallPosition(Transform anchor)
    {
        //카메라의 위치로부터 일정 거리만큼 떨어진 위치 설정
        // Vector3 = anchor로 부터 앞으로 0.5+ anchor로 부터 아래로 0.2
        Vector3 offset = anchor.forward * 0.5f + anchor.up * -0.2f;
        //공의 위치를 offset만큼 이동
        transform.position = anchor.position + offset;
    }
}

Ball에 스크립트를 끌어다 놓고

 

 

공을 발사하고 3초후 공을 다시 만들어 주기위해 타이머를 만들어야 하는데 수업에서는 invoker를 사용하였다.

3초가 지나면 Ball을 Reset()해줘 위치를 초기화 해준다.

void Update()에서 터치후 드래그시 공에 addForce로 공을 약간 위로 나가게 해준다.

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

public class BallController : MonoBehaviour
{
    Rigidbody rb;
    // 공이 준비 상태인지 확인하는 변수
    bool isReady = true;
    // 터치 시작 지점
    Vector2 startPos;
    // 공을 초기화 할 시간
    float resetTime = 3f;
    // 포획 확률
    float captureRate = 0.5f;
    // 포획 결과 텍스트
    public Text result;

    // Start is called before the first frame update
    void Start()
    {
        // 포획 결과 텍스트 초기화
        result.text = "";
        rb = GetComponent<Rigidbody>();
        // 리지드 바디의 물리 능력을 비활성화
        rb.isKinematic = true;
    }

    // Update is called once per frame
    void Update()
    {
        if (!isReady)
        {
            return;
        }
        // 터치가 입력 되었고, 공이 준비 상태라면
        if (Input.touchCount > 0 && isReady)
        {
            Touch touch = Input.GetTouch(0);
            // 만약 터치를 시작했다면
            if (touch.phase == TouchPhase.Began)
            {
                // 시작 지점 저장
                startPos = touch.position;
            }
            // 터치가 끝났다면
            else if (touch.phase == TouchPhase.Ended)
            {
                // 드래그한 y축 거리를 계산
                float dragDistance = touch.position.y - startPos.y;
                // 카메라를 기준으로 45도 각도 계산
                Vector3 throwAngle = (Camera.main.transform.forward
                    + Camera.main.transform.up).normalized;
                // 물리 능력 활성화
                rb.isKinematic = false;
                // 준비 상태 변경
                isReady = false;
                // 던질 방향과 드래그 거리만큼 공에 물리적 힘을 더함
                rb.AddForce(throwAngle * dragDistance * 0.005f, ForceMode.VelocityChange);
                // 3초 뒤에 공의 위치와 속도 초기화
                Invoke("ResetBall", resetTime);
            }
        }

        // 공을 카메라 전방 하단에 배치
        SetBallPosition(Camera.main.transform);
    }

    void SetBallPosition(Transform anchor)
    {
        // 카메라의 위치로부터 일정 거리만큼 떨어진 위치 설정
        // Vector3 = anchor로부터 앞으로 0.5 + anchor로부터 아래로 0.2
        Vector3 offset = anchor.forward * 0.5f + anchor.up * -0.2f;
        // 공의 위치를 카메라 위치로부터 offset만큼 이동
        transform.position = anchor.position + offset;
    }

    void ResetBall()
    {
        // 물리 능력 비활성화
        rb.isKinematic = true;
        // 속도 초기화
        rb.velocity = Vector3.zero;
        // 준비 상태로 변경
        isReady = true;
    }

    private void OnCollisionEnter(Collision collision)
    {
        if (isReady)
        {
            return;
        }
        // 포획 확률을 랜덤한 값으로 설정
        float draw = Random.Range(0, 1f);
        // 만약 랜덤 값이 captureRate 보다 작다면 포획 성공
        if (draw <= captureRate)
        {
            result.text = "포획에 성공했습니다!";
        }
        // 그렇지 않다면 포획 실패
        else
        {
            result.text = "포획에 실패하여 도망쳤습니다.";
        }
        // 마커 오브젝트 제거
        Destroy(collision.gameObject);
        // 공 비활성화
        gameObject.SetActive(false);
    }
}

하이라키+를 눌러 Leagacy Text를 추가해준다.

Canvas Scaler는 Scale with Screen Size로 해주고 해상도는 다음과 같이해준다.

 

BallController.cs
0.00MB

 

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

public class BallController : MonoBehaviour
{
    Rigidbody rb;
    // 공이 준비 상태인지 확인하는 변수
    bool isReady = true;
    // 터치 시작 지점
    Vector2 startPos;
    // 공을 초기화 할 시간
    float resetTime = 3f;
    // 포획 확률
    float captureRate = 0.5f;
    // 포획 결과 텍스트
    public Text result;

    public GameObject effect;
    // Start is called before the first frame update
    void Start()
    {
        // 포획 결과 텍스트 초기화
        result.text = "";
        rb = GetComponent<Rigidbody>();
        // 리지드 바디의 물리 능력을 비활성화
        rb.isKinematic = true;
    }

    // Update is called once per frame
    void Update()
    {
        if (!isReady)
        {
            return;
        }
        // 터치가 입력 되었고, 공이 준비 상태라면
        if (Input.touchCount > 0 && isReady)
        {
            Touch touch = Input.GetTouch(0);
            // 만약 터치를 시작했다면
            if (touch.phase == TouchPhase.Began)
            {
                // 시작 지점 저장
                startPos = touch.position;
            }
            // 터치가 끝났다면
            else if (touch.phase == TouchPhase.Ended)
            {
                // 드래그한 y축 거리를 계산
                float dragDistance = touch.position.y - startPos.y;
                // 카메라를 기준으로 45도 각도 계산
                Vector3 throwAngle = (Camera.main.transform.forward
                    + Camera.main.transform.up).normalized;
                // 물리 능력 활성화
                rb.isKinematic = false;
                // 준비 상태 변경
                isReady = false;
                // 던질 방향과 드래그 거리만큼 공에 물리적 힘을 더함
                rb.AddForce(throwAngle * dragDistance * 0.005f, ForceMode.VelocityChange);
                // 3초 뒤에 공의 위치와 속도 초기화
                Invoke("ResetBall", resetTime);
            }
        }

        // 공을 카메라 전방 하단에 배치
        SetBallPosition(Camera.main.transform);
    }

    void SetBallPosition(Transform anchor)
    {
        // 카메라의 위치로부터 일정 거리만큼 떨어진 위치 설정
        // Vector3 = anchor로부터 앞으로 0.5 + anchor로부터 아래로 0.2
        Vector3 offset = anchor.forward * 0.5f + anchor.up * -0.2f;
        // 공의 위치를 카메라 위치로부터 offset만큼 이동
        transform.position = anchor.position + offset;
    }

    void ResetBall()
    {
        // 물리 능력 비활성화
        rb.isKinematic = true;
        // 속도 초기화
        rb.velocity = Vector3.zero;
        // 준비 상태로 변경
        isReady = true;
    }

    private void OnCollisionEnter(Collision collision)
    {
        if (isReady)
        {
            return;
        }
        // 포획 확률을 랜덤한 값으로 설정
        float draw = Random.Range(0, 1f);
        // 만약 랜덤 값이 captureRate 보다 작다면 포획 성공
        if (draw <= captureRate)
        {
            result.text = "포획에 성공했습니다!";
        }
        // 그렇지 않다면 포획 실패
        else
        {
            result.text = "포획에 실패하여 도망쳤습니다.";
        }
        //이펙트생성
        Instantiate(effect, collision.gameObject.transform.position, Camera.main.transform.rotation);
        // 마커 오브젝트 제거
        Destroy(collision.gameObject);
        // 공 비활성화
        gameObject.SetActive(false);
    }
}

Asset Store에서 이펙트를 찾아 다운로드해주고

Import해준다.

스크립트에 effect변수에 import한 이펙트를 끌어다 놔준다. UI LegacyText로 끌어다 놔준다

실행해서 마커를 촬용하면 고양이가 나오고 볼을 드래그해서 맞추면 폭발이 일어나는데 확율에 의해 성공과 실패가 나뉜다. 

실제 해보면 공의 초기 위치와 고양이의 위치가 비슷해 고양이가 공위에 있다. AddForce가 앞으로 날라가기때문에 맞지 않는다. 공위로 고양이가 있을때 억지로 가깝게 해서 맞춰줘야야만 한다. 난 공을 좀더 카메라쪽(-) 고양이를 뒤로 위치시켜 거리를 만들어 공이 앞으로 날라가다 맞게 해주었다

'AR > 24 KMOOC 비주얼심화과정' 카테고리의 다른 글

Unity 타이머  (0) 2024.07.08
Unity 타이머  (0) 2024.07.06
7/3 강의 마커기반 AR  (0) 2024.07.03
7/1 FaceTracking2  (1) 2024.07.03
4일차 FaceTracking (6.30 강의)  (3) 2024.06.30

새로운 씬을 만든다. 씬폴더에서 우클릭 Create Scene 해준다.

PackageManager에서 

AR VR은 Main Camera가 아니라 AR VR전용카메라를 사용한다.

VR은 다른 플러그인 설치가 필요하다 여기서는 안쓴다.

하이라키에서 AR Session Orign을 추가한다 그러면 카메라가 2개니 지우라고 하고 MainCamera를 지운다

하이라키에서 AR Session을 추가한다.

AR Detection은 마커리스 마커 페이스디텍션등이 있다.

MarkerAR 폴더를 만든다.

맨먼저 마커 등록(학습)을 시켜야한다.

MarketAR폴더안에 Create>XR> Image or Object 2가지가 있다.

우선 이미지기반 마커를 만들어보자. XR>Reference Image Library를 선택하자.

마커로 사용되는 이미지는 너무 단순하면 안된다. 복잡할수록 좋다. 다운 받은 그림을 Marker Library 2D 에 끌어다 놓는다.

Add Image를 눌러 3개를 추가했다.

Unity Assets Store Character>Animal>CartoonCat을 가져온다. Unity에서 열기하면PackageManger가 나오는데 다운로드후 Import한다.

Cat_Idle을 끌어다 하이라키에 놓는다.

고양이 애니메이션을 컨트롤 할려면  애니메이터 컨르롤러를 알아야 한다.

현재는 전체 애니메이션이 순환 반복되는데 밥먹는거만 반복되게 해보자 일단 편집을 위해 플레이를 끈다.

 

CatAnim으로 이름 바꾸고 더블클릭

3개의 스테이지가 보이는데 Entry가 시작이다. Exit는 종료 Any State는 모든 스테이트에서 이동이 가능하다.

그래프 우클릭 하고

하이라키 Cat_Idle을 선택하고 Controller 동그라미를 클릭하고 CatAnim으로 바꿔준다.

 

하이라키 Cat을 끌어다 MarketAR폴더에 놓고 프리팹으로 만듬 하이라키 Cat은 삭제

Marke

Cat 프리팹을 끌어 Tracked Image Prefab에 놓는다.

빌드세팅즈 열고 MarketAR 이외는 꺼준다.

빌드앤런 처음 마커로 설정한 뽀로로 위에서만 고양이가 나타난다.

하이라키 MarketCat Delete

 

Rigidbody 컴포넌트 추가

 

Mass: 무게

Drag: 공기저항

Angular Drag:

Use Gravity :

Is Kinematic:체크되면 물리효과 무

Material  폴더를 만들고 Create>Material M_Ball로 이름을 만든다.

'AR > 24 KMOOC 비주얼심화과정' 카테고리의 다른 글

Unity 타이머  (0) 2024.07.06
7/5 수업  (0) 2024.07.05
7/1 FaceTracking2  (1) 2024.07.03
4일차 FaceTracking (6.30 강의)  (3) 2024.06.30
3일차 인디케이터에서 오브젝트 생성및 회전 (6월28일)  (0) 2024.06.28

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

하이라키+를 누르고 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개가 나온다.

https://www.youtube.com/watch?v=CkjSBEv4PW0&t=9s

 

이전 프로젝트가 있는 분은 그대로 해도 되고 새로운 씬을 하나 만들고

AR Session Orign, AR Session을 추가하고 Main Camera를 지워주자.

먼저 프로젝트와 마찬가지고 AR Session Origin에 AR Plane Manager컴포넌트를 추가하고 AR Default Palne프리팹을 연결해주자

  하이라키에 AR Camera를 선택하고 우클릭후 Create Empty해서 이름을 ShootPoint로 해준다. 이걸 끌어다 AR Camera밑으로 놓는다. ShootPoint는 이제 AR Camera의 자식이고 화면의 가운데에 위치한다.

Z축 값을 0.01로 변경한다. 유니티에서 Z축은 앞쪽이다. 카메라의 약간 앞쪽에 위치하게 된다.

이제 날아갈 공을 만들자 하이라키의 우클릭후 3D Object>Sphere를 추가하자 이름을 Ball로 변경

이제 Ball을 앞으로 날라가게 하자 Ball을 선택하고

Inspector창 아래 Add Component를 눌러 Rigidbody를 추가하자. 이 컴포넌트를 게임오브젝트가 물리적 특성을 갖게한다. 디테일을 보면 무게, 중력 충돌처리등이 있다. 무게를 1로 변경한다.

Ball의 Scale(크기)를 0.2정도로 줄인다.

ShootBall>Prefab폴더를 만들어주고 Ball을 끌어다 프리팹을 만들어주고 하이라키상의 Ball은 지워주자

ShootBall>Script 폴더를 만들어주고 Script를 만들자

이름은 바로 ShootBall로 변경하자 안그러면 클래스 이름이 안 맞아 에러가 난다.

하이라키의 우클릭후 EmptyObject를 하나 만들고 이름을 ShootBallManager로 하자.

코드를 쳐주고 유튜브 강의는 터치에 대한 입력이 없어서 터치입력을 추가했고 실행해보니 공이 너무 많이 생성돼 앞으로 나가지를 못했다. 타이머를 만들어 쿨타임을 적용해 0.2초마다 나가게 해주었다. 안드로이드폰은 라이더 센서가 없어 면을 생성하는데 카메라를 좀 돌려야한다. 실제 공을 발사해보니 AR Default Plane이 좀 높게 설정되어있었다. 

유니티가 처음이신 분들은 코드가 어려울수도 있다. RigidBody는 물리적인 처리를 하는 부분이라 오브젝트를 움직이게 할때는 AddForce를 사용해야한다. Transform을 이용해서 움직이면 Rigidbody와 처리가 얽혀 더더덕 거린다.

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

public class ShootBall : MonoBehaviour
{
    public GameObject ball; //공오브젝트
    public Transform camObj;  //카메라오브젝트
    public Transform shootPoint;  // 슛포인트 위치
    private float coolTimer=0f;  //타이머
    private bool bShoot = true;  //쏠수 있는지 
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        //터치가 일어나고 쏠수 있다면
        if (Input.touchCount > 0 && bShoot)
        {
            //공을 발사
            ShootBallObj();
            bShoot = false;
        }
        //쏠수 없다면
        if (!bShoot)
        {
            //타이머를 갱신하고
            coolTimer += Time.deltaTime;
            //일정한 시간이 지났으면
            if (coolTimer > 0.2f)
            {
                bShoot = true;//슛을 가능하게 해주고
                coolTimer = 0; //타이머를 리셋해준다
            }
        }

    }

    public void ShootBallObj()
    {
        GameObject tObj = Instantiate(ball); //공을 생성해줌
        //공의 위치를 발사위치로 옮김
        tObj.transform.position = shootPoint.transform.position; 
        //공의 발사 방향을 계산
        Vector3 tVect = (shootPoint.transform.position - camObj.transform.position).normalized;
        //리지드바디 컴포넌트 참조를 얻어옴
        Rigidbody tR = tObj.GetComponent<Rigidbody>();
        // 리지드바디에 힘을 전달해 앞으로 나가게 한다.
        tR.AddForce(tVect * 100f);
    }
}

방금만든 스크립트를 끌어다 하이라키의 ShootBallManager에 놔준다. 하이라키는 게임오브젝트 객체만 존재할수 있으므로 이렇게 해야한다.  연결후 ShootBallManager를 선택하고 Inspector뷰 아래 ShootBall의 파라메터들을 연결해준다. The Ball은 프리팹에서 나머지는 하이라키에서 끌어다 놓으면 된다.

빌드전 빌드 세팅즈에 가서 씬을 추가해주고

PlayerSetting을 눌러 앱 이름도 바꿔주자.

빌드후 화면을 터치해보면 공이 앞으로 날라간다.

https://www.youtube.com/watch?v=UuoNTYZaT7k&list=PLATff1khpIscTMN2KXxagrTkBCwdzOeol&index=2

 

프로젝트는 새로 만들어도 되고 만들때마다 용량이 늘어나므로 기존 프로젝트에 New Scene을 하는걸 추천한다. 3D면 된다.

File>Save를 하면 이름을 물어보는데 난 DebugTest로 했다.

Window>Package Manager에 AR Foundation, ARCore가 잘 설치되어 있어야 한다 기타 빌드 설정도 잘되어 있어야하고 핸드폰도 개발자모드로 되어 있어야하고 연결하고 승인도 해줘야한다. 잡일이 많다.

하이라키 +를 누르거나 우클릭후 AR Session, AR Session Orign을 추가하고 Main Camera는 지워준다.

이제 AR Foundation기능을 테스트 해보자  AR Foundation이 지원하는 기능은 다음과 같은데

특징설명

 

세션 대상 플랫폼에서 AR을 활성화, 비활성화하고 구성합니다.
장치 추적 실제 공간에서 장치의 위치와 회전을 추적합니다.
카메라 장치 카메라에서 이미지를 렌더링하고 조명 추정을 수행합니다.
비행기 감지 평평한 표면을 감지하고 추적합니다.
이미지 추적 2D 이미지를 감지하고 추적합니다.
객체 추적 3D 객체를 감지하고 추적합니다.
얼굴 추적 인간의 얼굴을 감지하고 추적합니다.
신체 추적 인체를 감지하고 추적합니다.
포인트 클라우드 특징점을 감지하고 추적합니다.
레이캐스트 추적된 항목에 광선을 비춥니다.
앵커 공간상의 임의의 지점을 추적합니다.
메싱 환경의 메시를 생성합니다.
환경 프로브 환경의 큐브맵을 생성합니다.
폐색 AR 콘텐츠를 물리적 객체로 가리고 인간 세분화를 수행합니다.
참가자들 공유된 AR 세션에서 다른 기기를 추적합니다.

일단 하이라키위를 우클릭하면 나타나는 것들부터 해보자

AR Default Point Cloud를 추가하자

AR Session Origin을 클릭후 Inspection뷰에서 Add Component를 클릭하고 AR Point라고 검색한후 AR Point Manager를 추가하자. 그럼 Point Cloud Prefab이라는 Item이 생기고 None에 프리팹을 연결해줘야한다..

프로젝트뷰에 Prefab폴더를 만들고 AR Default Point Cloud를 끌어다 놓으면 Prefab이 생성된다.  하이라키의 있는 것들은 GameObject라는 객체인데 이것들을 끌어다 프로젝트에 놓으면 Prefab으로 바뀐다. Prefab은 Class라고 생각하면 된다. 객체에서 클래스를 만드어 주는거다. 보통은 클래스를 만들고 클래스이용 객체를 만드는 것의 반대이다. 객체지향 어려워요. 참 프리팹을 만든후에는 AR Default Point Cloud는 지워주자. 끌어다 놓을때는 이름을 잘보자 프로젝트뷰가 아이콘아 아니라 리스트로 나오는건 우측 삼점을 누르고 One Columb Layout을 선택하면 된다.

이제 빌드를 해보자 File>BuildSetting를 눌러서 Add Open Scenes를 눌러 현재 씬을 추가해줘야한다.

좌측아래 PlayerSettings(Project Setting에서도 접근가능)를 눌 앱이름을 설정하자.

 

오른쪽아래 빌드앤런을 누르면 파일명을 물어보면 build라는 폴더를 만들고 들어가서 적당히 이름만든다. 클

세이브할꺼냐고 물어보면 Save

이때 부터 핸드폰을 잘봐라 대기화면이면 풀어주자. 프로그레스바에서 device에 copy한다는 메세지가 나와야 한다. 물론 빌드폴더에서 apk를 핸드폰으로 카피해서 깔아도 되지만 이게 편하다.

핸드폰 화면을 대기화면에서 풀고 잘 보면 아래 팝업이 뜬다. 당황하지 말고 확인 위에 세부정보 더보기를 누르고 다시 확인위에 무시하고 설치하기 누른다.

다음 카메라사용 승인해주면 드디어 앱이 뜬다. 포인트가 안 나온다면 좀 기다려 보고 앵글을 움직여 보면 나온다. 포인트는 오브젝트의 엣지부분을 찾는 기능 같다.

 

다음은 하이라키 뷰위를 우클릭후 AR Default Plane을 추가 하고

프리팹 폴더에 끌어다 프리팹을 만들자. 그럼 파란색으로 변하고

AR Session Origine에 AR Plane Manager 컴포넌트를 추가하고

AR Default Plane 프리팹을 AR Plane Manager컴포넌트의 Prefab 참조에 연결해준다

Detection Mode는 원하는 면을 선택할수 있는데 현재는 그냥 두자

 

빌드해주자 잘보면 방법이 똑같다 AR Default XXXX를 추가하고 프리팹을 만들고 AR Session Origne에 AR XXXX Manager를 컴포넌트에 추가하고 프리팹을 연결해준다.

빌드해보면 Point와 Plane인식을 할것이다. Plane인식은 약간 시간이 걸리는것 같다. 그리고 정확하지 않은것 같다. 아이폰은 라이더가 내장되어 있어 정확안듯 하

마지막으로 하이라키에 우클릭후 XR>AR Default Face를 추가하고 프리팹폴더에 끌어다 프리팹만들고 지워주자

AR Session Origine에 AR Face Management 컴포넌트를 추가하고 AR Default Face Prefabs를 연결해준다.

Face Detect를 하기 위해 모델이 있다면야 후방으로 해도 되지만 자신으로 테스트하기 위해 전방카메라를 선택해보자. AR Session Orign>AR Camera를 선택해서 Inspector View아래 Face Direction이 있는데 World->User로 바꾸준다. World가 후방이다.

Face Tracking에서는 Point, Plane Manager가 필요 없다고 해서 지우라는데 난 귀찮아서 안지웠는데 잘되었다  지우는것 대신 불필요한 부분을 비활성화 하는 방법도 있을것 같다. 컴포넌트 이름 왼쪽을 언체크하면 된다.

실행화면 내 눈 코 입을 만들어주고 표정까지 트래킹 해준다. 얼굴을 돌려보면 나름 3D로 모델을 만들어서 맵핑해준다. 유튜브는 이빨과 눈동자도 보이는데  버전에 따라 좀 다른듯 

오른쪽이 유튜브 강좌 화면 눈동자와 이빨이 보임.

 

'AR > AR Foundation' 카테고리의 다른 글

AR 개발환경구축하기  (1) 2024.07.02
소개  (0) 2024.07.02
iOS / Unity 2022.3.5f1 + AR FOUNDATION / ARKit  (0) 2024.06.30
유니티 Unity AR Foundation  (0) 2024.06.30

+ Recent posts