Расчет касательной, указывающей в определенном двухмерном направлении

Мне нужно вычислить касательную, указывающую в том же (x, y) -направлении, что и 2D-вектор от заданной нормали. Вот визуализация:

Направленная касательная из обычной визуализации

Красная плоскость с голубым лучом - это нормальная поверхность, зеленая «стрелка» представляет двумерное направление, а синяя - касательная к нормали с (x, y) -направлением зеленой стрелки. Таким образом, при просмотре сверху (в пространстве объекта, а не на поверхности) для проецирования на 2D зеленый и синий цвет имеют одинаковое направление.

Итак, если это было слишком абстрактно, вот контекст: я делаю моделирование эрозии на графическом процессоре, и для расчета растворения мне нужен трехмерный вектор скорости воды для проверки на столкновение с нормалью ландшафта. Но моделирование ведется в 2D, поэтому у меня есть только 2D вектор скорости. В статье, на которую я ссылаюсь, только отмечается, что программа должна вычислять этот трехмерный вектор по касательной к поверхности местности и двумерному вектору скорости.

Учитывая эту информацию, нормаль и двумерный вектор, какова математика для вычисления упомянутой совпадающей касательной?


person Seneral    schedule 02.06.2016    source источник


Ответы (1)


Чтобы вычислить касательную к поверхности, сначала спроецируйте вектор на нормаль.

введите описание изображения здесь

введите описание изображения здесь

Затем просто добавьте, чтобы получить ненормализованную касательную.

введите описание изображения здесь

Чтобы восстановить отраженную скорость, выполните

введите описание изображения здесь

Где e - коэффициент восстановления (с учетом частиц).

person Community    schedule 02.06.2016
comment
Хорошо, теперь кажется, что вы поняли изображение выше. Итак, первый шаг другими «словами»: d = -dot (v, n), верно? После этого я не мог точно уследить ... но u, похоже, является моей желаемой выровненной касательной. Последний бит неприменим в моем случае, поскольку я не использую моделирование на основе частиц, а использую модель мелководья. Чтобы получить «жесткость» столкновения, используется упрощенная формула, которая выглядит так: length (-n * u); Я все равно ценю это :) - person Seneral; 02.06.2016
comment
Ой, подождите, понял;) В конце концов, не так уж и сложно получить вас :) Большое спасибо, с нетерпением жду, чтобы увидеть, работает ли это! - person Seneral; 02.06.2016
comment
будьте осторожны, чтобы нормализовать n, иначе ваши расстояния будут неправильными; Предлагаем вам предварительно вычислить их, чтобы избежать постоянного выполнения invsqrt - person ; 02.06.2016
comment
Это не проблема, и n, и t должны быть нормализованы, они используются только для определения «направления» столкновения (я предполагаю), или, скорее, того, насколько оно «прямое». Затем это умножается на скорость воды. Полученный скаляр в конце концов используется только для определения растворения осадка, а не для реакции на столкновение. Я полагаю, что физически неаккуратно, но работает :) Спасибо! - person Seneral; 03.06.2016
comment
нет проблем; из любопытства вы имитируете жидкость, например, Уравнение Лапласа или полное Навье-Стокса? или просто какое-то плотное газовое облако VdW? - person ; 03.06.2016
comment
С относительно простыми уравнениями Эйлера; Я в основном беру ссылку из этого документа и некоторые другие, которые реализуют модель мелкой воды с использованием виртуальных труб для транспортировки воды в 2D. К сожалению, у меня еще не было возможности более глубоко изучить эту область: / - person Seneral; 03.06.2016
comment
@ В общем, я вижу, что это похоже на метод сетки вокселей (рис. 4) - person ; 03.06.2016