OpenGL: проектирование щелчка мышью на геометрию

Звучит так, как вы хотите 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

8
задан Mark Harrison 22 September 2008 в 05:52
поделиться

4 ответа

Необходимо использовать 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;
11
ответ дан 5 December 2019 в 10:45
поделиться

Этому лучше всего отвечает наиболее авторитетный источник, веб-сайт OpenGL.

3
ответ дан 5 December 2019 в 10:45
поделиться

Это на самом деле зависит от матрицы проекции, не матрицы образцового представления. http://www.toymaker.info/Games/html/picking.html должен выручить Вас - это D3D-центрально, но теория является тем же.

Если Вы надеетесь делать основанный на мыши выбор, тем не менее, я предлагаю использовать режим рендеринга выбора.

Править: Обратите внимание, матрица образцового представления действительно играет роль, но так как Ваш - идентификационные данные, это - непроблема.

2
ответ дан 5 December 2019 в 10:45
поделиться

libqglviewer имеет хорошую платформу выбора, если это - то, что Вы ищете

0
ответ дан 5 December 2019 в 10:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: