2013-02-17 66 views
1

我正在渲染用戶手動旋轉,平移,縮放並最終在所需截面上繪製選擇矩形的空間點集合。當他們這樣做時,我使用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

當使用立體矩陣,屏幕空間矩形並沒有轉化爲「矩形棱鏡」。它翻譯成扭曲的平截頭體。 – 2013-02-17 22:32:37

回答

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