2017-02-12 22 views
-1

У меня треугольник ABC в 3D пространстве и луч в плоскости треугольника, заданный начальной точкой E (всегда внутри или на краю треугольника) и вектор направления d.Быстрый алгоритм вычисления пересечений трехмерных лучей/треугольников для большого числа треугольников

Вершины A, B и C, а также E и d задаются в трехмерных координатах {x, y, z}.

Я ищу алгоритм для вычисления пересечения луча с краем треугольника П.

я могу сделать 3 луча испытания сегмента/линии пересечения для 3-х ребер треугольника, но так как я должен делать это для большого количества треугольников. Я ищу более эффективный и быстрый алгоритм.

  1. Каков наилучший способ для этого?
  2. Могут ли помочь барицентрические координаты?

enter image description here

+1

Как и в [math-stackexchange] [1], сложность вычисления этих трех тестов пересечения в O (1). Я сомневаюсь, что (2) изменение системы координат вам очень поможет. (1) Более интересно то, что вы подразумеваете под: «Я должен сделать это для большого количества треугольников». Возможно, вы можете добавить остальную проблему, с которой имеете дело, чтобы упростить предоставление рекомендаций. [1]: http://math.stackexchange.com/questions/2139740/fast-3d-algorithm-to-find-a-ray-triangle-edge-intersection/2140591#2140591 – gue

+0

Вы должны сгруппировать свои треугольники пространственно и проверять только группы рядом с вашим лучом ... в направлении камеры Z-порядок – Spektre

+0

Как я его читал, вы, по сути, в настройке 2d: все ваши точки, кажется, находятся в одной плоскости. Это правильно? – MvG

ответ

1

Не могли бы помочь Барицентрические координаты?

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

Насколько я могу судить, вся ваша установка по существу 2d, с точкой E и направлением d, содержащимся в плоскости, охватываемой A,B,C. Таким образом, у вас есть

E = aE*A + bE*B + cE*C with aE+bE+cE=1 
d = ad*A + bd*B + cd*C with ad+bd+cd=0 

Теперь у вас есть две подзадачи:

  1. Как получить барицентрические координаты эффективно
  2. Как найти точку пересечения

Давайте начнем с последнего , Вы просто добавляете к E столько кратных d, пока координата c не станет равной нулю.

P = E - (cE/cd)*d 

В зависимости от настроек, вы также может быть штраф с использованием однородных координат, в этом случае вы могли бы написать это как P = cd*E - cE*d.

Каким образом вы поворачиваете x,y,z Координаты d и E в барицентрический a,b,c? Ну, это всего лишь система линейных уравнений. Вы можете использовать обратную матрицу, образованную векторами A,B,C. Опять же, если вы имеете дело с однородными координатами, вы можете использовать вспомогательный элемент вместо обратного.

Вот однородный подход прописано:

aE = (By*Cz-Bz*Cy)*Ex + (Bz*Cx-Bx*Cz)*Ey + (Bx*Cy-By*Cx)*Ez 
bE = (Cy*Az-Cz*Ay)*Ex + (Cz*Ax-Cx*Az)*Ey + (Cx*Ay-Cy*Ax)*Ez 
cE = (Ay*Bz-Az*By)*Ex + (Az*Bx-Ax*Bz)*Ey + (Ax*By-Ay*Bx)*Ez 
ad = (By*Cz-Bz*Cy)*dx + (Bz*Cx-Bx*Cz)*dy + (Bx*Cy-By*Cx)*dz 
bd = (Cy*Az-Cz*Ay)*dx + (Cz*Ax-Cx*Az)*dy + (Cx*Ay-Cy*Ax)*dz 
cd = (Ay*Bz-Az*By)*dx + (Az*Bx-Ax*Bz)*dy + (Ax*By-Ay*Bx)*dz 
aP = cd*aE - cE*ad 
bP = cd*bE - cE*bd 
Px = aP/(aP+bP)*Ax + bP/(aP+bP)*Bx 
Py = aP/(aP+bP)*Ay + bP/(aP+bP)*By 
Pz = aP/(aP+bP)*Az + bP/(aP+bP)*Bz 

Первые три строки преобразуют E в барицентрических координаты, следующие три строки d. Затем мы вычисляем барицентрические координаты P и возвращаем их обратно в декартовы координаты. На этом этапе мы также дегомогенизируем их, т. Е. Делим на сумму барицентрических координат.

В целом, здесь имеется большое количество кода. Вы можете уменьшить количество операций, перемещая общие выражения в выделенные переменные, особенно если ваш компилятор не делает этого для вас. Одно из преимуществ заключается в том, что вам не нужны никакие дивизии, кроме последней дегомогенизации, т. Е. Деление на (a+b). Если вы вычислите 1/(a+b) один раз, вы можете сделать это, но только одно подразделение, что хорошо для производительности.

Однако реальная выгода от приведенного выше кода, скорее всего, позволяет сделать много приятных вещей с помощью барицентрических координат, которые вы не могли бы легко сделать с другими системами координат. Например, если вы хотите проверить, попадает ли луч в строку AB на сегмент линии или где-то вне треугольника, просто проверьте, aP*bP > 0.

+0

Возьмем пример треугольника: (Ax = 0, Ay = 0, Az = 0), (Bx = 5, By = 0, Bz = 0), (Cx = 0, Cy = 5, Cz = 0). Положим E в (Ex = 1, Ey = 2,5, Ez = 0) и d до (dx = 1, dy = 0, dz = 0). Тогда мы должны получить для пересечения с ребром BC: (Px = 2.5, Py = 2.5, Pz = 0). Барицентрические координаты для E (aE = 0,3, bE = 0,2, cE = 0,5) и для d (ad = 0,8, bd = 0,2, cd = 0). Для пересечения с ребром BC барицентрическая координата а должна быть равна нулю. Таким образом, мы получаем P = E - (aE/ad) * d = (Px = 0,625, Py = 2,5, Pz = 0), что неверно. Где моя ошибка? – user3384674

+0

@ user3384674: Картинка в вашем вопросе пересекалась с ребром AB, и мой код всегда пересекается с AB. Чтобы пересечься с BC, вы измените некоторые метки. Но я понимаю, что сделал ошибку, превратив d и E в барицентрические координаты. В вашем примере Az = Bz = Cz = 0, поэтому матрица ABC имеет нулевую строку и не обратную.На самом деле нужна еще одна строка, обеспечивающая aE + bE + cE = 1 и ad + bd + cd = 0, что делает эти системы переопределенными, поскольку вещи работают только, если E находится в плоскости, натянутой на A, B, C и d, параллельно это плоскость. – MvG

1
  1. Время сложность O (1)
  2. Это потенциально может помочь. Если мы говорим о 3D, и все ваши точки лежат на одной плоскости. В декартовых координатах вам нужно решить три линейные системы , чтобы найти пересечение с тремя линиями, а затем определить, находятся ли пересечения на краю или нет. Или вам нужно найти барицентрические координаты двух точек на линии. Точка A (a1, a2, a3) = E и B (b1, b2, b3) = E + d. Уравнение линии равно enter image description here Теперь вам еще нужно решить три линейные системы (где одно из mu = 0 и сумма остальных = 1). Но это будет 2x2 системы, которые легче решить. И затем проверьте знаки найденных корней, чтобы определить, находилась ли найденная точка на краю или нет.
1

Временно игнорируйте ось, для которой d имеет наименьший компонент, и обрабатывайте полученную 2D-проблему, как мы видим на вашей иллюстрации.

Вы можете предкомпрометировать уравнение линии поддержки луча в виде ax + на + c = 0 (при условии, что z игнорировалось). Подключите координаты трех вершин в этом выражении, и знаки скажут вам, на какой стороне линии находятся вершины.

Два пересечения с линией происходят по краям, имеющим разные знаки в конечных точках.

Затем, чтобы определить, что является правым краем, знак угла между лучом и третьим egde будет (если я прав);

Когда вы знаете, какой край, вы можете вычислить параметр параметрического уравнения стороны, который вы можете вывести из ранее вычисленных знаков. Например, вдоль края AB, t = Sb/(Sb - Sa). Также вычислите 1 - t;

Наконец, используйте значение t для интерполяции между конечными точками, на этот раз в 3D.

Расчетная стоимость

  • evalutation из трех знаков Sa, Sb, Sc, принимая 6 + 6 и х;

  • выбор двух кандидатов на край, взятие двух или трех сравнений;

  • выбор одного кандидата, взятие двумерного кросс-продукта, 3 + и 2 x и сравнение;

  • расчет интерполяционного параметра, 2 +, 1 /;

  • окончательная трехмерная интерполяция, 3 +, 6 x.

Будет непросто сделать короче.

0

Смотрите статью

Fast, minimum storage ray-triangle intersection, Томас Мёллер и Бен тромбона, в Журнал Graphics Tools, 2 (1): 21-28, 1997.

См. Также this page.

Авторы говорят:

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

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

  • Нет связанных вопросов^_^