Введение в цепные линии
Из множества изученных и описанных математических объектов один очень дорог многим разработчикам игр. И только некоторые из них знают его истинное название: цепная линия.
Цепная линия — это фигура, к которой естественным образом сводится подвешенная за края верёвка или цепь. Неслучайно само название catenary происходит от латинского catenaria, что и означает «цепь».
В современных играх появляется всё больше заброшенных предприятий и разрушенных окружений. И во многих из них встречается довольно много свисающих проводов. Например, их можно увидеть в комнате GLaDOS из «Portal» или в «Half-Life: Alyx».
Так как цепные линии окружают нас повсюду, неудивительно, что мы с детства привыкли к их форме. А ещё это означает, что мы очень легко замечаем, когда что-то свисает неправильно. Подобно сложности движения кожи или физики ткани, неправильное свисание цепных линий само по себе создаёт эффект «зловещей долины».
Тем не менее, в очень многих играх цепные линии реализуют неправильно! Однако причина этого неудивительна. Хоть их так легко создавать в реальной жизни, их математическое описание — настоящий кошмар. За исключением нескольких особых случаев, «простых» уравнений для генерации цепной линии не существует; по крайней мере, не в том виде, который нужен для украшения уровня.
Один из стандартных способов создания физически обоснованных цепных линий без затрат — использование твёрдых тел (rigid bodies) и шарниров (hinge joints) при создании цепей и верёвок. Это имеет и дополнительное преимущество — они реагируют на действия игрока, однако ценой затратных вычислений. Большинство свисающих проводов и кабелей является частью фона, и использовать физику для их создания было бы слишком затратно. Следовательно, очень важно иметь возможность создавать статические цепные линии без вычислений в реальном времени.
Кроме того, отрисовка цепных линий имеет ещё одно преимущество. Допустим, что нам нужно создать для игры настоящий, управляемый физикой свисающий провод. Как располагать сегменты провода при его создании в игре? Многие разработчики бы просто разместили их вдоль линии, позволив физическому движку самому выбрать равновесное состояние. Отрисовка цепных линий позволяет инициализировать физически верные провода и кабели уже в их состоянии равновесия, без необходимости ждать, пока они сами остановятся в нужном положении.
Стоит заметить, что в Unity нет встроенных инструментов для кабелей и цепей, а в Unreal Engine существует Cable Component, решающий как раз эту задачу при помощи техники Verlet Integration (которая станет темой моих будущих статей). А на случай, если вам нравятся шейдеры, Росс Бёрдсэлл недавно создал гениальное решение для симуляции спиральных шнуров в Unreal Engine 4.
Формальное определение
Если мы хотим получить физически корректные цепные линии, то, наверно, лучше начать с начала. Простейшая цепная линия задаётся однозначно определённым уравнением с использованием — гиперболического косинуса:
Уравнение цепной линии имеет параметр , меняющий общую «ширину» кривой. Однако все кривые цепных линий похожи, потому что все они являются версиями друг друга с разным масштабом. Ниже показано изменение кривой как функции от (в оригинале статьи анимация интерактивна):
Их естественной областью использования является изучение гиперболической геометрии. Также они часто оказываются решением множества дифференциальных уравнений. На самом деле, и играют важную роль в решении следующего дифференциального уравнения:
а именно:
Также они сильно связаны с :
Вывод уравнения начинается с допущения о том, что для каждого небольшого сегмента цепи гравитационные силы находятся в идеальном балансе с силой натяжения от соседних сегментов. Это приводит к созданию системы уравнений, при решении которой мы получаем (1):
Этот вывод также даёт нам некое понимание того, что же на самом деле означает параметр :
где:
- : плотность материала цепи;
- : ускорение силы тяжести;
- : площадь поперечного сечения цепи;
- : горизонтальная компонента силы натяжения, которой подвержен каждый сегмент цепи. Считается константой, потому что цепная линия рассматривается как фигура, которую принимает цепь, когда вес равномерно распределён вдоль кривой.
Доктор Том Кроуфорд рассказывал об этом в недавнем видео Numberphile, объясняя, как внутренняя структура купола собора Святого Павла в Лондоне поддерживается перевёрнутой трёхмерной цепной линией.
Цепные линии обладают и ещё одним любопытным свойством. Они являются формой, позволяющей квадратам перемещаться без колебаний их центров (см. анимацию ниже).
Параметризация цепной линии
Если мы хотим научиться рисовать физически точные цепные линии, то (1) может быть не лучшим способом для этого. Причина проста: кроме изменения у нас практически нет никакого контроля над тем, где и как их можно разместить.
Более «настраиваемым» уравнением является (2), позволяющее перемещать кривую горизонтально и вертикально при помощи двух дополнительных параметров и :
Однако в идеале нам бы подошло уравнение цепной линии, проходящей через две точки закрепления и :
Параметр позволяет перемещать вершину цепной линии; когда , вершина находится на оси Y. Мы можем сдвигать цепную линию так, чтобы вершина находилась ровно между и :
На самом деле, это идеально, если и , и находятся на одном уровне (т.е. когда ). Но если это не так, то получившаяся цепная линия будет физически неверной. Кроме того, это почти не позволяет нам управлять степенью провисания цепной линии. Поэтому нам нужно подойти к задаче по-другому: нам нужен более «художественный» способ управления линией.
Решение задачи цепной линии
В этом разделе мы покажем уравнения физически правильной цепной линии, представляющей верёвку, закреплённую в двух точках пространства, и , с заданной длиной . Математический вывод уравнения довольно запутан, поэтому чтобы не мучить вас, я просто покажу результат решения.
Для начала зададим два вспомогательных параметра, и , указывающих горизонтальное и вертикальное расстояние между двумя точками.
При выводе уравнения мы предполагаем, что ; если это не так, то можно просто поменять местами две точки. Также нам нужно задать условие, что больше расстояния между двумя точками. Это кажется справедливым, ведь длина цепной линии должна быть не меньше расстояния между точек закрепления.
Мы получаем следующие значения для и :
где — гиперболический котангенс:
На показанной ниже анимации (в оригинале статьи она интерактивна) перемещается вторая точка закрепления () и меняется длина цепи (), при этом изменяется форма линии.
Находим a
В предыдущем разделе нам не удалось представить уравнение первого параметра цепной линии: . Так получилось, потому что в этом случае нет лаконичного решения, способного вычислить его точное значение. На самом деле, при любых попытках вывода мы придём к следующему трансцендентному уравнению:
Иными словами, мы не можем преобразовать это уравнение в более простой вид так, чтобы не находилась и в правой части уравнения. Иногда трансцендентные уравнения можно переписать в таком виде, но часто это требует бесконечного количества операций (например, использования рядов или интеграла).
Когда такое происходит, то это значит, что нам нужен другой способ вычисления значения . Если не получается решить задачу аналитически, то приходится использовать численные решения. То есть нам нужно использовать алгоритм для поиска приблизительного решения. Об этом мы поговорим в следующей статье.
Sergey_Kovalenko
Хотел задать автору вопрос, но потом увидел, что статья переводная. Может кто-нибудь знает, как выглядят малые колебания подвешенных цепей и есть ли для них простое описание?
MichaelBorisov
Думаю, надо копать куда-то в сторону волнового уравнения. Есть ещё гравитационные волны (не те, что от чёрных дыр, а те, что на поверхности воды) и изгибные гравитационные волны — возможно, последнее именно то, что вам нужно.
Подумал немного. Можно рассмотреть волновое уравнение для вашей цепи с закрепленными концами в невесомости:
Utt = c^2*Uxx
где U(x,t) — вертикальная координата каждой точки цепи, зависящая от горизонтальной координаты x и времени t. c — скорость распространения в ней упругих колебаний (т.е. звука). Utt — вторая частная производная по времени, Uxx — вторая частная производная по координате.
Закрепление цепи даёт граничные условия U(0,t)=0, U(1,t)=0. Задавшись начальным отклонением U(x,0)=f(x), можно решить это уравнение аналитически («методом разделения переменных») и получить решение в виде бесконечного ряда с синусами, коэффициенты при которых соответствуют разложению в ряд Фурье функции f(x).
Для учёта гравитации необходимо ввести в это уравнение константный член:
Utt = c^2*Uxx + g
где g — константа. Уравнение становится неоднородным, но так как неоднородность очень простая, то аналитические решения тоже существуют. Для получения решения следует решить сначала однородное уравнение, приведённое первым по тексту, а далее провести ещё некоторые манипуляции. Рекомендую книгу «Араманович И.Г, Левин В.И. Уравнения математической физики», там всё подробно и понятно рассматривается, и приведены готовые решения для простых случаев, подобного рассматриваемому.
Для пущего реализма нужно будет потом добавить в уравнение ещё и диссипативный (диффузионный) член, чтобы колебания затухали.
UPD: на странице 75, параграф 4, у Арамановича рассматривается пример — нахождение колебаний струны, на которую действует сила тяжести — как раз ваша задача. Приводится общее решение в виде ряда. Можно брать и вычислять.
Sergey_Kovalenko
Там вроде сила натяжения вдоль цепи меняется: возле концов больше, в нижней точке провисания — меньше. Соответственно скорость волны тоже должна меняться. Предположим, производная натяжения по длине мала, тогда (наверное) решение можно представить как пакет бегущих волн. Интересно, как будут меняются компоненты этого пакета, какие там могут быть еще явления.
MichaelBorisov
Да, вы правы, вопрос надо исследовать.
Похоже, колебания висящей цепи нельзя адекватно описать неоднородным волновым уравнением, которое применимо к струне. Струна всегда натянута, и любое отклонение её формы от прямой есть следствие растяжения. Цепь же можно считать нерастяжимой, а отклонения от прямой обусловлены тем, что цепь длиннее, чем расстояние между точками подвеса.
Сейчас попробую найти или вывести диф. уравнение в частных производных для описания колебаний цепи.
MichaelBorisov
Задача о колебаниях идеальной нерастяжимой цепи не имеет физического смысла. Для колебаний физическая система должна «проскакивать» положение равновесия и возвращаться к нему с обеих сторон. Но в случае нерастяжимой цепи положение равновесия проскочить нельзя. Если в момент принятия цепью формы цепной линии у неё ещё осталась кинетическая энергия — то это приведёт к бесконечным напряжениям в цепи, т.е. никакой материал этого не выдержит.
Вспоминается задача по статике №136 из «Сборника задач по общему курсу физики» Стрелкова, Сивухина и др.: "Анализируя результат задачи 135, можно прийти к следующему неожиданному выводу: любой канат можно разорвать сколь угодно малой силой. Действительно, представьте канат натянутым и закрепленным на концах; тогда достаточно приложить к середине каната перпендикулярную к нему небольшую силу, чтобы создать сколь угодно большое натяжение каната. Почему же все-таки канат нельзя разорвать сколь угодно малой силой?" И решение заключается в том, что канат растягивается.
Цепь обязана растягиваться хотя бы немного. Но тогда она, в окрестностях положения равновесия, превращается в струну. Осталось только поставить и решить задачу колебаний струны, которая длиннее, чем расстояние между точками закрепления, и имеет форму цепной линии в положении равновесия.
Sergey_Kovalenko
Наверное, вам стоит пересмотреть свои выводы. Дело в том, что есть естественный контрпример к вашим рассуждениям. Возьмем конструкцию из N последовательно соединенных нерастяжимых массивных одинаковых шарниров и подвесим ее с провисанием за крайние точки. Любой угол изгиба такой конструкции можно на немного изменить и это никак не приведет к ее разрушению. Если особым образом устремить N к бесконечности (уменьшая при этом массу и длину шарниров обратно пропорционально N), то конструкцию как по статике так и по динамике колебаний в пределе перейдет в идеальную цепную линию.
MichaelBorisov
Похоже, вы правы. Кстати, я вот ещё нашел интересную информацию в книге «Кошляков Н. С. и др. Уравнения в частных производных математической физики». В главе XIV рассматривается и решается задача на малые колебания нити, подвешенной за один конец. Физическое рассмотрение задачи приводит к самому обычному волновому уравнению, которое далее решается известными методами.
Так что есть шанс, что колебания нити, подвешенной в двух концах, тоже описываются «обычным» волновым уравнением.