[Unity 입문] 오큘러스고에서 LaserPointer를 하는 슬픔.


※ 그림을 클릭하면 유튜브 영상에 연결
이것은 어떤 의미에서 매우 어렵다...정보가 너무 어렵거나 부족하기 때문에 쉽게 빠져들기 때문에 적어야 한다
【참고】
Oculus Go로 레이저 포인터 표시
라인 렌더로 선 하나 그릴게요.
Use GearVrController with Selection Ray - Unity
[Unity/Oculus Go] Oculus Go 컨트롤러에 대해서.
대체로 ①에서 보듯이 중요한 기록이 없어 재현이 불가능하다.그러므로 참고로 ②를 인용하고 싶습니다.
또한 참조④, 참조③에서 보듯이 포인터 조작을 통해 LaserPointer를 조작하고자 합니다.

해본 일


(1) 예제의 OculusGo 설정
(2) OVRCAmeraRig, Cube 및 LaserPointer 부착
(3) LaserPoint의 C#Script
(4) 반사는...

(1) 예제의 OculusGo 설정


[Unity 입문] Oculus Go에서 정지 그림을 모아서 애니메이션을 만들고 한 번 더 놀아요.의 (1) Oculus용 설정을 보십시오.

(2) OVRCAmeraRig 및 LaserPointer 부착


① 먼저 OVRcameraRig을 붙여 넣습니다.

②LeftHandAnchor와 RightHandAnchor에 VR을 붙인 TrackedRemote
③Create-3 DObject-Cube에 Cube를 붙여넣기

④CreateCreateEnmpty 붙여넣기를 선택하여 이름을 LaserPoint로 변경하고 AddComponet으로 Effects-Lineder에 Line Renderer를 붙여넣습니다.
그리고 다음과 같이 설정합니다.여기서 레이저의 폭은 오른쪽 중간의 도표이지만 거의 0이다.다른 설정이 적당하니 다양한 변화를 시도해 보세요.

(3) LaserPoint의 C#Script


이번 메인 메뉴는 이거죠?이곳의 참고 코드는 기본적으로 모두 알림 조작을 사용한다[참고] ④
・押されている間Trueが返るもの
// コントローラーのトリガー
bool trigger = OVRInput.Get(OVRInput.Button.PrimaryIndexTrigger);
// タッチバッドのボタン
bool touchButton = OVRInput.Get(OVRInput.Button.PrimaryTouchpad);
・押された瞬間のみTrueが返るもの
bool backButton = OVRInput.Get(OVRInput.Button.Back);
다음과 같은 방법을 사용했습니다.
이렇게 되면 바늘 앞을 눌렀을 때만 레이저가 나온다.
LaserPointer.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LaserPointer : MonoBehaviour
{
    [SerializeField]
    private Transform _RightHandAnchor;
    [SerializeField]
    private Transform _LeftHandAnchor;
    [SerializeField]
    private Transform _CenterEyeAnchor;
    [SerializeField]
    private float _MaxDistance = 100.0f;
    private float _MinDistance = 0.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 _RightHandAnchor;   //_CenterEyeAnchor;
        }
    }
    void Update()
    {
        var pointer = Pointer;
        if (pointer == null || _LaserPointerRenderer == null)
        {
            return;
        }
        // コントローラーのトリガー
        if (OVRInput.Get(OVRInput.Button.PrimaryIndexTrigger))
            {
            // コントローラー位置から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);
            }
        }
        else
        {
            // コントローラー位置からRayを飛ばす
            Ray pointerRay = new Ray(pointer.position, pointer.forward);
            // レーザーの起点
            _LaserPointerRenderer.SetPosition(0, pointerRay.origin);
            // コントローラーのトリガー無しの場合、Rayが向いている方向にMinDistance(0)
            _LaserPointerRenderer.SetPosition(1, pointerRay.origin + pointerRay.direction * _MinDistance);
        }
    }
}
좀 길지만 이해하기 쉬운 코드라는 뜻인 것 같아요.
나는 바늘과 함께 레이저의 출발점을 들고 이렇게 하지 않으면 마지막에 누르는 것을 멈추었지만 끈이 또 길어져서 왠지 군더더기가 느껴져서 이렇게 했다.

(4) 반사는...


반사
// Rayがヒットしたらそこまで
_LaserPointerRenderer.SetPosition(1, hitInfo.point);
열다
_LaserPointerRenderer.SetPosition(1, hitInfo.point +reflectionRay.direction * _MaxDistance );
이것 괜찮아요?저는 디렉션만 계산하면 돼요...
그러니 아래처럼 얼렁뚱땅 넘어가 보세요...
...구글을 참고하면 다음과 같은 방법을 참고하여 레이저의 앞부분을 줄일 수 있다.하지만 이번 보도가 없었다면 이대로 계속됐을 테니까요.
【참고】
[Unity/Oculus Go] Oculus Go 컨트롤러 디스플레이 방법과 버튼 획득 방법
적절한 각도로 Laser의 선을 곡선화했습니다.
그래프를 두 번 클릭하면 곡선으로 수정할 수 있습니다:.또는 커브와 비슷하게 가운데 점을 추가할 수 있습니다.

반사 계산은 근처에 없는 것 같으니 어쨌든 적당한 방향으로 반사시키자.
그래서 나는 아래의 코드를 써 보았지만 실패했다...
RaycastHit hitInfo;
if (Physics.Raycast(pointerRay, out hitInfo, _MaxDistance))
{
    // Rayがヒットしたらそこまで
    _LaserPointerRenderer.SetPosition(1, hitInfo.point);
    //ヒットしたところから、反射させてみる 
    Vector3 incomingV = hitInfo.point - pointerRay.origin;
    Vector3 reflectV = Vector3.Reflect(incomingV, hitInfo.normal);
    _LaserPointerRenderer.SetPosition(2, reflectV);
}
한 마디로 하면 incoming은 입력에서 찾은 벽의 법선 벡터와 입력 벡터에 따라 반사 벡터를 계산하여 LaserPointer를 보낼 계획이다.그런데 왜 발사하지 않았을까...하지만 (1hitInfo.pointL+refletctV) 반사되면 빛이 이상한 방향으로 움직여서 계산이 맞는 것 같은데...오늘은 도저히 해결할 수 없으니 이 과제는 다음에 다시 제기하자.
【참고】
Vector3.Reflect
RaycastHit.normal
OculusGo:Laser_위치 조작 지침.떠나면 사라지는 슬픔

※ 그림을 클릭하면 유튜브 영상에 연결

총결산


· LaserPointer를 설치해 보았습니다
· OculusGo의 포인터를 통해 조작 가능
・반사에 도전해 보았지만 아무리 해도 잘 안 풀려요. 계산이 있는 것 같아요.
그림에 힘만 쓰면 완성할 수 있는 곳...

좋은 웹페이지 즐겨찾기