2016-06-02 5 views
0

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

Directed Tangent From Normal Viz

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

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

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

ответ

1

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

enter image description here

enter image description here

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

enter image description here

Для того, чтобы восстановить отраженный скорость, делают

enter image description here

Где e является коэффициент восстановления (предполагается, что частицы).

+0

Хорошо, похоже, теперь это изображение. Итак, первый шаг в других словах: d = -dot (v, n), правильно? После этого я не мог полностью следовать ... но у, похоже, моя желаемая выровненная касательная. Последний бит не применяется для моего случая, поскольку я не использую моделирование на основе частиц, а использую модель мелкой воды. Чтобы получить «твердость» столкновения, используется упрощенная формула, которая выглядит следующим образом: length (-n * u); Я все равно ценю :) – Seneral

+0

Ой, подождите, получилось;) Не нужно успеть получить все-таки :) Большое спасибо, с нетерпением жду, если он работает! – Seneral

+0

будьте осторожны, чтобы нормализовать 'n', в противном случае ваши расстояния будут неправильными; предположите, что вы предварительно вычислили эти первые, чтобы не делать invsqrt все время –