Интерполяция дуальными комплексными числами

Jun 30, 2023 01:51

Попробуем применить эти числа для интерполяции на плоскости.

На картинке ниже есть два твёрдых тела, которые характеризуются положением и поворотом. Они соединяются несколькими "гофрами", которые мы и хотим сколько-нибудь красиво изобразить, не прибегая к численному моделированию системы пружинок и стерженьков, а просто изобразив некий плавный переход от одного положения и поворота к другому положению и повороту.

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


Кружком посередине картинки мы обозначили начало "абсолютной" системы координат. Увы, те дуальные комплексные числа (коммутирующие), что мы сейчас рассматриваем, к нему весьма чувствительны, ведь именно вокруг него производятся повороты.

Левый объект мы характеризуем направлением (1;0) и смещением (-1;0). Точки, к которым "пристёгиваются" гофры, имеют координаты (0;0) (центральная гофра), (0;1) (верхняя) и (0; -1) (нижняя), выраженные в системе координат, связанных с этим объектом. При этом, верхняя и центральная гофра выходят под прямым углом, а нижняя - под углом в 45°.

Правый объект поначалу имеет направление тоже (1;0) и смещение (1;0), но эти параметры мы будем произвольно менять. Точки, к которым "пристёгиваются" гофры, имеют те же координаты, что для первого объекта, также в системе координат, связанной с этим объектом.

Гофра состоит из 10 секций, соединённых между собой. Для каждой секции мы в конечном итоге должны задать своё дуальное комплексное число, которое укажет положение центра этой секции и её поворот. Далее, для нечётных секций мы задаём ширину d=0,2, а для чётных - ширину d=0,14. То есть, координаты верхнего и нижнего края каждой секции: (0;d/2) и (0;-d/2) в системе координат, связанной с этой секцией.

Запишем всё это в дуальных комплексных числах. Во-первых, введём числа

L = 1 - ε - оно характеризует положение и поворот левого (Left) объекта,
R0 = 1 + ε - характеризует начальное положение и поворот правого (Right) объекта. Далее мы будем вращать этот объект вокруг начала координат, умножая R0 на exp(iφ).

Дальше, у нас есть набор дуальных комплексных чисел Bn и En (n=1..3), от слов Begin и End, характеризующих положение и поворот первой и последней секции каждой гофры относительно объекта, к которому они прикреплены:

B1 = E1 = 1 - центральная гофра.

B2 = E2 = 1 + iε - верхняя гофра.

Чтобы найти положение и поворот этих секций уже в нашей системе координат, необходимо домножить эти числа на L либо R соответственно. И как бы мы не двигали объекты "по сцене", эти секции гофры будут сидеть на них как вкопанные, и вращаться должным образом.

С нижней гофрой, повёрнутой на 45° по часовой стрелке, дела обстоят похуже. "Интуитивно" хотелось бы присвоить такое значение:



т.е указать, что она повёрнута на 45° и смещена на единицу "вниз". Увы, здесь это так не работает. Давайте проверим, что получится, причём придадим левому объекту хоть одну степень свободы, пусть он сможет сдвигаться влево-вправо:

L = 1 - xε - изначально x=1, но можно его варьировать.

Тогда положение и поворот начала нижней гофры будет описываться дуальным комплексным числом:



Мало того, что секция оказывается вовсе не там, где мы ожидали, не в точке (-1;-1), так она и не будет "жёстко" держаться на левом объекте, когда тот вдруг "поедет": если его сместить влево, увеличив x, наша гофра вместо того, чтобы тоже сдвинуться строго влево, ещё и сместится вверх! Выходит, что использовать такие числа для пересчёта относительных движений в абсолютные можно с большими ограничениями - переместиться по объекту можно, а вот поворачиваться на нём нельзя!

Так что придётся нам пока убрать поворот на 45°:

B3 = E3 = 1 - iε

и добавить в код "костыль", который после вычисления B3L либо E3R ещё "довернёт" комплексную (основную) часть числа на эти 45°, не трогая дуальную...

Далее вводим дуальные комплексные числа Snk, от слова Section, где n=1..3 - номер гофры, а k = 0..9 - номер секции в гофре. Они будут выражать положение и поворот каждой секции в абсолютной системе координат.

С грехом пополам, мы определили расположение первой и последней секций:

Sn0 = BnL,
Sn9 = EnR, для n=1..2,





(Main() - взять "основную" часть дуального комплесного числа, т.е c+is, Dual() - взять "дуальную" часть, т.е (x+iy)ε. Увы, только так получается повёрнутую гофру "жёстко прикрепить" к объекту...)

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



Это мы посчитать уже умеем. Назовём такие частные Fn, n=1..3, т.е Fraction, "дробь". Мы можем записать:



Вся идея нашей интерполяции в том, чтобы теперь записать:



То есть, когда k=0, возведение в нулевую степень даст единицу, и мы получим Sn0. Когда k=9, возведение в первую степень даст нам уже ранее посчитанное значение Sn9. Зато посередине должно получиться что-то среднее, учитывающее как поворот, так и смещение!

Чтобы извлечь корень N-й степени, проще всего воспользоваться логарифмом и экспонентой:



Благо, и ту, и другую операцию мы в прошлый раз уже изучили... Экспоненту можно взять всего одну, с 1/9 от логарифма, и потом на неё последовательно домножать предыдущий результат, тем самым получив все значения.

И наконец, когда положение и поворот каждой секции каждой гофры нам будет известен, нам останется домножить это дуальное комплексное число на
1+(d/2)iε для нахождения верхней точки секции гофры, и
1-(d/2)iε для нахождения нижней точки.

И в финале мы просто берём дуальную часть, (x+iy)ε это и будут координаты точек, которые нам нужно отобразить на экране!

Результаты мы видим на гифке в начале поста.

В целом, весьма неплохо: так оно более "реалистично", чем линейная интерполяция. Собственно, одно из применений дуальных кватернионов в компьютерной графике - правильно "обшить кожей" скелет модельки, так, чтобы в местах сгиба получить реалистичные повороты, не прибегая к моделированию всех мягких тканей. Например, человек может развернуть ладонь на 180 градусов. При линейной интерполяции рука превратилась бы в "песочные часы" (каждая точка в начале соединяется с соответствующей точкой в конце), а вот интерполяция дуальными кватернионами ведёт себя куда лучше:



Это мы, впрочем, вперёд забегаем.

А главный недостаток "наших" (коммутирующих) дуальных комплексных чисел - они оказались "привязаны" к началу координат, и от его положения результат работы меняется! Где-то это можно обратить в достоинство, в некий "подстроечный параметр" - придумываем, где у нашего сустава "центр", и добиваемся чуть разного поведения, ведь разные предметы по-разному сгибаются! Одно дело гармошка, другое - толстенный армированный шланг, который не может сжаться и будет изгибаться вбок! Но недостаток даже не в этом, а в невозможности обойтись одним лишь формализмом дуальных комплексных чисел, приходится добавлять "костыли", искусственно поворачивая "комплексную" часть и не трогая "дуальную", иначе объекты, которые должны быть жёстко закреплены на других, вдруг "отлетают" в непонятном направлении...

В следующей части мы рассмотрим другой тип этих чисел, некоммутирующие дуальные комплексные числа, которые в этом смысле получше...

Poll Дуальные комплексные числа (коммутирующие)

кватернионы-это просто (том 1), странные девайсы, математика, работа

Previous post Next post
Up