Сплайны Catmull-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) и получение тангенса на основе числа Пифагора, учитывая координаты положения, которые дают эти входные значения?
3 ответа
Посмотрите на уравнение 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 контрольные точки со связанными касательными векторами. Затем можно добавить дополнительные сегменты сплайна при условии, что касательные векторы в общих контрольных точках равны, что сохраняет непрерывность C1.
В конкретной форме Catmull-Rom касательный вектор в промежуточных точках определяется расположением соседних контрольных точек. Таким образом, для создания непрерывного сплайна 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 влияют на форму интерполирующего сегмента между ними.
Этот pdf может помочь вам лучше понять. да, для расчета касательной они включают предыдущую и следующую точки на основе функции натяжения.
Он тоже имеет происхождение.
https://www.cs.cmu.edu/~fp/courses/graphics/asst5/catmullRom.pdf