Отображение из 2D проекции обратно в 3D облако точек - PullRequest
5 голосов
/ 05 апреля 2011

У меня есть 3D-модель, состоящая из точечных вершин (XYZ) и в конечном итоге треугольных граней. Используя OpenGL или проекцию камеры-матрицы-проекции, я могу проецировать 3D-модель на 2D-плоскость, то есть окно просмотра или изображение с разрешением m * n.

Вопрос в том, как определить соответствие между пикселем из плана 2D-проекции и его соответствующей вершиной (или гранью) из исходной 3D-модели.

А именно,
Каковы ближайшие вершины в 3D-модели для данного пикселя из 2D-проекции?
Это звучит как выбор в openGL или проблема трассировки лучей. Есть ли какое-нибудь простое решение?

Идея трассировки лучей заключается в нахождении первой вершины / грани, пересекаемой с лучом с точки зрения. Может кто-нибудь показать мне учебник или примеры? Я хотел бы найти алгоритм, независимый от использования OpenGL.

Ответы [ 3 ]

2 голосов
/ 05 апреля 2011

Тестирование попаданий в OpenGL обычно выполняется без трассировки лучей.Вместо этого при визуализации каждого примитива плоскость на выходе используется для хранения уникального идентификатора примитива.В таком случае проверка попадания так же проста, как чтение плоскости идентификатора в месте расположения курсора.

1 голос
/ 06 апреля 2011

В дополнение к ответу Бена Фойгта:

  1. Если вы делаете отдельный проход по выбираемым объектам, то вы можете установить в окне просмотра только один пиксель, который вы будете читать.

  2. Вы также можете кодировать ID треугольника с помощью геометрического шейдера (gl_PrimitiveID).

1 голос
/ 05 апреля 2011

Моей (возможно, наивной) мыслью было бы создать массив вершин и затем отсортировать их по их расстоянию (или квадрату расстояния по скорости) после проецирования на точку вашего экрана.Первый пункт в списке будет самым близким.Это будет O (n) для n вершин, но не хуже.

Edit : лучше для скорости и памяти: просто проходитьвсе вершины и следите за вершиной, проекция которой ближе всего (квадрат расстояния) к пикселю вашего окна просмотра.Это предполагает, что вы можете выполнить проекцию самостоятельно, не полагаясь на OpenGL.

Например, в псевдокоде:

function findPointFromViewPortXY( pointOnViewport )
  closestPoint = false
  bestDistance = false
  for (each point in points)
    projectedXY     = projectOntoViewport(point)
    distanceSquared = distanceBetween(projectedXY, pointOnViewport)
    if bestDistance==false or distanceSquared<bestDistance
      closestPoint = point
      bestDistance = distanceSquared
  return closestPoint
...