시야 범위에 타켓 오브젝트가 들어와 있는지 확인하는 방법

2023. 11. 21. 11:58·Unity
반응형

Unity 오브젝트의 시야 범위에 타켓 오브젝트가 들어와 있는지 확인하는 방법은 여러 가지가 있습니다.

그 중 하나인 두 오브젝트의 내적을 구하고, 라디안(π)을 호도각(0~360°)으로 변환시켜 사용하는 방법을 소개하겠습니다.

 

내적이란?

내적은 두 벡터의 크기와 방향의 일치 정도를 나타내는 값으로 Vector3.Dot() 메서드를 통해 구할 수 있습니다.

A⋅B=∣A∣⋅∣B∣⋅cos(θ) 여기서 ∣A∣와 ∣B∣는 각각 벡터 A와 B의 크기(길이)이고,

θ는 A와 B 사이의 각입니다. 내적의 결과는 스칼라값입니다.

public static float Dot(Vector3 lhs, Vector3 rhs) => (float) ((double) lhs.x * (double) rhs.x + (double) lhs.y * (double) rhs.y + (double) lhs.z * (double) rhs.z);

 

이 함수는 두 벡터의 내적을 계산하여 float 값으로 반환합니다.

 

세타각이란?

세타각은 두 벡터의 방향 사이의 각도입니다. 세타각은 다음과 같이 구할 수 있습니다.

Math.Acos((double) f)

이 함수는 주어진 실수 f의 아크코사인 값을 계산하여 float 값으로 반환합니다.

내적에서 계산된 cos(θ)에서 θ를 계산하기 위해 Acos을 계산합니다.

θ=cos⁡−1(dot(a,b)∥a∥⋅∥b∥)\theta = \cos^{-1}\left(\frac{\text{dot}(\mathbf{a}, \mathbf{b})}{\|\mathbf{a}\| \cdot \|\mathbf{b}\|}\right)

 

Rad2Deg란?

public struct Mathf
{
	public const float Rad2Deg = 57.29578f;
}

라디안 값을 도 단위로 변환하는 상수입니다. 라디안은 원의 반지름에 대한 호의 길이가 반지름과 같은 크기인 각을 나타내는 각도의 단위입니다. 

 

시야 범위 확인

다음은 시야 범위에 타켓 오브젝트가 들어와 있는지 확인하는 예제 코드입니다.

// 오브젝트의 시야 방향을 나타내는 벡터를 생성합니다.
Vector3 viewDirection = transform.forward;

// 타켓 오브젝트의 위치와 오브젝트의 위치를 이용하여 두 벡터를 생성합니다.
Vector3 targetPosition = target.transform.position;
Vector3 originPosition = transform.position;

// 두 벡터의 내적을 계산합니다.
float dot = Vector3.Dot(viewDirection, targetPosition - originPosition);

// 내적 값을 사용하여 라디안을 구하고, 호도각으로 변환합니다.
float theta = Mathf.Acos(dot) * Mathf.Rad2Deg;

// 세타각이 시야 범위 내에 있는지 확인합니다.
if (theta < fov)
{
    // 시야 범위에 있습니다.
}

이 코드에서 fov는 시야 범위의 각도를 나타내는 상수입니다.

 

결론

Vector3.Dot() 함수를 사용하여 내적을 구하고, Mathf.Acos() 함수와 Mathf.Rad2Deg를 사용하여 세타각을 구하는 방법은 오브젝트의 시야 범위에 타켓 오브젝트가 들어와 있는지 확인할 수 있는 방법입니다.

저작자표시 비영리 변경금지 (새창열림)

'Unity' 카테고리의 다른 글

Vector3 : Lerp, SmoothDamp, MoveTowards 비교  (0) 2023.11.23
헷갈리는 오브젝트 회전 방법 Part 2 (Lerp, Slerp, RotateTowards)  (0) 2023.11.22
C# 프로젝트 파일이 열리지 않을 때 (VSCode)  (0) 2023.11.21
헷갈리는 오브젝트 회전 방법 Part 1 (LookRotation, LookAt, RotateTowards)  (1) 2023.11.20
Unity에서 Google AdMob을 사용하는 방법  (1) 2023.11.07
'Unity' 카테고리의 다른 글
  • Vector3 : Lerp, SmoothDamp, MoveTowards 비교
  • 헷갈리는 오브젝트 회전 방법 Part 2 (Lerp, Slerp, RotateTowards)
  • C# 프로젝트 파일이 열리지 않을 때 (VSCode)
  • 헷갈리는 오브젝트 회전 방법 Part 1 (LookRotation, LookAt, RotateTowards)
코샵
코샵
나의 코딩 일기장
    반응형
  • 코샵
    끄적끄적 코딩 공방
    코샵
    • 분류 전체보기 (597)
      • 상품 추천 (105)
      • MongoDB (4)
      • 하드웨어 (9)
      • 일기장 (4)
      • Unity (138)
        • Tip (41)
        • Project (1)
        • Design Pattern (8)
        • Firebase (6)
        • Asset (2)
      • 파이썬 (12)
        • Basic (41)
        • OpenCV (8)
        • Pandas (15)
        • PyQT (3)
        • SBC(Single Board Computer) (1)
        • 크롤링 (14)
        • Fast API (29)
        • Package (6)
      • Linux (4)
      • C# (97)
        • Algorithm (11)
        • Window (7)
      • TypeScript (50)
        • CSS (10)
      • Git (11)
      • SQL (5)
      • Flutter (10)
        • Tip (1)
      • System (1)
      • BaekJoon (6)
      • Portfolio (2)
      • MacOS (1)
      • 유틸리티 (1)
      • 서비스 (6)
      • 자동화 (3)
      • Hobby (10)
        • 물생활 (10)
        • 식집사 (0)
  • 인기 글

  • 태그

    긴유통기한우유
    스크립트 실행 순서
    리뷰이관
    카페24리뷰이관
    appdevelopment
    C#
    셀레니움
    쇼핑몰리뷰
    rtsp
    ipcamera
    스마트스토어리뷰
    learntocode
    programming101
    파이썬
    programmerlife
    Python
    믈레코비타멸균우유
    스크립트 실행
    devlife
    codingtips
    codingcommunity
    list
    상품 리뷰 크롤링
    unity
    라떼우유
    리스트
    리뷰관리
    유니티
    cv2
    카페24리뷰
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코샵
시야 범위에 타켓 오브젝트가 들어와 있는지 확인하는 방법
상단으로

티스토리툴바