2015-02-03 3 views
0

Я ищу эффективный алгоритм для пересечения сетки (множества треугольников) и конуса (заданного по направлению, направлению и углу от этого направления). Точнее, я хочу найти точку пересечения, которая ближе всего к началу конуса. Пока что все, что я могу думать, это пересечь сетку с несколькими лучами от начала конуса и получить ближайшую точку. (Конечно, будет построена некоторая пространственная структура для сетки для отклонения ненужных пересечений)Алгоритм пересечения сетки и конуса

Также я нашел следующее краткое описание: «Пересечение конуса к сетке вычисляется на графическом процессоре, рисуя геометрию конуса с помощью сетки и считывая минимальное значение глубины, обозначающее точку пересечения ». К сожалению, это не очевидно для меня.

Так может ли кто-нибудь предложить что-то более эффективное, чем у меня, или объяснить более подробно, как это можно сделать на графическом процессоре с использованием OpenGL?

+0

[Это] (http://www.geometrictools.com/Documentation/IntersectionTriangleCone.pdf) могут быть полезны –

ответ

0

на GPU я хотел бы сделать это следующим образом:

  1. набором вида

    • для конусов происхождения
    • направления наружу
    • покрытия Bigest круга ломтика
    • для бесконечного конуса использовать максимальное значение Z вершин сетки в системе координат
  2. четкие буферы

  3. дро сетка

    • , но в пиксельный шейдер рисовать только пиксели пересекающихся конус
    • |fragment.xyz-screen_middle|=tan(cone_ang/2)*fragment.z
  4. прочитаны Z-буфер

    • чтения фрагментов и из правомочно (заполнение) выберите ближайший к конусами происхождения

[ноты]

  • если ваш GFX двигатель может работать также выходные значения из вашего фрагмента шейдер
  • , то вы можете пропустить пулю 4 и выполнить поиск минимального расстояния внутри пули 3 вместо рендеринга ...
  • , что значительно ускорит процесс (нужно просто единичный вектор хуг)
+0

я попробовал предложенный Algo с трафарета буфера вместо того, чтобы использовать фрагмент шейдеров и просто хочу прояснить одно. Правильно ли я не могу получить точную точку пересечения на сетке, потому что значения буферов Z всегда содержат некоторую ошибку? – Stas

+0

Точнее, когда я получил значение минимальной глубины и пиксель, я использую gluUnProject, чтобы получить реальную трехмерную точку и кажется, что она не находится на сетке. – Stas

+0

@stas 1. Вы правы, вы не можете получить точное местоположение пересечения с этим подходом, из-за конечного размера пикселя и точности буфера глубины. 2. Я не использую glu (кроме gluPerspective и даже ошибочно из-за его неточных тангенсов) поэтому я не знаю свойств и точности gluUnProject ... – Spektre

Смежные вопросы