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.csusing 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");
}
}
}
렌더링 결과
잘 작동했습니다.
결론
좌표인지 벡터인지 제대로 의식하자. 후 매뉴얼 제대로 읽을 수
Reference
이 문제에 관하여(Physics.Raycast에 걸린 문제가 해결되었습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/m0a/items/9f254e1ddb8e75da779f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
먼저 아래 코드를 참조하십시오.
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");
}
}
}
렌더링 결과
잘 작동했습니다.
결론
좌표인지 벡터인지 제대로 의식하자. 후 매뉴얼 제대로 읽을 수
Reference
이 문제에 관하여(Physics.Raycast에 걸린 문제가 해결되었습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/m0a/items/9f254e1ddb8e75da779f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Physics.Raycast에 걸린 문제가 해결되었습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/m0a/items/9f254e1ddb8e75da779f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)