Как создать веревку?

8

Я хотел бы воссоздать эту игру , но я понятия не имею, как создать веревку или как она влияет на мяч.

введите описание изображения здесь

По существу, есть веревка, «прикрепленная» на одном конце к указателю мыши, а на другом конце прикрепленная к массивному мячу. Когда пользователь перемещает свою мышь, веревка и мяч следуют, как будто раскачивая цепочку или что-то подобное в реальной жизни.

Как мне создать веревку, как в приведенной выше игре?

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

Спасибо!

theonlygusti
источник

Ответы:

3

В вашем примере веревка, вероятно, является простым физическим соединением, которое ограничивает расстояние от шара до курсора мыши. Эти соединения обычно называют «канатное соединение» или «пружинное соединение».

Кажется, что рябь в струне не основана на реальном физическом моделировании. Скорее всего, это кривая Безье, где контрольные точки еще больше отталкиваются от центральной оси, когда мяч находится ближе к положению мыши.

Хотя принятый ответ объясняет, как создать реалистичную веревку в физическом движке, иногда предпочтительнее иметь более простое решение (как описано выше). Более простое решение (с одним соединением) значительно повышает стабильность симуляции. Многочисленные соединительные соединения, которые прикладывают большие усилия, склонны к дрожанию и могут привести к разрыву и беспорядочно движущимся цепям соединений.

Конечно, вы также можете объединить оба метода, создав свою веревку как таковую:

  1. Цепочка узлов, связанных суставами
  2. Канатно-пружинное соединение от первого до последнего узла цепи, которое гарантирует, что вы не сможете тянуть цепь дальше, чем на заданное максимальное расстояние (одна из главных причин, по которой эти цепи становятся нестабильными).

Это приведет к созданию более реалистично движущейся цепи (которая может даже реагировать на другие объекты в физическом движке), но потребует большей вычислительной мощности, чем просто пружинное соединение с «поддельным» поведением цепи.

bummzack
источник
Спасибо что подметил это! Как можно было бы манипулировать контрольными точками Безье, потому что пример выглядит очень реалистичным, а не просто как безье, где он выпрямлен и «раздавлен».
theonlygusti
Я не думаю, что это выглядит очень реалистично. Это просто добавляет рябь к веревке, она не изгибается или что-то еще ... для меня это выглядит так, будто она просто выпрямляется и сдавливается.
Bummzack
Но я заметил, что кривые могут быть под разными углами друг к другу; как это достигается?
theonlygusti
Добавить несколько случайных смещений, чтобы каждый раз выглядеть иначе?
bummzack
Ладно да; кажется, что именно так это и было сделано в игре, но на самом деле (и это покажется странным) язык программирования, который я использую, облегчает создание физического движка, на который указывал ответ Kyranstar, чем рисование кривых Безье.
theonlygusti
10

По сути, вам нужно создать физический движок. Веревка концептуально представляет собой связку «узлов», связанных вместе с пружинами.

По сути, каждый тик, каждый узел будет оказывать силу на узлы выше и ниже его пропорционально их расстоянию друг от друга (или как далеко от их удобной длины растяжения). Если вы хотите прикрепить мяч, просто подключите его с помощью пружинного соединения к нижнему узлу веревки.

Это отличный учебник для создания физического движка, но на самом деле он не затрагивает ограничений или стыков.

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

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

Редактировать:

Чтобы сделать красиво выглядящую веревку, «струнное соединение» на самом деле выглядит намного лучше и ближе к вашему примеру. Струнное соединение - это в основном пружина, но оно исправляет объекты только тогда, когда они находятся слишком далеко друг от друга (а не когда они находятся слишком близко).

Это моя веревка с ниткой: введите описание изображения здесь

Kyranstar
источник
«Когда вы рисуете веревку, просто не рисуйте узлы». - заставил меня смеяться :) Спасибо, что приняли во внимание мою крайнюю глупость. Будет ли мяч просто еще одним узлом? Из большей массы? (У каждого узла есть масса?)
theonlygusti
Да, они делают! Как правило, лучший способ интуитивно рассчитать массы - это придать каждому шару плотность и просто умножить ее на площадь. Вы всегда можете настроить это, чтобы получить лучшие результаты в вашей реальной игре.
Kyranstar
Обычно я реализую это на объектно-ориентированном языке, с классом для узла, с плотностью свойств, массой и т. Д., Но я вынужден использовать язык, где ООП почти невозможен; как бы вы создали узлы и т. д. в соответствии с этими ограничениями?
theonlygusti
Если честно, у меня очень мало опыта работы с языками не -OOP. Вы можете взглянуть на Chipmunk2D , физический движок, написанный на C. Очевидно, вам понадобится какой-то способ сохранить эти данные в связном блоке.
Kyranstar
Хорошо, спасибо; последний вопрос, является ли серый узел узлом в смысле других? Что особенного в этом, чтобы заставить его оставаться на месте?
theonlygusti