세이박스

[VR스쿨] VR 가상현실을 위한 HMD와 함께 사용되는 다양한 컨트롤러 알아보기

하드웨어

 

 

이번 강의는 VR에 사용되는 컨트롤러 기술들에 대해 알아 보겠습니다.

VR컨트롤러를 사용함으로써 가상현실을 단순히 보는 것에서 직접 이동하고 만져 보는 등의 행동을 체험함으로써 가상현실의 효과를 높일 수 있습니다.

그럼, 현재 많이 활용되고 있는 컨트롤러 몇가지를 살펴보도록 하겠습니다.

 

 

오큘러스 터치


오큘러스 VR이 마이크로소프트사와 제휴를 맺어 VR 전용 컨트롤러인 ‘오큘러스 터치’를 개발 하였다. 디자인은 아래와 같다. 조이 스틱(Joy Stick)을 이용하여 가상 공간에서 움직일 수 있고, 정면의 버튼은 트리거 라고 하는데, 이 트리거의 위치는 인체 공학적으로 설계되어 있어서 물건을 잡고, 던지고, 쌓고, 누르는 동작이 매우 자연스럽다고 한다. 또한, 누르는 압력과 손과 팔의 궤적까지 인식한다. 하지만 가격이 비싸며, 오큘러스의 특성상 적외선 트래킹 센서가 필요하기 때문에 움직이면서 사용하기엔 적당하지 않다.

16d6135c14b34f227a6ec1cad53c808d_1457837
 


PS VR 컨트롤러


소니의 플레이 스테이션도 VR시장에 뛰어들어 프로젝트 모피어스 라는 이름으로 개발중이다.
플레이 스테이션 VR 전용 컨트롤러의 모습은 아래와 같다. 왼쪽이 컨트롤러로 상단의 하얀 구체에서 빛이 나며 오른쪽의 카메라로 컨트롤러의 정확한 위치를 인식한다. 아직 출시 되지 않았다는 것이 가장 큰 단점이다.


16d6135c14b34f227a6ec1cad53c808d_1457838 


폭풍마경 컨트롤러

아래의 사진은 중국에서 제작한 폭풍 마경이며, 원가 한화 약 2만원 정도의 제품이라고 하기에는 믿을 수 없는 퀄리티를 자랑한다. 전용 컨트롤러도 함께 제공 하며, 이 컨트롤러는 블루투스로 연결이 된다. 단점은 전용 앱에서만 사용이 가능하다고 하지만, 키 매핑을 변경하면 조이 스틱을 제외한 버튼은 어느 정도 사용이 가능하다고 한다. 제스쳐를 인식 하는지에 대한 정보는 존재 하지 않는다.

16d6135c14b34f227a6ec1cad53c808d_1457838 


MYO


팔 근육의 움직임을 인식하는 컨트롤러이다. 유니티 전용은 아니지만 제작사에서 유니티 패키지를 제공하며, MYO, Unity, Android 를 연동한 개발자도 있다. 손의 모양을 정확하지 않지만 어느 정도 인식 하는 듯 하며, 팔이 어느 정도 어느 방향으로 이동 하였는지도 인식 한다. 온라인 마켓에 약 30만원 정도에 판매 중이다.



16d6135c14b34f227a6ec1cad53c808d_1457838 

Leap Motion

적외선 센서를 이용해 Leap Motion 위에 있는 위치의 거리를 인식하는 기기이다. 약간의 오차
가 존재 하기는 하지만 꽤 정확한 위치를 인식 할 수 있다는 것이 장점이다. 단점은 USB를 통한 전
원 공급이 필요한데, 스마트폰과 연결하여 사용 할 수 없고, Leap Motion을 PC에 연결하고, PC 와
스마트폰간의 서버 클라이언트 구조로 개발해야 한다는 것이다.

16d6135c14b34f227a6ec1cad53c808d_1457838 

Manus E3

장갑 형태로 착용하여 손 모양을 그대로 인식 하는 컨트롤러이다. 가속도, 자이로센서, 마그네토미터를 내장하고 있으며, 해당 장갑과 관련된 모든 소프트웨어는 오픈 소스여서 누구나 쉽게 접근할 수 있다. 또, 블루투스 연결로 오큘러스, 스팀 VR뿐만 아니라 기어 VR 같은 기기와도 연결되어 범용성이 뛰어나다. 마누스 머시나는 현재 기어 VR과 안정적인 호환을 위해 힘쓰고 있다. 현재윈도우 8, 8.1, 리눅스, 안드로이드 4.0 이상을 지원하여 구글 카드보드와 같이 사용할 수 있고, 개발자 키트는 280달러로 곧 지원할 예정이며, 정식 출시는 200달러로 2016년 상반기에 이루어질계획이라고 한다.



16d6135c14b34f227a6ec1cad53c808d_1457838 

​이처럼 다양한 컨트롤러들의 발전으로 가상현실 보다 현실감 있게 체험할 수 있을 것이다.

앞으로 출시될 컨트롤러가 기대되며, 현재 나온 컨트롤러들이 잘 활용된 콘텐츠가 많이 나오길 기대해 본다. ​

[VR스쿨] VR 가상현실 컨트롤러 만들기 - 구글 카드보드 SDK를 이용해서 쳐다만 봐도 콘텐츠 선택되는 기능 만들기

가상현실

 

 

 

마그네틱 스위치를 이용해서 메뉴 선택이나 확인 버튼으로 이용할 수 있으나 마그네틱 스위치가 없을 경우 가장 기본적으로 적용할 수 있는 스위치 방법이 일정 시간동안 오브젝트를 바라 보았을 때, 오브젝트가 선택되는 방식을 기본적으로 이용할 수 있습니다.

 

따라서, 이번 강의에서는 일정 시간동안 오브젝트를 바라 보았을때 동작하는 기능을 만들어 보겠습니다.
이전 예제에서 이용한 BoxCtrl과 RayCast 개념을 그대로 사용하고, 여기에 타이머를 추가하여 응용할 수 있습니다.

 

 

a768a96a0edc3c0b70594024eb9eb9e1_1456887 

 

하이어라키 창에서 오른쪽 클릭 -> 3D Object -> Sphere로 구를 추가합니다.

이 구에 BoxCtrl 스크립트를 그대로 추가합니다.

Tag는 Ball을 추가하여 설정합니다.

 

마그네틱 스위치 인식과 오브젝트 선택 기억나지 않으면 아래 링크를 참고 합니다.

http://vrschool.co.kr/bbs/board.php?bo_table=leture&wr_id=12

 

 

a768a96a0edc3c0b70594024eb9eb9e1_1456887
 

프리팹으로 만든 후 여러 개 적당한 위치에 배치 해 봅시다.

 

 

a768a96a0edc3c0b70594024eb9eb9e1_1456887 

 

using UnityEngine;

using System.Collections;

 

public class TriggerTextCtrl : MonoBehaviour {

//결합할 텍스트 상수입니다.

private const string TEXT = "Count : ";

//접근 제어자를 public으로 하면 유니티 에디터에서 이 변수를 설정할 수 있습니다.

public Cardboard cardBoard;

//3DText의 글자는 TextMesh 컴포넌트에서 변경했기 때문에 TextMesh 컴포넌트를 가져와야 합니다.

private TextMesh textMesh;

//카운트 변수입니다.

private int count = 0;

    //Update 메소드가 호출되기 전 단 한 번 호출 됩니다. 보통 변수들을 초기화 하는것을 여기에다 작성합니다.

    private Vector3 screenCenter;

 

    // 몇 초간 바라보는 것으로 설정할 것인지에 대한 변수입니다. 에디터에서 수정가능하도록 했습니다.

    public float durTime = 3f;

    // 쳐다보고 있는 오브젝트가 저장됩니다.

    public GameObject recentObject;

    // 쳐다보기 시작한 시간을 저장합니다.

    private float startTime;

    void Start()

{

//gameObject에는 본 컴포넌트가 추가된 게임 오브젝트가 들어가 있습니다. GetComponent<가져올 컴포넌트>(); 를 이용하면 컴포넌트를 가져올 수 있습니다.

textMesh = gameObject.GetComponent<TextMesh>();

        screenCenter = new Vector3(Camera.main.pixelWidth / 2, Camera.main.pixelHeight / 2);

    }

 

//매 프레임마다 호출되는 메소드 입니다. 여기서 게임 오브젝트의 변화를 설정합니다.

void Update()

{

        Ray ray = Camera.main.ScreenPointToRay(screenCenter);

        RaycastHit hit;

        

        //레이저가 공을 맞췄는지에 대한 불리언 값입니다.

        bool isRayHitBox = Physics.Raycast(ray, out hit, 500f) && hit.collider.gameObject.tag == "Ball";

        if (isRayHitBox)

        {

            //최근 쳐다본 오브젝트가 비어있지 않고, 지금 레이저에 맞은 오브젝트와 같은지 여부를 불리언 값으로 저장합니다.

            bool isRecentObjEqualsCollObj = recentObject != null && recentObject.gameObject.Equals(hit.collider.gameObject);

            if (startTime + durTime < Time.time)

            {

                BoxCtrl ctrl = hit.collider.gameObject.GetComponent<BoxCtrl>();

                ctrl.Select();

            }

            else

            {

                recentObject = hit.collider.gameObject;

                startTime = Time.time;

            }

        }

        else

        {

            recentObject = null;

        }

 

        //카드보드에서 Triggered Getter는 트리거가 발생했는지 알 수 있습니다.

        if (cardBoard.Triggered)

{         

            //박스에 초점이고 

            if (Physics.Raycast(ray, out hit, 500f))

            {

                if (hit.collider.gameObject.tag == "Box")

                {

                    BoxCtrl boxCtrl = hit.collider.gameObject.GetComponent<BoxCtrl>();

                    boxCtrl.Select();

 

                    //TextMesh 컴포넌트의 text를 변경합니다.

                    count++;

                    textMesh.text = TEXT + count.ToString();

                }

            }            

        }

}

}

 

 

 

 

TriggerTextCtrl 스크립트를 그대로 사용합니다.

위 처럼 코드를 추가 해 주세요.
추가 된 부분을 설명 하겠습니다.

 

// 몇 초간 바라보는 것으로 설정할 것인지에 대한 변수입니다. 에디터에서 수정가능하도록 했습니다.
public float durTime = 3f;

// 쳐다보고 있는 오브젝트가 저장됩니다.

public GameObject recentObject;

// 쳐다보기 시작한 시간을 저장합니다.

private float startTime;

    

bool isRayHitBox = Physics.Raycast(ray, out hit, 500f) && hit.collider.gameObject.tag == "Ball";

레이저가 공을 맞췄는지에 대한 불리언 값입니다.


bool isRecentObjEqualsCollObj = recentObject != null && recentObject.gameObject.Equals(hit.collider.gameObject);

최근 쳐다본 오브젝트가 비어있지 않고, 지금 레이저에 맞은 오브젝트와 같은지 여부를 불리언 값으로 저장합니다.

 

if (startTime + durTime < Time.time)

{

    BoxCtrl ctrl = hit.collider.gameObject.GetComponent<BoxCtrl>();

    ctrl.Select();

}

 

Time.time은 게임이 시작된 후 경과된 시간이 저장되어 있습니다.

보기 시작한 시간과 바라 볼 시간을 더한 값이 경과 시간보다 작아질 경우, 그러니까 durTime만큼 시간이 지나면

오브젝트에서 BoxCtrl 컴포넌트를 얻어 색을 변경합니다.


else

{

    recentObject = hit.collider.gameObject;

    startTime = Time.time;

}

 

최근 쳐다본 오브젝트가 비어있지 않고, 지금 레이저에 맞은 오브젝트가 같지 않다면 지금 쳐다보고 있는 오브젝트로 변경 해 주고, 시작 시간을 다시 초기화 합니다.


else

{

    recentObject = null;

}

 

레이캐스트에 적중한 오브젝트가 없고, 적중했더라도 태그가 Ball이 아니라면 recentObject 는 null로 비워주어야 합니다.

 

 

 

[VR스쿨] VR 가상현실, 구글 카드보드의 마그네틱 스위치 인식과 오브젝트 선택 구현하기

가상현실

 

 

구글 카드보드의 마그네틱 스위치?

https://developers.google.com/cardboard/

 

마그네틱 스위치는 스마트폰의 자기력 센서의 변화를 측정해 입력하는 방식 입니다.
테스트 해보기 위해 구글플레이에서 "마그네틱 센스"로 검색후 앱을 다운로드

 

0f94f04c6dc53a08610b19af375f67a4_1456525
 

https://play.google.com/store/apps/details?id=imoblife.androidsensorbox

앱을 실행 후 자석을 스마트폰에 가까이 가져가면 자기장 수치가 변화는 것을 보실 수 있습니다.

 

즉, 자석을 이용해서 간단한 VR(Virtual Reality) 가상공간 속에서의 콘트롤러로 이용할 수 있습니다.

간단하게 메뉴를 클릭하거나 게임에서 무기를 발사하는 등의 기능으로 사용 가능 합니다.

 

스위치 인식하는 예제를 만들어 보겠습니다.

 

0f94f04c6dc53a08610b19af375f67a4_1456524 


CardboardMain오브젝트를 선택 하면 가장 오른쪽 Inspector창에 Cardboard 스크립트 컴포넌트가 추가되어 있는것을 알 수 있습니다.
마그네틱 스위치 입력은 Cardboard 스크립트에서 감지 하도록 되어 있습니다.

마그네틱 입력이 감지 되었는지 확인하기 위해 몇 번 입력이 감지되었는지 확인 할 텍스트를 배치 해 보겠습니다.

 

 

0f94f04c6dc53a08610b19af375f67a4_1456526
 

 

하이어라키 창 빈 공간에 오른쪽 클릭을 해서 -> 3D Object -> 3D Text를 선택 해 주시고 Inspector창의 Text Mesh 컴포넌트의 변수들을 위 이미지와 같이 설정 해 주세요.
카메라가 텍스트를 볼 수 있는 위치에 배치 합니다.
다음은 트리거를 감지해서 카운트 값을 증가시키는 스크립트를 작성해 보겠습니다.

 

 

0f94f04c6dc53a08610b19af375f67a4_1456526


우선 정리를 쉽게 하기 위해 Scripts 폴더를 만들어 주시고 Scripts 폴더 오른쪽 클릭 -> Create -> C# Script 를 선택 해 주세요.

 

 

0f94f04c6dc53a08610b19af375f67a4_1456526 


스크립트 이름은 TriggerTextCtrl로 하겠습니다.
처음 스크립트를 생성 할 때 정해준 이름 대로 스크립트의 클래스 이름을 자동으로 생성 해 줍니다.
생성 후에 스크립트 이름을 변경 할 때엔 스크립트 안의 클래스 이름도 스크립트 이름으로 바꾸어 줘야 합니다.

 

 

0f94f04c6dc53a08610b19af375f67a4_1456526 


위의 스크립트를 작성해 주세요
스크립트 해석하면 다음과 같습니다.

 

//MonoBehaviour 클래스를 상속 합니다. 유니티에서 오브젝트의 행동 양식을 결정하는 클래스 입니다.
public class TriggerTextCtrl : MonoBehaviour
{
    //결합할 텍스트 상수입니다.
    private const string TEXT = "TriggerCount : ";
    //접근 제어자를 public으로 하면 유니티 에디터에서 이 변수를 설정할 수 있습니다.
    public Cardboard cardBoard;
    //3DText의 글자는 TextMesh 컴포넌트에서 변경했기 때문에 TextMesh 컴포넌트를 가져와야 합니다.
    private TextMesh textMesh;
    //카운트 변수입니다.
    private int count = 0;
    //Update 메소드가 호출되기 전 단 한 번 호출 됩니다. 보통 변수들을 초기화 하는것을 여기에다 작성합니다.
   
    void Start()
    {
        //gameObject에는 본 컴포넌트가 추가된 게임 오브젝트가 들어가 있습니다. GetComponent<가져올 컴포넌트>(); 를 이용하면 컴포넌트를 가져올 수 있습니다.
        textMesh = gameObject.GetComponent<TextMesh>();
    }
   
    //매 프레임마다 호출되는 메소드 입니다. 여기서 게임 오브젝트의 변화를 설정합니다.
    void Update()
    {
        //카드보드에서 Triggered Getter는 트리거가 발생했는지 알 수 있습니다.
        if (cardBoard.Triggered)
        {
            //TextMesh 컴포넌트의 text를 변경합니다.

            count++;
            textMesh.text = TEXT + count.ToString();
        }
    }

 

 

0f94f04c6dc53a08610b19af375f67a4_1456527 


스크립트를 모두 작성 했으면 컴포넌트를 추가해야 합니다.

 

 

0f94f04c6dc53a08610b19af375f67a4_1456527 


TriggerCount 오브젝트를 선택하여 Inspector 창의 아래에 Add Component로 Trigger Text Ctrl 스크립트를 추가해 줍니다.
Cardboard 스크립트 컴포넌트는 에디터에서 추가해 봅시다.
Trigger Text Ctrl 컴포넌트를 보면 에디터에서 설정 가능한 변수 목록이 보입니다.

하이어라키 창에서 Cardboard컴포넌트를 가지고 있는 CardboardMain을 마우스로 변수에 끌어다 놓으면
에디터에서 자동으로 CardboardMain이 가지고 있는 Cardboard 컴포넌트로 설정해 줍니다.

 

 

0f94f04c6dc53a08610b19af375f67a4_1456527 

 

에디터에서 실행 한 후 터치를 해 보면 TriggerCount 값이 증가 하는 것을 볼 수 있습니다.
다음은 가운데 있는 오브젝트를 감지하는 기능을 추가 해 보겠습니다.

 

 

0f94f04c6dc53a08610b19af375f67a4_1456539 

 

일단 하이어라키 창에서 3D Object -> Cube를 추가 해 보겠습니다.
그리고 저는 카메라 왼쪽에 큐브들을 배치 하였습니다.
큐브의 색깔을 바꾸는 스크립트를 작성해 보겠습니다.

 

 

0f94f04c6dc53a08610b19af375f67a4_1456540 

 

Scripts 폴더 오른쪽 클릭 -> Create -> C# Script 를 선택 해 주세요.

스크립트 이름을 BoxCtrl 으로 만듭니다.


public class BoxCtrl : MonoBehaviour {

   private MeshRenderer meshRenderer;

 

    void Start () {

        //메쉬는 월드에 배치된 오브젝트의 모양입니다.
        meshRenderer = gameObject.GetComponent<MeshRenderer>();
    }

 

    void Update () {

    }

 

    public void Select()
    {

        //meshRenderer의 재질 (material)을 가져와 색깔을 파란색 (R = 0, G = 0 , B = 1)으로 변경합니다.
        meshRenderer.material.color = new Color(0, 0, 1f);
    }
}


 

 

0f94f04c6dc53a08610b19af375f67a4_1456540 

 

다음은 쉽게 색이 바뀌는 박스인지 확인할 수 있게 해당 오브젝트의 태그를 설정하겠습니다.

 

 

0f94f04c6dc53a08610b19af375f67a4_1456540 

 

Inspector창의 Tag옆의 드롭다운 메뉴에서 Add Tag...를 선택합니다. 

 

0f94f04c6dc53a08610b19af375f67a4_1456541 

 

그럼 태그를 설정하는 창으로 바뀌는데 여기서 +버튼을 눌러 Box 태그를 추가합니다. 

 

0f94f04c6dc53a08610b19af375f67a4_1456541 

 

 

그리고 SelectBox의 태그를 Box로 설정합니다.

 

 

0f94f04c6dc53a08610b19af375f67a4_1456541 

 


박스를 여러개 만드려고 하는데 하이어라키에서 복사 붙여넣기 하는 방법도 있지만 프리팹을 이용해 보도록 하겠습니다.
프리팹은 월드에 배치된 오브젝트를 그대로 파일로 만드는 것 입니다.
하이라키 창의 SelectBox를 Prefabs폴더를 만들어 거기에 끌어다 놓으면 쉽게 프리팹을 만들 수 있습니다.

 

 

0f94f04c6dc53a08610b19af375f67a4_1456541
 

만든 프리팹으로 월드에 몇 개 배치해서 적당한 위치로 옮겨 주세요

 

 

0f94f04c6dc53a08610b19af375f67a4_1456541 

 

그다음엔 눈의 가운데를 표시할 크로스 헤어를 만들어 보겠습니다.

 

 

0f94f04c6dc53a08610b19af375f67a4_1456541 


캔버스를 이용하여 만듭니다.
캔버스는 플로팅된 UI를 만들 때 사용합니다.
하이어라키 창에서 오른쪽 클릭하여 UI -> Canvas를 선택합니다.
다음 만들어진 캔버스 오른쪽 클릭하여 이미지를 추가합니다.

 

 

0f94f04c6dc53a08610b19af375f67a4_1456541 


Inspector창에서 적당히 수정합니다.
기본 이미지를 이용하겠습니다.

 

 

0f94f04c6dc53a08610b19af375f67a4_1456542

 


기본적으로 캔버스는 메인 카메라를 기준으로 Overlay되어 있습니다.
VR의 카메라는 두개 이므로 각각 카메라를 기준으로 떠 있도록 해야 합니다
Canvas를 선택하여 Canvas 컴포넌트의 Render Mode를 Screen Space - Camera로 바꾸어 줍니다.
그러면 아래 매개 변수들이 바뀌는데 RenderCamera를 CardboardMain->Head->MainCamera의 자식 Main Camera Left 를 끌어다 놓습니다.
그리고 하이어라키 창에서 Canvas를 선택하여 Ctrl + D를 누르면 Canvas가 복제 됩니다.
그럼 복제된 Canvas의 Canvas 컴포넌트 Render Camera에 Main Camera Right를 끌어다 놓습니다.

 

 

0f94f04c6dc53a08610b19af375f67a4_1456542 


이제 트리거가 발생 했을 때, 화면 가운데에 있는 오브젝트가 무엇인지 감지하여 그 오브젝트가 박스라면 색깔을 변경하도록 하겠습니다.
TriggerTextCtrl에서 코드를 추가하도록 하겠습니다.


화면 가운데에 있는 오브젝트가 무엇인지 감지 할 때엔 RayCast라는 것을 사용합니다.
간단하게 RayCast가 무엇인지 설명 하면 레이저를 쏴서 이 레이저에 맞는 오브젝트를 감지하는 것 입니다.
screenCenter = new Vector3(Camera.main.pixelWidth / 2, Camera.main.pixelHeight / 2);
Vector3는 3개의 float형 변수를 계산할 때 이용이 되며
화면의 픽셀 개수는 Camera.main.pixelWidth , Camera.main.pixelHeight 를 가져와 반으로 나누면 가운데 위치를 가져 올 수 있습니다.
Ray ray = Camera.main.ScreenPointToRay(screenCenter);
메인 카메라를 기준으로 screenCenter 위치에서 발사한 레이를 가져옵니다.
Physics.Raycast(ray, out hit, 500f)
ray에 맞은 500f 범위 안에 있는 적중 정보를 hit에 저장합니다.

맞은 오브젝트의 태그가 Box라면 맞은 오브젝트의 BoxCtrl 컴포넌트를 가져와 Select() 메소드를 호출합니다.

 

 

 

public class TriggerTextCtrl : MonoBehaviour
{
    private const string TEXT = "COUNT : ";
    public Cardboard cardBoard;
    private TextMesh textMesh;
    private int count = 0;
   private Vector3 screenCenter;

    void Start()
    {
        textMesh = gameObject.GetComponent<TextMesh>();
      screenCenter = new Vector3(Camera.main.pixelWidth / 2, Camera.main.pixelHeight / 2);
    }

    void Update()
    {
        if (cardBoard.Triggered)
        {
            ++count;
            textMesh.text = TEXT + count.ToString();           
          Ray ray = Camera.main.ScreenPointToRay(screenCenter);
          RaycastHit hit;
          if(Physics.Raycast(ray, out hit, 500f))
          {
              if (hit.collider.gameObject.tag == "Box")
              {
                  BoxCtrl boxCtrl = hit.collider.gameObject.GetComponent<BoxCtrl>();
                  boxCtrl.Select();                    
              }
          }

        }
    }
}

 



결과 화면입니다.

 

 

작성자 : 이경용

 

VR과 함께 사용되는 다양한 컨트롤러 알아보기

가상현실

 

 

 

이번 강의는 VR에 사용되는 컨트롤러 기술들에 대해 알아 보겠습니다.

VR컨트롤러를 사용함으로써 가상현실을 단순히 보는 것에서 직접 이동하고 만져 보는 등의 행동을 체험함으로써 가상현실의 효과를 높일 수 있습니다.

그럼, 현재 많이 활용되고 있는 컨트롤러 몇가지를 살펴보도록 하겠습니다.

 

 

오큘러스 터치


오큘러스 VR이 마이크로소프트사와 제휴를 맺어 VR 전용 컨트롤러인 ‘오큘러스 터치’를 개발 하였다. 디자인은 아래와 같다. 조이 스틱(Joy Stick)을 이용하여 가상 공간에서 움직일 수 있고, 정면의 버튼은 트리거 라고 하는데, 이 트리거의 위치는 인체 공학적으로 설계되어 있어서 물건을 잡고, 던지고, 쌓고, 누르는 동작이 매우 자연스럽다고 한다. 또한, 누르는 압력과 손과 팔의 궤적까지 인식한다. 하지만 가격이 비싸며, 오큘러스의 특성상 적외선 트래킹 센서가 필요하기 때문에 움직이면서 사용하기엔 적당하지 않다.


 


PS VR 컨트롤러


소니의 플레이 스테이션도 VR시장에 뛰어들어 프로젝트 모피어스 라는 이름으로 개발중이다.
플레이 스테이션 VR 전용 컨트롤러의 모습은 아래와 같다. 왼쪽이 컨트롤러로 상단의 하얀 구체에서 빛이 나며 오른쪽의 카메라로 컨트롤러의 정확한 위치를 인식한다. 아직 출시 되지 않았다는 것이 가장 큰 단점이다.


 


폭풍마경 컨트롤러

아래의 사진은 중국에서 제작한 폭풍 마경이며, 원가 한화 약 2만원 정도의 제품이라고 하기에는 믿을 수 없는 퀄리티를 자랑한다. 전용 컨트롤러도 함께 제공 하며, 이 컨트롤러는 블루투스로 연결이 된다. 단점은 전용 앱에서만 사용이 가능하다고 하지만, 키 매핑을 변경하면 조이 스틱을 제외한 버튼은 어느 정도 사용이 가능하다고 한다. 제스쳐를 인식 하는지에 대한 정보는 존재 하지 않는다.

 

​ 


MYO


팔 근육의 움직임을 인식하는 컨트롤러이다. 유니티 전용은 아니지만 제작사에서 유니티 패키지를 제공하며, MYO, Unity, Android 를 연동한 개발자도 있다. 손의 모양을 정확하지 않지만 어느 정도 인식 하는 듯 하며, 팔이 어느 정도 어느 방향으로 이동 하였는지도 인식 한다. 온라인 마켓에 약 30만원 정도에 판매 중이다.



 

Leap Motion

적외선 센서를 이용해 Leap Motion 위에 있는 위치의 거리를 인식하는 기기이다. 약간의 오차
가 존재 하기는 하지만 꽤 정확한 위치를 인식 할 수 있다는 것이 장점이다. 단점은 USB를 통한 전
원 공급이 필요한데, 스마트폰과 연결하여 사용 할 수 없고, Leap Motion을 PC에 연결하고, PC 와
스마트폰간의 서버 클라이언트 구조로 개발해야 한다는 것이다.

 

Manus E3

장갑 형태로 착용하여 손 모양을 그대로 인식 하는 컨트롤러이다. 가속도, 자이로센서, 마그네토미터를 내장하고 있으며, 해당 장갑과 관련된 모든 소프트웨어는 오픈 소스여서 누구나 쉽게 접근할 수 있다. 또, 블루투스 연결로 오큘러스, 스팀 VR뿐만 아니라 기어 VR 같은 기기와도 연결되어 범용성이 뛰어나다. 마누스 머시나는 현재 기어 VR과 안정적인 호환을 위해 힘쓰고 있다. 현재윈도우 8, 8.1, 리눅스, 안드로이드 4.0 이상을 지원하여 구글 카드보드와 같이 사용할 수 있고, 개발자 키트는 280달러로 곧 지원할 예정이며, 정식 출시는 200달러로 2016년 상반기에 이루어질계획이라고 한다.



 

​이처럼 다양한 컨트롤러들의 발전으로 가상현실 보다 현실감 있게 체험할 수 있을 것이다.

앞으로 출시될 컨트롤러가 기대되며, 현재 나온 컨트롤러들이 잘 활용된 콘텐츠가 많이 나오길 기대해 본다. ​