Звучит так, как вы хотите UNPIVOT
Пример из книг онлайн:
--Create the table and insert values as portrayed in the previous example.
CREATE TABLE pvt (VendorID int, Emp1 int, Emp2 int,
Emp3 int, Emp4 int, Emp5 int);
GO
INSERT INTO pvt VALUES (1,4,3,5,4,4);
INSERT INTO pvt VALUES (2,4,1,5,5,5);
INSERT INTO pvt VALUES (3,4,3,5,4,4);
INSERT INTO pvt VALUES (4,4,2,5,5,4);
INSERT INTO pvt VALUES (5,5,1,5,5,5);
GO
--Unpivot the table.
SELECT VendorID, Employee, Orders
FROM
(SELECT VendorID, Emp1, Emp2, Emp3, Emp4, Emp5
FROM pvt) p
UNPIVOT
(Orders FOR Employee IN
(Emp1, Emp2, Emp3, Emp4, Emp5)
)AS unpvt;
GO
Возвраты:
VendorID Employee Orders ---------- ---------- ------ 1 Emp1 4 1 Emp2 3 1 Emp3 5 1 Emp4 4 1 Emp5 4 2 Emp1 4 2 Emp2 1 2 Emp3 5 2 Emp4 5 2 Emp5 5
см. также: Unpivot SQL thingie и тег univot
Необходимо использовать gluUnProject
:
Во-первых, вычислите "непроекцию" к почти плоскость:
GLdouble modelMatrix[16];
GLdouble projMatrix[16];
GLint viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport);
glGetDoublev(GL_MODELVIEW_MATRIX, modelMatrix);
glGetDoublev(GL_PROJECTION_MATRIX, projMatrix);
GLdouble x, y, z;
gluUnProject(sx, viewport[1] + viewport[3] - sy, 0, modelMatrix, projMatrix, viewport, &x, &y, &z);
и затем к далекой плоскости:
// replace the above gluUnProject call with
gluUnProject(sx, viewport[1] + viewport[3] - sy, 1, modelMatrix, projMatrix, viewport, &x, &y, &z);
Теперь у Вас есть строка в мировых координатах, которая прослеживает все возможные точки, на которые Вы, возможно, нажимали. Таким образом, теперь просто необходимо интерполировать: предположите предоставление z-координаты:
GLfloat nearv[3], farv[3]; // already computed as above
if(nearv[2] == farv[2]) // this means we have no solutions
return;
GLfloat t = (nearv[2] - z) / (nearv[2] - farv[2]);
// so here are the desired (x, y) coordinates
GLfloat x = nearv[0] + (farv[0] - nearv[0]) * t,
y = nearv[1] + (farv[1] - nearv[1]) * t;
Этому лучше всего отвечает наиболее авторитетный источник, веб-сайт OpenGL.
Это на самом деле зависит от матрицы проекции, не матрицы образцового представления. http://www.toymaker.info/Games/html/picking.html должен выручить Вас - это D3D-центрально, но теория является тем же.
Если Вы надеетесь делать основанный на мыши выбор, тем не менее, я предлагаю использовать режим рендеринга выбора.
Править: Обратите внимание, матрица образцового представления действительно играет роль, но так как Ваш - идентификационные данные, это - непроблема.
libqglviewer имеет хорошую платформу выбора, если это - то, что Вы ищете