한 게임 객체가 다른 게임을 볼 수 있는지 어떻게 확인할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/203787

문제

나는 45도 시야와 제한보기 범위를 가진 특정 방향을 향한 대상이 있습니다. 모든 초기 검사 (Quadtree Node 및 Distance)를 수행했지만 이제는 특정 객체가 해당 뷰 콘 내에 있는지 확인해야합니다 (이 경우 볼 수있는 경우 해당 객체 만 따르기로 결정합니다).

각 학위마다 광선을 주조하는 것 외에도 Direction - (FieldOfView / 2) 에게 Direction + (FieldOfView / 2) (나는 지금 그것을하고 있고 그것은 끔찍합니다),이 가시성 검사를하는 가장 좋은 방법은 무엇입니까?

도움이 되었습니까?

해결책

뷰 방향 (벡터로 이해)과 벡터 사이의 각도를 계산하여 객체에서 끝납니다. FieldofView/2 아래에 있으면 객체를 볼 수 있습니다.

그 각도는 다음과 같습니다.

arccos(scalarProduct(viewDirection, (object - you)) / (norm(viewDirection)*norm(object - you))).

다른 팁

저는 비디오 게임 업계에서 일했으며 ArcCos와 같은 트리그 기능을 수행하는 것이 이상적이지 않다고 말할 수 있습니다. 대신, 당신은 원뿔의 각도의 코사인을 사전에 계산합니다.

float cos_angle = cos(PI/4); // 45 degrees, for example

그런 다음 각 프레임은 원뿔과 콘의 도트 제품과 비교하여 포인트가 해당 원뿔 안에 떨어지면 신속하게 확인할 수 있습니다.

vector test_point_vector = normalize(test_point_loc - cone_origin);
float dot_product = dot(normalized_cone_vector, text_point_vector);
bool inside_code = dot_product > cos_angle;

트리그 함수가없고 약간의 곱셈, 분할 및 추가가 있습니다. 대부분의 게임 엔진에는 벡터에 대한 최적화 된 정규화 () 기능이 있습니다.

이것은이 방정식으로 인해 작동합니다.

A · B = |A| * |B| * cos(Θ)

벡터 (a-> an)를 정규화하면 방정식이 단순화됩니다.

An · Bn = cos(Θ)

뷰어의 제목 벡터와 벡터 사이의 각도를 뷰어에서 대상으로 가져옵니다. 해당 각도가 (FieldOfView/2)보다 작 으면 대상이 시청자의 시야에 있습니다.

벡터가 2D 또는 3D 인 경우 동일한 방식으로 작동합니다. (3D에서는 원뿔 대신 Frustum이있는 경우 각도를 두 구성 요소로 분리해야합니다.) 두 벡터 사이의 각도를 찾아야합니다.

단일 지점보다 큰 대상을 테스트하려면 경계 상자의 모서리와 같은 각 대상에 대해 여러 포인트가 필요합니다. 시청자의 벡터가 시야 내부에 각도를 제공하면 상자의 모서리가 보입니다.

3D를하고 있고보기 범위를 좌절로 정의 할 수 있다면 이와 유사한 것을 사용할 수 있습니다. 좌절 컬링 기술.

이미 좋은 답변이지만 Wolfire 블로그에 대한 링크를 제공하고 싶었습니다. 최근에 그들은 "Field of View"방정식을 한 예제로 취하는 대수 시리즈를 시작했습니다. 가서 읽으십시오, 잘 쓰여지고 쉽습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top