Катушки-Rom сплайны - как они работают?
На этом сайте, который, как представляется, имеет самую подробную информацию о сплайнах catmull-rom: http://www.mvps.org/directx/articles/catmull/, он упоминает о необходимости четырех пунктов: создать сплайн. Однако он не упоминает, как точки p0 и p3 влияют на значения между p1 и p2.
Еще один вопрос: как бы вы создали непрерывные сплайны? Было бы так же легко, как определить, что точки p1, p2 должны быть непрерывными с p4, p5, сделав p4 = p2 (то есть предположим, что p0, p1, p2, p3, p4, p5, p6... pN).
Более общий вопрос заключается в том, как можно вычислить тангенсы на сплайнах ротации катмула? Должно ли это включать в себя взятие двух точек на сплайне (скажем, 0,01, 0,011) и получение касательной на основе пифагоров с учетом координат положения, которые вводят эти значения?
Ответы
Ответ 1
Взгляните на уравнение 2 - он описывает, как контрольные точки влияют на линию. Вы можете увидеть точки P0
и P3
перейти в уравнение для построения точек вдоль кривой от P1
до P2
. Вы также увидите, что уравнение дает P1
, когда t == 0
и P2
, когда t == 1
.
Это примерное уравнение может быть обобщено. Если у вас есть точки R0
, R1
,... RN
, тогда вы можете построить точки между RK
и RK + 1
, используя уравнение 2 с P0 = RK - 1
, P1 = RK
, P2 = RK + 1
и P3 = RK + 2
.
Вы не можете отстроить от R0
до R1
или от RN - 1
до RN
, если вы не добавите дополнительные контрольные точки для входа R - 1
и RN + 1
. Общая идея заключается в том, что вы можете выбрать любые точки, которые хотите добавить в голову и хвост последовательности, чтобы дать себе все параметры для вычисления сплайна.
Вы можете объединить два сплайна, сбросив одну из контрольных точек между ними. Скажем, вы имеете R0
, R1
,..., RN
и S0
, S1
,... SM
их можно объединить в R0
, R1
,..., RN - 1
, S1
, S2
,... SM
.
Чтобы вычислить касательную в любой точке, просто возьмем производную от уравнения 2.
Ответ 2
Статья в Википедии идет немного глубже. Общий вид сплайна принимает в качестве входных 2 контрольных точек с соответствующими касательными векторами. Затем могут быть добавлены дополнительные сегменты сплайнов при условии, что касательные векторы в общих контрольных точках равны, что сохраняет непрерывность C1.
В конкретной форме Катмулла-Рома касательный вектор в промежуточных точках определяется местоположениями соседних контрольных точек. Таким образом, для создания непрерывного сплайна C1 через несколько точек достаточно обеспечить набор контрольных точек и касательных векторов в первой и последней контрольной точке. Я считаю, что стандартное поведение заключается в использовании P1-P0 для касательного вектора в P0 и PN-PN-1 при PN.
Согласно статье Википедии, для вычисления тангенса в контрольной точке Pn вы используете это уравнение:
T(n) = (P(n - 1) + P(n + 1)) / 2
Это также отвечает на ваш первый вопрос. Для набора из 4 контрольных точек P1, P2, P3, P4, интерполирующие значения между P2 и P3 требуют, чтобы информация составляла все 4 контрольные точки. P2 и P3 сами определяют конечные точки, через которые должен проходить интерполяционный сегмент. P1 и P3 определяют касательный вектор, который интерполирующий сегмент будет иметь в точке P2. P4 и P2 определяют касательный вектор, который сегмент будет иметь в точке P3. Касательные векторы в контрольных точках P2 и P3 влияют на форму интерполирующего сегмента между ними.