Верёвка как в “Cut the Rope”

    Почитав интервью создателей знаменитого бестселлера “Cut the Rope”, в котором утверждается, что на создание веревки ими было потрачено больше всего времени, я не поверил, что написать «алгоритм движения тяжелой нити» действительно так сложно, и для этого надо чуть ли не самим писать физический движок. Погуглив, готового ответа я не нашел, и решил попробовать сделать самостоятельно нечто подобное на cocos2D + Box2D.
    За основу были взяты правила:
    1. Цепь делать лучше с помощью прямоугольных тел, соединенных Revolute Joint’ами;
    2. Чем тяжелее объекты составляющие цепь – тем она стабильнее;
    3. Количество итераций при шаге – чем больше, тем лучше (мне хватило 3-х);
    4. Очень помогает, если каждый кусочек цепи, помимо Revolute Joint’а соединить Distance Joint’ом.


    В результате у меня получилась цепь объектов в физическом мире, результат можно посмотреть на следующем рисунке и видео:
    image


    Таким образом, изготовить тяжелую нить в Box2D оказалось не сложно.
    Осталось описать графическую часть. В этом, конечно же, должны были помочь кривые Безье 2 порядка, алгоритм которых уже реализован в DrawingPrimitives в cocos2D.
    Для поиска точек отрисовки кривых можно использовать места соединения Revolute Joint’ов, что я и сделал. Однако результат проделанной работы меня сильно огорчил, я получил жуткую пикселирезацию, что хорошо видно в следующих графических материалах:
    image


    Использовать антиалиасинг в cocos2D без поддержки OpenGL ES 2.0, к сожалению нельзя (использовать оный, с поддержкой, не хотелось, по объективным причинам), поэтому для устранения неприятного эффекта был использован метод.
    Полученный результат меня полностью удовлетворил, более того после долгого изучения разницы между моими веревками и в “Cut the Rope”, я такой не заметил. Вот что получилось в итоге:
    image


    Таким образом, на разработку «алгоритма движения тяжелой нити» у меня ушло не более 14 часов.
    Код отрисовки антиалиасинг линии прилагается.
    ccDrawingPrimitives.zip

    Использовал тут и тут.
    Поделиться публикацией

    Похожие публикации

    Комментарии 31

      –2
      Как я понимаю вы не хотели использовать OGL ES 2.0 из-за отсутствия оного на старых моделях. Уверены ли вы, что это того стоит? Мне просто интересны статистические данные: сколько запуском с каких версий iOS, моделей телефонов.

      Как я понимаю таргетиться на 1G и 2G iPhone нет смысла, лучше добавить плюшек который доступны только в 3/4/5G. Я просто заметил среди людей откружающих меня, что те у кого старая модель (до 4G) мало покупают приложений, а те кто покупают плюются из-за производительности некоторых.

      У меня есть множество приложений которые на первых айфонах запускаются, но совершенно не юзабельны, в то же время я знаю, что некоторый фичи пришлось реализовать через костыли так как они появились только 4.x SDK. Разработчик затратил больше времени на реализацию фич под старые модели телефнов больше времени чем я потратил играя в его игру, так как она нереально тормозила на старых моделях.
        +2
        Если никаких других “фич” из 2.0 в приложении не используется, применение таких веревок считаю хорошим решением, отчего не сохранить совместимость с бόльшим количеством устройств.
        А вот если Вы решили разрабатывать 3D шутер, то тогда конечно без 2.0 наверно не обойтись, какие цели, такие и решения.
          +1
          Не используется потому, что вы даже не думали о них. Одним OGL | ES 2.0 новые модели не ограничиваются. Кстати вы сравнивали энергопотребление при использовании этого метода и «родного»?
            0
            Энергопотребление не сравнивал.
        +2
        А как насчет производительности? Самое простое решение — не всегда самое оптимальное, вполне может быть что создатели Cut the Rope потратили кучу времени как раз на оптимальный алгоритм этой самой веревки.
          +1
          Я не утверждаю, что моё решение лучше, или самое оптимальное, но такие веревки не тормозят.
        • НЛО прилетело и опубликовало эту надпись здесь
            0
            В интервью же говорится, что нет. Они использовали свой движок.
            «Rope physics are not as easy to get right as it might look. We've decided to go with our own engine instead of using an existing technology such as Box2D, partly because we wanted the rope looking as smooth as possible, and party because it looked like an interesting task.»
              +2
              Напрашивается аналогия:
              — Написать операционную систему трудно и мы потратили много времени.
              — А я взял за основу Linux, немного подредактировал то, что было нужно мне и не могу понять, с чем у них были проблемы.

              ИМХО.
                0
                Написать свой физический движок очень сложно. Но по их интервью складывается впечатление, что веревки вообще сложно реализовать, по фразе:
                «Rope physics are not as easy to get right as it might look."

                тоже ИМХО.
                  +2
                  А разрезать в динамике пробовали? Там действительно не так все однозначно, как кажется на первый взгляд.
                    0
                    Разрезать не проблема: была одна веревка, мы ее порвали по соединению.
                      –1
                      А анимация? Одно дело просто рарзывать джоин, и совсем другое эмулировать разрывание в следствии применения определенной силы.
                        0
                        Никакой анимации там нет (специально даже запустил пересмотрел).

                        Для того, чтобы резать веревку применять силу в том понятии, в каком она используется в физических движках вообще-то не нужно, да и это не было было бы проблемой, все необходимые данные предоставит физический движок.
            • НЛО прилетело и опубликовало эту надпись здесь
                +1
                Если ставилась задача «Как в Cut the rope», то этого и не надо, там веревка не взаимодействует с другими предметами
              +1
              Вы молодец, я только поправлю слово «антиализинг» на «антиалиасинг», если Вы не против.
                +2
                Верёвки и прочую soft-body (если постараться то и rigid-body) физику можно писать используя интегрирование Верле.
                Вся теория завязана на том, что скорость — разница между текущим и предыдущим её положением.
                Применительно к задаче реализация сводится к следующему (псевдокод):
                Есть набор точек (joints) связанных пружинками (links).
                Задача каждой точки — двигаться согласно скорости.

                joint.update
                tempPos = pos // запоминаем текущую позицию во временную переменную
                pos += pos - lastPos // прибавляем скорость
                pos += gravity // и вектор гравитации
                lastPos = tempPos


                Задача каждой пружинки — поддерживать нужное расстояние между её joint'ами.

                link.update
                delta = joint[1].pos - joint[0].pos // вектор в сторону второй точки
                length = sqrt(delta.x^2 + delta.y^2) // текущее расстояние между точками
                delta /= length // нормализация вектора
                delta *= length - LINK_LENGTH // LINK_LENGTH - расстояние которое следует поддерживать
                delta *= FORCE // FORCE - коэффициент упругости пружинки (0..1)
                // расталкиваем точки в противоположных направлениях
                joint[0].pos += delta * 0.5
                joint[1].pos -= delta * 0.5


                Сама организация цикла обновления сводится к обновлению всех joint'ов, и нескольким иттерациям обновления всех link'ов (для стабилизации).
                Таким незамысловатым способом можно создавать верёвки, рэгдоллы (ограничить углы между link'ами), волосы и даже некий аналог твёрдотельной физики. Реализация простая и никаких физических движков не требует.
                Пример работы такой физики.
                  0
                  При всём уважении в примере, не веревки, а цепи, собраны из участков по 2 звена, да еще и с утончением на месте стыка.
                    0
                    Вопрос Art'a, повышение детализации и смена текстуры на алгоритме никак не отразится.
                      0
                      Вы правы, на физике процесса это не отразится. Но физике в хабратопике уделено 1/3, а графике 2/3. Собрать же “цепь в физическом мире” зная физический движок, это вообще не задача.

                      Использование интегрирования Верле, это уже шаг к собственному физическому движку.
                      Если применять в приложениях одновременно Box2D или Chipmunk и Ваш алгоритм, то теряется очень много универсальности. Хорошо, когда все объекты живут в одном мире.

                      Тогда лучше правда написать свой физический движок, все объекты “поместить” в него.
                  +1
                  Всегда хотел узнать, как это делается.
                  Спасибо за статью!
                    –2
                    под cut the Rope
                      +1
                      В новой версии Box2D уже создали специальный джоинт для создания веревок.
                        0
                        http://box2d.org/documentation/
                        Действительно в 2.2 добавилось, и они устранили эффект растягивания веревки, при больших нагрузках (что раньше надо было учитывать, и не перегружать цепочку).
                        Спасибо за информацию.
                        0
                        зачем использовать физический движок ради пары достаточно тупых уравнений?
                          0
                          Это вопрос из разряда: “Зачем использовать вектор, если можно написать свой список, а если иметь готовый свой список…”.

                          Представьте себе, что вам нужны не только веревки, у вас вообще много объектов в физическом мире “живет”, зачем для верёвок выпендриваться и применять “тупые уравнения”?
                            –1
                            ну тут вверху обсуждали «А может быть кат зэ роуп делали оптимизированную версию».
                            Я так и представляю, как создатели cut the rope вместо того, чтобы делать рабочее приложение, таки сидят и скручивают разные движки, потому что у них очень сложная физика в приложении, безумно сложная 3д-графика и ещё много всего.
                          0
                          Кто-то занимается программированием/решением различных задач ради интереса и любопытства, так как нам это нравится.

                          Не все это могут понять.
                          0
                          Привет из года 2016.
                          Ссылка на метод устранения пикселизации верёвки устарела (статья удалена или заблокирована). А интересует именно он. Что за метод?

                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                          Самое читаемое