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를 사용하는 게임은 알기 쉽습니다만 목이 피곤하기 때문에 모처럼이므로 컨트롤러를 사용해 가고 싶습니다.
Reference
이 문제에 관하여(Oculus Go에서 레이저 포인터 표시), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/noitak/items/f442a45c2d772d9d8269텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)