Oculus Go에서 레이저 포인터 표시

9274 단어 OculusOculusGoVRUnity
Oculus Go에서 컨트롤러에서 레이저 포인터 가이드를 표시하는 방법을 조사했기 때문에 비망록으로.



참고



Use GearVrController with Selection Ray - Unity

기본적으로 여기에 쓰여진 거리에 하면 OK.

사용중인 컨트롤러 (좌우 어느 쪽?)를 취득합니다.



Oculus Go는 좌우 손으로 컨트롤러를 사용할지 설정할 수 있으므로 앱 내에서의 표시도 이 설정을 따라야 합니다. 현재 컨트롤러를 좌우 어느 손으로 사용하고 있는지는 OVRInput.GetActiveController 로 취득할 수 있습니다.
// 現在アクティブなコントローラーを取得
var controller = OVRInput.GetActiveController();
if (controller == OVRInput.Controller.RTrackedRemote)
{
    // 右手
    return _RightHandAnchor;
}
else if (controller == OVRInput.Controller.LTrackedRemote)
{
    // 左手
    return _LeftHandAnchor;
}

OVRInput.GetActiveController 는 Start 나 Awake 의 타이밍에서는 취득할 수 없었다 (OVRInput.Controller.None 가 돌아온다) 때문에, Update 중에서 취득하고 있습니다 (조금 빠졌다. 솔직하게 참고 기사대로 하면 좋았다) .

Oculus 공식 OVRInput 문서 에 의하면, OVRInput.IsControllerConnected 에서도 판정할 수 있는 모양.

컨트롤러 위치 얻기



컨트롤러(손)의 위치 그 자체는 OVRCameraRig 에 붙어 있는 LeftHandAnchor/RightHandAnchor 로부터 취득할 수 있습니다.

컨트롤러 모델을 보려면 Oculus Integration과 함께 제공된 Prefav, TrackedRemote를 LeftHandAnchor/RightHandAnchor 아래에 각각 배치하면 오른손 왼손의 설정에 따라 좋은 상태로 표시를 전환할 수 있습니다.



그리고는 이 위치에서 Ray를 날려 레이저를 표시하면 OK.

코드



LaserPointer.cs
public class LaserPointer : MonoBehaviour 
{
    [SerializeField]
    private Transform _RightHandAnchor;

    [SerializeField]
    private Transform _LeftHandAnchor;

    [SerializeField]
    private Transform _CenterEyeAnchor;

    [SerializeField]
    private float _MaxDistance = 100.0f;

    [SerializeField]
    private LineRenderer _LaserPointerRenderer;

    private Transform Pointer
    {
        get
        {
            // 現在アクティブなコントローラーを取得
            var controller = OVRInput.GetActiveController();
            if (controller == OVRInput.Controller.RTrackedRemote)
            {
                return _RightHandAnchor;
            }
            else if (controller == OVRInput.Controller.LTrackedRemote)
            {
                return _LeftHandAnchor;
            }
            // どちらも取れなければ目の間からビームが出る
            return _CenterEyeAnchor;
        }
    }

    void Update () 
    {
        var pointer = Pointer;
        if (pointer == null || _LaserPointerRenderer == null)
        {
            return;
        }
        // コントローラー位置からRayを飛ばす
        Ray pointerRay = new Ray(pointer.position, pointer.forward);

        // レーザーの起点
        _LaserPointerRenderer.SetPosition(0, pointerRay.origin);

        RaycastHit hitInfo;
        if (Physics.Raycast(pointerRay, out hitInfo, _MaxDistance))
        {
            // Rayがヒットしたらそこまで
            _LaserPointerRenderer.SetPosition(1, hitInfo.point);
        }
        else
        {
            // Rayがヒットしなかったら向いている方向にMaxDistance伸ばす
            _LaserPointerRenderer.SetPosition(1, pointerRay.origin + pointerRay.direction * _MaxDistance);
        }
    }
}



요약



포인터 조작에 Gaze를 사용하는 게임은 알기 쉽습니다만 목이 피곤하기 때문에 모처럼이므로 컨트롤러를 사용해 가고 싶습니다.

좋은 웹페이지 즐겨찾기