2008-10-15 6 views
9

저는 45 도의 시야와 제한된보기 범위와 함께 특정 방향을 향하고있는 물체를 가지고 있습니다. 모든 초기 검사 (Quadtree 노드 및 거리)를 수행했지만, 이제는 특정 객체가 해당 뷰 원추 내에 있는지 확인해야합니다 (이 경우 볼 수있는 경우 해당 객체를 따르기로 결정하는 경우).한 게임 개체가 다른 개체를 볼 수 있는지 어떻게 확인할 수 있습니까?

각 학위의 광선을 Direction - (FieldOfView/2)에서 Direction + (FieldOfView/2)으로 캐스팅하는 것 외에도 (나는 지금 이것을하고 있으며 끔찍하다.)이 가시성 검사를 수행하는 가장 좋은 방법은 무엇입니까?

답변

9

뷰 방향 (벡터로 이해)과 사용자에서 시작하여 오브젝트에서 끝나는 벡터 사이의 각도를 계산합니다. FieldOfView/2 아래에 있으면 개체를 볼 수 있습니다.

그 각도는 다음과 같습니다

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

고마워, 정확히 내가 무엇을 찾고 있었는지. 나는 이것이 아마도 내가 이미 가지고있는 것에 기초하여 이것을 달성하는 가장 간단한 방법이라고 생각한다. – AshtonKJ

2

당신은 3D를하고있는과 절두체로 시야 범위를 정의 할 수있는 경우는 다음이 Frustrum Culling 기술에 비슷한 사용할 수 있습니다.

3

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

벡터가 2 차원 또는 3 차원이면 이는 같은 방식으로 작동합니다. (3D에서, 원뿔 대신 시야 절두체가있는 경우, 두 개의 요소로 각도를 분리해야합니다.) 두 벡터 사이의 각도를 찾아야합니다.

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

10

저는 비디오 게임 산업에서 일해 왔으며, 모든 프레임에서 arccos와 같은 trig 기능을 수행하는 것이 이상적이라고 말할 수 있습니다. 대신, 콘의 각도의 코사인을 미리 계산 : 포인트는 도트 콘의 제품과 가진 것을 비교하여 그 콘 내부에 떨어질 경우

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; 

trig 기능은 없으며 일부 곱셈, 나누기 및 더하기가 없습니다. 대부분의 게임 엔진에는 벡터에 대해 최적화 된 normalize() 함수가 있습니다.

이 때문에이 방정식의 작동합니다

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

당신은 벡터 (A는 ->은) 정상화 경우, 방정식은 단순화가 :

An · Bn = cos(Θ) 
+0

고마워요. 나는 프레임 당 삼각 함수의 양을 제한한다는 생각을 좋아한다. 나는 이것을 분명히 조사 할 것이다 (슬프게도, 한 번만 시험이 끝난다). – AshtonKJ

+0

나는이 대답을 사랑한다. 참고로,이 솔루션은 "절두체 검사"만 수행하며 벽 및 기타 객체에 의한 폐색은 처리하지 않습니다. –

1

좋은 답변 이미하지만 난 그냥 싶었 Wolfire 블로그에 대한 링크를 제공하며, 최근에 "시야 (Field of View)"방정식을 예로들 수있는 대수학 시리즈를 시작했습니다. Go read it, 잘 쓰여지고 쉽게.

관련 문제