Запрос точек эпсилон-близко к плоскости разреза в облаке точек с помощью графического процессора - PullRequest
4 голосов
/ 17 сентября 2008

Я пытаюсь решить текущую проблему, используя возможности графического процессора: «с учетом облака точек P и ориентированной плоскости, описываемой точкой и нормалью (Pp, Np), возвращаются точки в облаке, которые лежат на расстоянии, равном или меньше, чем EPSILON от самолета ".

Разговаривая с моим коллегой, я подошел к следующему решению:

1) подготовить буфер вершин точек с прикрепленной текстурной координатой так, чтобы каждая точка имела разные координаты вершины 2) установить статус проекции на ортогональный 3) поверните сетку так, чтобы нормаль плоскости была выровнена с осью -z, и сместите ее так, чтобы x, y, z = 0 соответствовали Pp 4) установите плоскость z-отсечения так, чтобы z: [- EPSILON; + EPSILON] 5) отрендерить до текстуры 6) получить текстуру с графической карты 7) прочитайте текстуру с графической карты и посмотрите, какие точки были отрисованы (с точки зрения их индексов), какие точки находятся в пределах желаемого диапазона расстояний.

Теперь проблемы следующие: q1) Нужно ли открывать оконную раму, чтобы можно было выполнить такую ​​операцию? Я работаю в MATLAB и звоню MEX-C ++. По своему опыту я знаю, что как только вы открываете новую раму, весь костюм рушится с треском! q2) какой примитив дает GLPoint текстурную координату? q3) Мне не очень понятно, как будет реализован рендеринг в текстуру? любая ссылка, учебник было бы здорово ... q4) Как бы вы получили эту текстуру с карты? Опять же, любая ссылка, учебник было бы здорово ...

У меня плотный график, поэтому было бы неплохо, если бы вы указали мне названия методов, о которых я должен узнать, а не документ спецификации GLSL и API OpenGL, как это сделал кто-то. Это слишком расплывчатые ответы на мой вопрос.

Большое спасибо за любой комментарий.

p.s. Также обратите внимание, что я бы предпочел не использовать любой ресурс, такой как CUDA, если это возможно, таким образом, получая то, что использует как можно больше элементов OpenGL, не требуя от меня написания нового шейдера.

Примечание: крестик размещен на http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=245911#Post245911

Ответы [ 4 ]

1 голос
/ 17 сентября 2008

Все просто: Пусть n - нормаль плоскости, а x - точка.

n_u = n/norm(n)         //this is a normal vector of unit length
d   = scalarprod(n,x)   //this is the distance of the plane to the origin

for each point p_i
    d_i = abs(scalarprod(p_i,n) - d)  //this is the distance of the point to the plane

Очевидно, что «scalarprod» означает «скалярное произведение», а «abs» означает «абсолютное значение». Если вам интересно, почему просто прочитайте статью о скалярных продуктах в Википедии.

0 голосов
/ 22 сентября 2008

Мне кажется, что вы должны иметь возможность реализовать нечто похожее на метод капрала Сенси в вершинной программе, а не в цикле for, верно? Может быть, использовать C API для программирования на GPU, например CUDA ?

0 голосов
/ 18 сентября 2008

У меня есть один вопрос к Андреа Тальясаччи, почему?

Только если вы смотрите на тысячи точек и, возможно, на сотни плоскостей, было бы полезно использовать описанный метод. Как указано для точечного произведения точки и плоскости, как обрисовано в общих чертах мой капрал Touchy.

Кроме того, из-за конечной природы пикселей, вы часто найдете две или более точек, которые будут проецироваться на один и тот же пиксель в текстуре.

Если вы все еще хотите это сделать, я мог бы создать пример программы перенастройки на C ++, но как это могло бы помочь с MATLAB, я не знаю, так как незнаком с ней.

0 голосов
/ 17 сентября 2008

Хорошо, сначала как небольшой отказ от ответственности: я ничего не знаю о 3D программировании.

Теперь моя чисто математическая идея:

Дана плоскость по нормали N (единичной длины) и расстоянию L плоскости до центра (точка [0/0/0]). Расстояние от точки X до плоскости определяется скалярным произведением N и X минус L расстояния до центра. Следовательно, вам нужно только проверить, если

| н. х - л | <= epsilon </p>

. будучи скалярным продуктом и | | абсолютное значение

Конечно, сначала нужно пересечь плоскость с нормалью, чтобы получить расстояние L.

Может быть, это поможет.

...