OVR 카메라 회전 비율 변경

오큘러스 VR의 카메라 회전 비율 변환 코드입니다.

오큘러스 VR SDK에서는 기본적으로 이와 같은 기능은 VR 멀미가 발생할 가능성이 높기에 지원하지 않는데요. 종종 이와같은 기능이 특수한 VR시뮬레이션/게임 구현을 위해 필요할 때가 있기에 구현 해 보았어요.

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

//C# OVR 카메라 회전 비율 변경
public class ovr_speedcon : MonoBehaviour {
    //쿼터니언 변수 선언, update 안에서 선언할 경우 매번 재선언되므로 한번만 선언해도 되는 건 한번만 선언하세요.
    public Quaternion rotate = Quaternion.identity;

    // Use this for initialization
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

        rotate = UnityEngine.XR.InputTracking.GetLocalRotation(UnityEngine.XR.XRNode.CenterEye);
        float angle = Quaternion.Angle(transform.rotation, UnityEngine.XR.InputTracking.GetLocalRotation(UnityEngine.XR.XRNode.CenterEye));

        // OVR(오큘러스 VR)원래의 각도변환 출력 - 로그창
        Debug.Log("Original OVR angle change( x :" + rotate.eulerAngles.x.ToString() + ", y : " + rotate.eulerAngles.y.ToString() + ", z :" + rotate.eulerAngles.z.ToString() + " )");
        //Quaternion각을 오일러각으로 변환
        float x = rotate.eulerAngles.x;
        float y = rotate.eulerAngles.y;
        float z = rotate.eulerAngles.z;

        //OVR 각좌표는 3축 0 - 360의 절댓값이며, 이로 인해 180도 이후에는 역방향으로 movement를 계산해주어야 해요.
        //기본적으로 OVR SDK에 의해 별도의 설정 없이도 카마라가 1배속으로 강제 회전하므로, 0.5배로 맞추려면 -0.5배로 해 주어야 하며 1.5배로 하고 싶으면 부호를 지워 주면 되요. 
        //OVR는 뒤로 고개젖힘에 대해서는 약간 부정확한 각도 값을 반환하는데 해당 부분에 대해서는 생략했어요.
        if (x > 180)
        {
            x = 360.0F - ((360 - rotate.eulerAngles.x) * 0.5F);
            x = -x;
        }
        else
        {
            x = rotate.eulerAngles.x * 0.5F;
            x = -x;
        }

        if (y > 180)
        {
            y = 360.0F - ((360 - rotate.eulerAngles.y) * 0.5F);
            y = -y;

        }
        else
        {
            y = rotate.eulerAngles.y * 0.5F;
            y = -y;
        }

        if (z > 180)
        {
            z = 360.0F - ((360 - rotate.eulerAngles.z) * 0.5F);
            z = -z;

        }
        else
        {
            z = rotate.eulerAngles.z * 0.5F;
            z = -z;
        }



        //transform.Rotate(rotation.eulerAngles.x * cast, rotation.eulerAngles.y * cast, rotation.eulerAngles.z * cast);
        //변화시킨 local 오일러각 변화를 OVR 카메라에 적용.
        transform.localEulerAngles = new Vector3(x, y, z);

        // OVR(오큘러스 VR)변화한 각도변환 출력 - 로그창
        Debug.Log("OVR Changed  camera angle( x :" + x + ", y : " + y + ", z :" + z + " )");
    }
}

댓글 없음:

댓글 쓰기

글에 대한 의문점이나 요청점, 남기고 싶은 댓글이 있으시면 남겨 주세요. 단 악성 및 스팸성 댓글일 경우 삭제 및 차단될 수 있습니다.

모든 댓글은 검토 후 게시됩니다.

Translate