C++ 如何创建与当前投影矩阵匹配的glClipPlanes?

C++ 如何创建与当前投影矩阵匹配的glClipPlanes?,c++,opengl,clipping,clip,projection-matrix,C++,Opengl,Clipping,Clip,Projection Matrix,我正在渲染空间中的一组点,用户手动旋转、平移、缩放这些点,最后在所需部分上绘制一个选择矩形。当他们这样做时,我会调用gluPickMatrix,然后调用glupperspective来构建投影矩阵,然后再使用glu SELECT渲染模式来查找所选区域中的点 我只想显示选定区域中的点。对于测试,每个点都有一个布尔值isSelected,我知道选择是有效的,因为选择了正确的点。但是,有太多的点,这是不可行的,所以我想使用glClipPlane构造四个平面,对应于用户选择矩形定义的矩形棱柱(编辑:我指

我正在渲染空间中的一组点,用户手动旋转、平移、缩放这些点,最后在所需部分上绘制一个选择矩形。当他们这样做时,我会调用
gluPickMatrix
,然后调用
glupperspective
来构建投影矩阵,然后再使用
glu SELECT
渲染模式来查找所选区域中的点

我只想显示选定区域中的点。对于测试,每个点都有一个布尔值
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);

我还试着对平面坐标进行标准化和/或求反,但最终似乎仍然会剪切所有的点。

仔细阅读了那篇文章后,我发现了问题。我没有考虑模型视图矩阵

这:

应该是这样的:

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

使用透视矩阵时,屏幕空间矩形不会转换为“矩形棱镜”。它转化为一个扭曲的平截头体。
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