Youtube - 부채꼴 안의 적 판별
유튜브 링크로 결과물을 올려두었으니 먼저 영상을 보고 포스팅을 읽어보는 것을 추천합니다.
아래 요소만 주어지면 부채꼴 내부에 적이 있는지 판별이 가능하다.
벡터의 내적은 위와 같이 두가지 방법으로 구할 수 있다.
여기서는 두 방법을 모두 사용하게 된다.
1. '타겟-나 벡터'와 '내 정면 벡터'를 내적하기 위해
2. 내적 결과에 cos의 역을 취해서 theta를 구하기 위해
// '타겟-나 벡터'와 '내 정면 벡터'를 내적
float dot = Vector3.Dot(interV.normalized, transform.forward);
// 두 벡터 모두 단위 벡터이므로 내적 결과에 cos의 역을 취해서 theta를 구함
float theta = Mathf.Acos(dot);
A 벡터와 B 벡터의 사잇각이 '부채꼴의 사잇각 / 2'보다 작거나 같은지 판별하기 위해. 만약 아니라면 적이 범위에 들어오지 않은 것임.
여기서 A 벡터는 타겟의 좌표 - 내 좌표로 구할 수 있다.
Vector3 interV = target.position - transform.position;
B 벡터는 transform.forward
로 구할 수 있다. (정확히 말하면 B벡터의 normalization)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor; // OnDrawGizmos
public class CircularSector : MonoBehaviour
{
public Transform target; // 부채꼴에 포함되는지 판별할 타겟
public float angleRange = 30f;
public float radius = 3f;
Color _blue = new Color(0f, 0f, 1f, 0.2f);
Color _red = new Color(1f, 0f, 0f, 0.2f);
bool isCollision = false;
void Update()
{
Vector3 interV = target.position - transform.position;
// target과 나 사이의 거리가 radius 보다 작다면
if (interV.magnitude <= radius)
{
// '타겟-나 벡터'와 '내 정면 벡터'를 내적
float dot = Vector3.Dot(interV.normalized, transform.forward);
// 두 벡터 모두 단위 벡터이므로 내적 결과에 cos의 역을 취해서 theta를 구함
float theta = Mathf.Acos(dot);
// angleRange와 비교하기 위해 degree로 변환
float degree = Mathf.Rad2Deg * theta;
// 시야각 판별
if (degree <= angleRange / 2f)
isCollision = true;
else
isCollision = false;
}
else
isCollision = false;
}
// 유니티 에디터에 부채꼴을 그려줄 메소드
private void OnDrawGizmos()
{
Handles.color = isCollision ? _red : _blue;
// DrawSolidArc(시작점, 노멀벡터(법선벡터), 그려줄 방향 벡터, 각도, 반지름)
Handles.DrawSolidArc(transform.position, Vector3.up, transform.forward, angleRange / 2, radius);
Handles.DrawSolidArc(transform.position, Vector3.up, transform.forward, -angleRange / 2, radius);
}
}
이 글의 코드도 한 번 보는 것을 추천한다. 나는 라디안을 degree로 바꾸어서 좀 더 angle과의 연관성을 이해하기 쉽게 하기 위해 acos을 한 번 하는 과정을 더 거쳤지만 링크에서는 그 과정을 생략하고 라디안끼리의 비교로 판단했다.
안녕하세요 글 너무 잘 봤습니다
부채꼴의 사이각 /2 보다 작거나 같다는 부분이 이해가 잘 안가는데 설명해주실 수 있을까요?