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

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)
코샵
코샵
나의 코딩 일기장
    반응형
  • 코샵
    끄적끄적 코딩 공방
    코샵
    • 분류 전체보기 (725)
      • 스마트팜 (0)
      • 상품 추천 (223)
      • MongoDB (4)
      • 하드웨어 (17)
      • 일기장 (4)
      • 파이썬 (130)
        • Basic (41)
        • OpenCV (8)
        • Pandas (15)
        • PyQT (3)
        • SBC(Single Board Computer) (1)
        • 크롤링 (14)
        • Fast API (29)
        • Package (6)
      • Unity (138)
        • Tip (41)
        • Project (1)
        • Design Pattern (8)
        • Firebase (6)
        • Asset (2)
      • Linux (4)
      • C# (97)
        • Algorithm (11)
        • Window (7)
      • TypeScript (51)
        • 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)
  • 인기 글

  • 태그

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

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

티스토리툴바