Как создать glClipPlanes, соответствующие текущей матрице проекции?

Я рендерил набор точек в пространстве, которые пользователь вручную поворачивал, панорамировал, увеличивал и, наконец, нарисовал прямоугольник выделения над нужным участком. Когда они делают это, я звоню gluPickMatrix а потом gluPerspective построить матрицу проекции, прежде чем использовать GL_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);

Я также попытался нормализовать и / или отменить координаты плоскости, что, кажется, все равно приводит к обрезанию всех точек.

1

Решение

После более внимательного прочтения этой статьи я обнаружил проблему. Я не принимал во внимание матрицу вида модели.

Это:

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
0

Другие решения

Других решений пока нет …