2011-01-31 2 views
1

나는 OpenGL 2d 게임에서 절두체 컬링을 구현하려고합니다. 이 시점에서 내 게임의 기하학적 인 객체의 유일한 종류는 직사각형이므로이 방법이 매우 쉽다고 생각했지만 예기치 않은 결과가 나타납니다. 시야각이 45도이고 대칭 평면과 원거리 평면이 각각 0.01과 50 인 대칭 투시 투영을 설정했습니다. 시선 벡터는 항상 z 축과 평행이며 카메라는 x 및 y 축을 따라 이동할 수 있습니다.Frustum 컬링 직사각형 문제

내 생각은 내가 추려내려고하는 직사각형의 z 좌표에서 카메라에 현재 표시되어있는 세계 공간의 직사각형 영역을 가져 오는 것이었다. 카메라 절두체의 중심을보고 있기 때문에, 다음과 같이 I이 보이는 직사각형 영역의 가장자리까지의 거리를 계산한다

GLfloat maxDistance = givenRectangle.z * tanf(0.5 * (fovAngle * M_PI/180)); 

그때는 추가로 상기 x 및 y 좌표에서이 거리를 빼지 카메라는 최대 및 최소 가시 x 및 y를 얻은 다음 주어진 사각형을 테스트하여이 값들 사이에 있는지 확인합니다.

제 질문은 여기에 올바른 길을 가고 있는지, 그리고 위의 수식이 z = 5에 명확하게 표시되어야하는 객체를 가지고있을 때 어리석은 작은 값 (뭔가 * 10^-37)을 반환하는 이유는 무엇입니까? 카메라가 (0,0,0)입니까?

+0

3D가 아닙니까? –

+0

그래 기술적으로 나는 3d의 관점에서 2 차원 직사각형을 가지고 있습니다. 그래서 뭐든지 부르고 싶습니다. 내가 원근 투영을 원한다는 이유는 제가 확대 할 수 있기를 원한다는 것입니다. topdown 카메라 오리 엔테이션 – Jacob

+0

그 부분을 제발 설명해 주시겠습니까 : 그럼 내가 추가하고 x와 y는 최대 및 최소 표시 x 및 y를 얻으려면 카메라의 x 및 y 좌표에서이 거리를 빼고 다음 볼 수있는 사각형을 테스트 이 값 사이에있는 경우 – jocelyn

답변

3

위로부터 문제를 해결하기 위해 수식을 확인했습니다. 올바르게 이해했는지 확인하기 위해 스케치를 참조하십시오.

enter image description here

우리가 알고 Z와 X에 대한 해결하려는 것을 감안할 때, 내가 먼저 쓴 :

황갈색 (A) = X/Z

재배치, 내가 얻을 :

X = Z 황갈색 (A)

이후 Z = 5, A = 22.5도 ...

X = 5 * 황갈색 (22.5도)

X = 2.07106781

당신이 바로 수학을 가지고 있지만 코드 틀린 것처럼 그래서, 그것은 보인다 - 어쩌면 선탠 기능을 기대는 것이 아니라 학위 라디안 또는 fovAngle이 (가) 설정되지 않았습니다. 난 당신이 디버그하고 각 값을 직접 확인해야 할 것 같아요.


다시 수행하고 절두체 내부에 거짓말을하지 않습니다 알아내는의 넓은 문제로 돌아가서, 당신은 당신이 더 우아하게 같은 질문에 대답하기 위해 다른 테스트를 사용할 수있는 사실을 발견했습니다. 많은 그래픽 코더는 "면접"테스트를 사용합니다. 뷰잉 프러스 텀은 6 개의 평면 세트 (뷰포트의 측면, 가까운 클리핑 평면 및 먼 클리핑 평면)에 묶여있는 공간입니다.

비행기의 한 점과 평면의 법선이 주어지면, 비행기의 방정식을 쉽게 계산할 수 있습니다 (makes it trivial to test whether a given point is "inside" (in the direction of the normal) a given plane). 6 개의 평면을 모두 반복하면 관측 볼륨 안팎에서 주어진 포인트를 빠르게 조정할 수 있습니다.

이 테스트에 대한 정말 청초한 점은 다시 쉽게 사용할 수 있다는 것입니다. 예를 들어 직사각형과 같은 테스트를 원한다면 간단한 볼록 다각형을 평면 세트로 기술 할 수 있습니다. "내부자 또는 외부"테스트를 다시 사용하십시오. 매우 일반적입니다.

+0

답변 해 주셔서 감사합니다. 이것이 실제로 의미하는 바입니다. 나는 또한 문제가 무엇인지 알아 냈다. fovAngle에 대한 이중 포인터를 사용하여 특정 코드에서 제대로 작동하지 않는 것이었다 ... 절두체 컬링의 방법에 대한 한 가지 질문 :이 일반적인 접근 방식이 의심 스럽다. 내가 설명한 방법보다 간단한 직사각형의 경우 느립니다? – Jacob

+0

당신이 버그를 발견했기 때문에 다행 스럽다. 예, 비행기 방법은 더 느립니다. 그것은 어떤 단계에서 개발 노력에 당신을 구할 수 있지만, 과도한 상황이있을 수 있습니다. –

+0

스피드에 대해 말하자면, 2D 게임을 어떻게 든 쓰고 있으며 실제로 퍼포먼스를 위해 모든 것을 나가기를 원한다면, 퍼스펙티브를 사용하지 마라. 대신 직교 투영을 사용하면 "화면 내부 사각형"테스트가 0