2013-02-17 3 views
1

필자는 사용자가 수동으로 회전하고, 이동하고, 확대/축소하고, 마지막으로 원하는 부분에 선택 사각형을 그린 공간에서 점의 모음을 렌더링하고 있습니다. 이 작업을 수행 할 때 GL_SELECT 렌더링 모드를 사용하여 선택된 영역에서 점을 찾기 전에 gluPickMatrix을 호출 한 다음 gluPerspective을 호출하여 투영 행렬을 구성합니다.현재 투영 행렬과 일치하는 glClipPlanes를 만드는 방법은 무엇입니까?

선택한 영역에만 포인트를 표시하고 싶습니다. 각각의 점을 테스트하기 위해서 부울은 isSelected이고, 올바른 것이 선택되기 때문에 선택이 제대로 작동한다는 것을 알고 있습니다. 그래도 실현하기에는 너무 많은 점이 있습니다. 그래서 glClipPlane을 사용하여 직각 프리즘 (편집 : 내 말은 절두체)에 해당하는 네 개의 평면을 사용자 정의 사각형으로 정의하고 싶습니다. 어떻게 투영 행렬을 설정 한 후에 glClipPlane으로 전달할 계수를 도출 할 수 있습니까?

는 지금은이 일을 해요,하지만 모든 점 클리핑 끝 : 나는 또한 정상화 및/또는 여전히 모든 포인트를 클리핑 끝날 것으로 보인다 평면 좌표를, 부정을 시도

// Set up projection matrix 
int viewport[4]; 
glGetIntegerv(GL_VIEWPORT, viewport); 
gluPickMatrix(x, y, w, h, viewport); 
gluPerspective(FOV_Y, ASPECT_RATIO, NEAR_PLANE, FAR_PLANE); 

// Derive clip planes - this doesn't work 
// Based on the paper "Fast Extraction of Viewing Frustum Planes from the World-View-Projection Matrix" 
// http://graphics.cs.ucf.edu/cap4720/fall2008/plane_extraction.pdf 
double t[4], r[4], b[4], l[4]; 
double m[16]; 
glGetDoublev(GL_PROJECTION_MATRIX, m); 
t[0] = m[3] - m[1]; t[1] = m[7] - m[5]; t[2] = m[11] - m[9]; t[3] = m[15] - m[13]; 
r[0] = m[3] - m[0]; r[1] = m[7] - m[4]; r[2] = m[11] - m[8]; r[3] = m[15] - m[12]; 
b[0] = m[3] + m[1]; b[1] = m[7] + m[5]; b[2] = m[11] + m[9]; b[3] = m[15] + m[13]; 
l[0] = m[3] + m[0]; l[1] = m[7] + m[4]; l[2] = m[11] + m[8]; l[3] = m[15] + m[12]; 

// ... Render points in GL_SELECT mode, then go back to GL_RENDER mode ... 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
// ... Apply user's pan/rotate/zoom choices here ... 
// Apply clip planes 
glEnable(GL_CLIP_PLANE0); 
glClipPlane(GL_CLIP_PLANE0, t); 
glEnable(GL_CLIP_PLANE1); 
glClipPlane(GL_CLIP_PLANE1, r); 
glEnable(GL_CLIP_PLANE2); 
glClipPlane(GL_CLIP_PLANE2, b); 
glEnable(GL_CLIP_PLANE3); 
glClipPlane(GL_CLIP_PLANE3, l); 

을 .

+1

관점 행렬을 사용하여 스크린 공간 사각형은 "직사각형 프리즘"로 번역하지 않습니다. 그것은 왜곡 된 절두체로 변환됩니다. –

답변

0

이 용지를 더 자세히 읽은 후에 문제가 발견되었습니다. 모델 뷰 행렬을 고려하지 않았습니다.

이 :

double m[16]; 
glGetDoublev(GL_PROJECTION_MATRIX, m); 
// ... derive t, r, b, and l from m 

이되어야한다

double vm[16], pm[16], m[16]; 
glGetDoublev(GL_MODELVIEW_MATRIX, vm); 
glGetDoublev(GL_PROJECTION_MATRIX, pm); 
matrix_mul(vm, pm, m); // m = vm * pm 
// ... derive t, r, b, and l from m