티스토리 뷰

반응형




안녕하세요. Base Of Coding 입니다.


Vuforia 카테고리에서 첫 번째로 쓰는 글입니다. 이번엔 카메라 전환에 대해서 알아보도록 하겠습니다.

< 1. CameraDevice Class >

이 CameraDevice 클래스는

  를 추가해주신 뒤에 CameraDevice라는 클래스를 사용하실 수 있습니다.
즉, Vuforia라는 네임스페이스에 있는 클래스입니다.

AR에서만 사용이 가능한 ARCamera의 카메라의 메소드들이 들어가 있는 클래스입니다.


자세한 내용은


https://library.vuforia.com/content/vuforia-library/en/reference/unity/classVuforia_1_1CameraDevice.html#details


이 링크로 가시면 Vuforia API를 살펴보실 수 있습니다. 물론 영어로 되어있지만요!



< 2. BackGroundPlane >

BackGroundPlane은, 플레이 버튼을 시작하고, AR 카메라를 확인해보시면, 하위객체로 생성되는 카메라의 화면입니다. 
카메라를 전환하기 위해서는 이 BackGroundPlane을 적절히 이용해보려 합니다.
어떻게 활용이 되는지 코드를 보면서 확인하겠습니다.

< 3. Camera Rotate Code >

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
using UnityEngine;
using System.Collections;
using Vuforia;
public class ARCameraRotation : MonoBehaviour
{
    #region OBJECT_AND_VARIABLE
    // PUBLIC
    
    // AR 카메라
    public GameObject ARCamera;
    // PRIVATE
    // 버튼을 클릭할 때 마다 이 값을 변경해서, 앞 뒤 전환을 시킬 변수.
    private bool camRotateFlag;
    // AR 카메라에 생성되는 하위 화면 객체.
    private Transform backGroundPlane;
    
    // Vector3를 이용하여, Front로 전환을 시킬 때, 이상하게 보이지 않게 하기 위함.
    private Vector3 planeFrontCameraRotation , planeBackCameraRotaion;
    
    #endregion
 
    #region UNITY_INTERNAL_FUNC
    // Awake를 하든, Start를 하든, 사용자의 마음대로 하시면 됩니다.
    private void Start()
    {
        // 앞 뒤 전환용 변수 false로 초기화.
        camRotateFlag = false;
        
        // 시작할 때, AR 카메라에 있는 backGroundPlane 객체에 있는 Transform 컴포넌트 사용 
        backGroundPlane = ARCamera.transform.GetComponentInChildren<Transform>();
        
        // float형으로 x,y,z라는 변수를 만들고, backGroundPlane의 크기를 대입합니다.
        float x = backGroundPlane.localScale.x;
        float y = backGroundPlane.localScale.y;
        float z = backGroundPlane.localScale.z;
        // x값을 *-1을 해주면, -가 되어서, 거울처럼 보이는 현상이 나타난다.
        planeFrontCameraRotation = new Vector3(x * -1, y , z);
        
        // 원래 크기 값으로 바꿔주기 위한 초기화.
        planeBackCameraRotaion = new Vector3(x,y,z);
    }    
    #endregion 
 
    #region USER_DEFINED_FUNC
 
    public void CameraRotation()
    {
        cameraFlag = !cameraFlag;
        if (cameraFlag) // 전면 카메라 일 경우
        {
            // 코루틴 실행. 전면으로 바꾼다는 것을 매개변수로 보내준다.
            StartCoroutine(CameraRotationCoroutine(CameraDevice.CameraDirection.CAMERA_FRONT));
        }
        else        // 후면 카메라 일 경우
        {
            // 코루틴 실행. 후면으로 바꾼다는 것을 매개변수로 보내준다.
            StartCoroutine(CameraRotationCoroutine(CameraDevice.CameraDirection.CAMERA_BACK));
        }
    }
    
    IEnumerator CameraRotationCoroutine(CameraDevice.CameraDirection dir)
    {
        yield return new WaitForSeconds(0.3f);      // 0.3초 대기
        CameraDevice.Instance.Stop();               // AR카메라 정지.
        CameraDevice.Instance.Deinit();             // 초기화 해제
        CameraDevice.Instance.Init(dir);            // 초기화, 매개변수의 값을 넣어준다.
        if (cameraFlag)             // 전면 카메라일 경우,
        {
            // 하위객체인, backgroundPlane의 크기값을, 초기화해주었던 planeFrontCameraRotation의 값으로 변경.
            backGroundPlane.localScale = planeFrontCameraRotation;
        }
        else        // 후면 일 경우
        {
            backGroundPlane.localScale = planeBackCameraRotation;       // 원래 위치값으로 변경.
        }
        CameraDevice.Instance.Start();          // AR카메라 실행.
    }
 
    #endregion
}
cs


이렇게 코드를 짜본것은, 저도 AR 카메라 전환을 해보기 위해서, Vuforia API를 뒤지면서, CameraDevice 클래스 문서도 못하는 영어를 보고, 

모르는 건 번역해가면서 보다가 구글링을 해가면서 옛날 Vuforia 포럼에 올라오는 질문글들도 보면서 해보았지만 잘 안됐었습니다. 

그러다가 ARCamera 객체에서 하위 객체가 생기는 걸 보았고, 그 하위 객체의 x값을 변형해보면 거울처럼 나오지 않을까?라는 생각을 어떻게 갑자기 했는 지 모르겠지만 건드려보자 하고 x를 -값으로 변경했더니 거울처럼 나왔었습니다.


그러다가 제 블로그를 보시는 분들께 도움이 되지 않을까 싶어 올려봅니다.


저는 댓글을 사랑합니다. 이 글에 도움이 되셨으면 댓글 많이 달아주시면 감사하겠습니다!!


지금까지 AR 카메라를 앞 뒤로 전환하는 방법과 거울 기능을 한번 알아봤습니다. 감사합니다!




+ 주의할 점!


if (cameraFlag)             // 전면 카메라일 경우,
        {
            // 하위객체인, backgroundPlane의 크기값을, 초기화해주었던 planeFrontCameraRotation의 값으로 변경.
            backGroundPlane.localScale = planeFrontCameraRotation;
        }
        else        // 후면 일 경우
        {
            backGroundPlane.localScale = planeBackCameraRotation;       // 원래 위치값으로 변경.
        }


이 코드를 사용할 경우, 좌우반전이 잘 되지만, 그 위에 나타나는 오브젝트마저 좌우반전이 되기 때문에, 마커는 반대로 보이지만 오브젝트 위치는 변경은 그대로 하고 싶으면, 이 코드는 빼세요.



- 이 글에 도움이 되셨다면, 밑에 공감(♡) 버튼을 눌러주시면 감사하겠습니다. -



반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함