Physics.Raycast에 걸린 문제가 해결되었습니다.

10719 단어 OculusOculusGoUnity
Unity의 Physics.Raycast에 걸린 건. 어제 저녁 이후 계속 고민하고 있었습니다만 해결했습니다.
결론으로서는 좌표와 벡터의 차이를 제대로 억제해 두는 것이었습니다.

Unity의 Physics.Raycast 란 무엇입니까?



특정 벡터 방향에 대해 물체가 존재하는지 확인하는 기능입니다.
예를 들어 OculusGo의 컨트롤러에 대해 설정하여 컨트롤러가 가리키는 대상 객체를 식별합니다.
거리의 측정 등이 가능해져, 꽤 이용률이 높은 기능이라고 생각됩니다.

무슨 일이야?



먼저 아래 코드를 참조하십시오.

RayCastSample.cs
    [SerializeField] private LineRenderer Laser;
    [SerializeField] private GameObject FoucusPoint;

    // Update is called once per frame
    void Update()
    {
        RaycastHit hit;
        var t = GetComponent<Transform>();
        var ray = new Ray(t.position, t.TransformDirection(Vector3.forward));
        if (Physics.Raycast(ray, out hit))
        {
            var target = ray.direction * hit.distance;

            // Debug 
            Debug.DrawRay(t.position, target, Color.red);

            Laser.SetPositions(new Vector3[] { t.position, target });
            FoucusPoint.SetActive(true);
            FoucusPoint.transform.position = target;

            Debug.Log("ray = " + ray);
            Debug.Log("start = " + t.position);
            Debug.Log("target = " + target);

            Debug.Log("Did Hit");
        }
    }


이미지로서는 레이저를 조사해 맞은 부분에 돌기가 생기는 상황을 만들려고 합니다.

포인트는 여기입니다.
var target = ray.direction * hit.distance;

ray의 방향 벡터에 hit까지의 거리를 곱해 레이저의 접촉점의 좌표를 만들려고 합니다.

위의 출력 결과입니다.



빨간 공이 레이저 발사구입니다. DrawRay는 잘 그려졌지만 레이저 조사 방향에 실수가 있습니다.
로그를 확인해 봅니다.


target의 상정 좌표가 다릅니다. Y축의 값이 다릅니다.
Debug.DrawRay는 예상대로의 거동인데,,,,,
그래서 Debug.DrawRay의 사양을 조사해 보았습니다.



끝났어. Debug.DrawRay의 두 번째 인수는 좌표가 아닌 방향 벡터였습니다.

이전의
var target = ray.direction * hit.distance;

ray의 방향 벡터에 hit까지의 거리를 곱해 레이저의 접촉점의 좌표를 만들려고 합니다.
라는 것은

실수입니다.

정답은 이렇게
var target = ray.orgin + ray.direction * hit.distance;

ray의 방향 벡터에 hit까지의 거리를 곱해도 방향 벡터가 가능한 것만으로
발사 지점의 좌표를 더하여 처음으로 대상의 좌표를 계산할 수 있습니다.

제대로 움직이는 코드를 씁니다.

RayCastSample.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RaycastSample : MonoBehaviour
{

    [SerializeField] private LineRenderer Laser;
    [SerializeField] private GameObject FoucusPoint;


    // Update is called once per frame
    void Update()
    {
        RaycastHit hit;
        var t = GetComponent<Transform>();
        var ray = new Ray(t.position, t.TransformDirection(Vector3.forward));
        if (Physics.Raycast(ray, out hit))
        {
            var dir = ray.direction * hit.distance;
            var target = ray.origin + dir;
            // Debug 
            Debug.DrawRay(t.position, dir, Color.red);

            Laser.SetPositions(new Vector3[] { t.position, target });
            FoucusPoint.SetActive(true);
            FoucusPoint.transform.position = target;
            Debug.Log("Did Hit");
        }

    }
}


렌더링 결과



잘 작동했습니다.

결론



좌표인지 벡터인지 제대로 의식하자. 후 매뉴얼 제대로 읽을 수

좋은 웹페이지 즐겨찾기