Получаем матрицу поворота из одного вектора в другой

Выравнивание плоскости одно объекта по плоскости другого объекта – частая задача в 3D моделировании. Проще всего выровнять плоскости ориентируясь на векторы их нормалей – нужно повернуть исходную плоскость так, чтобы вектор ее нормали совпадал с вектором нормали плоскости по которой производится выравнивание. Следовательно, задачу поворота одной плоскости в другую можно свести к задаче поворота вектора нормали первой плоскости до вектора нормали второй плоскости.

Один из вариантов поворота вектора – использовать для этого матрицы трансформации.

Рассмотрим на примере нахождение матрицы для поворота одного вектора в другой.

Пусть у нас есть исходный объект – первая плоскость

Нормаль к ней мы можем получить найдя векторное произведение (Cross Product) для двух ее точек

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

Так же для второй плоскости, относительно которой нам нужно повернуть первую плоскость

Получим вектор нормали в глобальной системе координат.

Теперь имея два вектора, рассчитаем матрицу трансформации для поворота из первого вектора во второй.

Для этого мы можем использовать некоторые функции Blender Python API.

Определим функцию, которая будет принимать в параметрах два вектора, и возвращать матрицу поворота из одного вектора в другой.

Здесь мы сначала находим угол между двумя векторами.

Затем определим ось, вокруг которой нам нужно поворачивать первый вектор, чтобы он пришел во второй. Это очень просто сделать, если представить, что оба вектора образуют плоскость, в которой будет производиться вращение. Тогда осью вращения будет нормаль к этой плоскости. А ее, как мы уже делали раньше, мы можем получить через векторное произведение.

И наконец мы получаем нужную нам матрицу, вызывая функцию Matrix.Rotation.

Так же для получения матрицы поворота можно использовать оптимизированную функцию, на тригонометрии (от Inigo Quilez).

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

Для использования в Blender немного доработаем ее: так как в результате вычислений мы получаем матрицу 3×3, нам нужно преобразовать ее в стандартную матрицу трансформации Blender – 4×4. Также все вычисления в ней рассчитаны на левостороннюю ориентацию осей, а в Blender используется правостороння. Поэтому перед использованием полученную матрицу нужно транспонировать.

Вызывав первую или вторую функцию с полученными ранее векторами, мы получим нужную нам матрицу трансформации.

Теперь мы можем добавить полученную матрицу к финальной матрице трансформации нашей исходной плоскости.

И мы увидим, как наша исходная плоскость выравнивается по заданной нами второй плоскости.

0 0 голоса
Article Rating
Подписаться
Уведомить о
guest

0 Комментарий
Новые
Старые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии