Материал из Скретч Вики
![]() |
Статья не завершена! Если ты хочешь помочь — отредактируй её. |
![]() |
Этот раздел или статья не предназначена для новичка! Она содержит сложную информацию. |
Физика верёвок — физика действительной верёвки, или способ, напоминающий её. Этой физики довольно сложно добиться в Скретче, но она возможна.
Первый способ
Данный способ генерирует хорошие результаты, которые можно посмотреть здесь.
Добавление верёвочных соединений
Первый шаг создания верёвочной физики — создание верёвочных точек, который можно выполнить с помощью этого кода:
когда щёлкнут по зелёному флагу удалить все из [x v] // Удаляем все верёвочные соединения удалить все из [y v] // Удаляем все верёвочные соединения передать (настройка v) и ждать до конца // Настроим все переменные повторять всегда задать [старая длина v] значение (длина) задать [ID v] значение (0) повторить (длина) раз //создаём клоны верёвочных точек изменить [ID v] на (1) создать клон (самого себя v) добавить [] к [x v] добавить [] к [y v] end повторять пока не <не <(длина) = (старая длина)>> верёвка :: custom // Отрисуем верёвку end end
Рендеринг верёвки
После создания верёвочных соединений их необходимо отрисовать. Скрипт на данный момент может ничего не сделать.
определить верёвка стереть всё // Убираем все предыдущие отрисовки верёвки задать [счётчик v] значение (1) //сбросим счётчик перейти в x: (элемент (счётчик) в [x v]) y: (y мыши) опустить перо изменить [счётчик v] на (1) повторить ((длина) - (1)) раз //Итерация по списку и рисование верёвки. перейти в x: (элемент (счётчик) в [x v]) y: (элемент (счётчик) в [y v]) изменить [счётчик v] на (1) end поднять перо
Добавление физики к верёвке
Необходимо добавить физику к каждому соединению верёвки, чтобы всё выглядело реалистично.
когда я начинаю как клон //Физика для каждого канатного соединения повторять всегда если <(ID) = (1)> , то перейти на (указатель мыши v) иначе изменить x на (((элемент ((ID) - (1)) в [x v]) - (положение x)) * (напряжение)) изменить y на (((элемент ((ID) - (1)) в [y v]) * (плотность)) + (((ID) - (1)) * ((жёсткость) * (гравитация)))) заменить элемент (ID) в [x v] на (положение x) заменить элемент (ID) в [y v] на (положение y) поднять перо если <не <(длина) = (старая длина)>> , то удалить клон
Имплементация кода
Теперь всё, кроме использования кода, сделано, осталось только задать переменные и использовать переменные цвета и толщины для внешнего вида верёвки.
когда я получу [настройка v] стереть всё // очистим все прошлые отрисовки задать [жёсткость v] значение (1) // зададим переменные задать [длина v] значение (10) задать [толщина v] значение (5) задать [плотность v] значение (0.4) задать [напряжение v] значение (0.4) задать [цвет v] значение (62) задать [гравитация v] значение (-1) когда щёлкнут по зелёному флагу повторять всегда // Зададим размер пера и цвет верёвки установить размер пера (толщина) установить для пера цвет (цвет)
Второй способ
Верёвки можно представить как серию пружин, каждая точка которых стремится попасть друг в друга. Это не позволяет раскачиваться, но позволяет просто представить канаты. Этот метод будет представлять это.
![]() |
Идеи, изложенные в этом разделе, можно также использовать для создания пружины вместо верёвки. |
Переменные и списки
Для начала, для каждой точки верёвки будут нужны две переменные скорости:
(скорость x)
(скорость y)
А также переменные для её массы и некоторых свойств:
(масса)
(демпфирование)
(жёсткость)
(гравитация)
Жёсткость делает верёвку короче и жестче. Демпфирование заставляет силы перемещаться медленнее.
Для вычислительных целей необходимо ещё несколько переменных:
(сила x)
(сила y)
(настоящая сила x)
(настоящая сила y)
(кол-во созданных соединений)
(id соединения)
А также список для хранения пружинных соединений:
(верёвочные соединения::list)
Некоторые сведения
В пружине конец пружины всегда стремится попасть в верхнюю часть пружины. Однако он не может этого сделать из-за силы тяжести или потому, что наталкивается на другой участок пружины:
Здесь верх пружины будет находиться в точке (x1, y1), а низ — в точке (x2, y2). Поскольку нижняя часть пытается добраться до верхней, сила, которую испытывает нижняя часть пружины, становится равной:
Сила вдоль оси X = x2 - x1
Сила вдоль оси Y = y2 - y1
Поскольку объект не может автоматически двигаться туда, куда он хочет, возникает некоторая жёсткость:
Сила X = (x2-x1) * жёсткость
Сила Y = (y2-y1) * жёсткость
Поскольку энергия должна быть распределена по массе объекта, это необходимо учесть:
Сила X = ((x2-x1) * жёсткость) / масса
Сила Y = ((y2-y1) * жёсткость) / масса
Затем это значение добавляется к скорости нижней пружины. Последний фактор, который необходимо добавить, это трение, что делается следующим образом:
Скорость X = (Скорость X + Сила X) * демпфирование
Скорость Y = (Скорость Y + Сила Y) * демпфирование
Программирование
Будет создана двухшарнирная верёвка, соединённая с мышью. Для начала необходима база для клонирования:
когда щёлкнут по зелёному флагу спрятаться повторить (2) раз создать клон [самого себя v] end когда я начинаю как клон . . . // Здесь будет обработка физики.
Затем нужно отрендерить верёвки, а также им нужно добавить себя в соединения верёвки, чтобы другие клоны могли посмотреть на их положение:
когда щёлкнут по зелёному флагу задать [кол-во созданных соединений v] значение (1) спрятаться повторить (2) раз создать клон [самого себя v] end повторить (6) раз добавить (0) к [верёвочные соединения v] end повторять всегда заменить элемент [1 v] в [верёвочные соединения v] на (x мыши) // Таким образом верёвка будет смотреть в направлении мыши заменить элемент ((0) + (2)) в [верёвочные соединения v] на (y мыши) стереть всё // Стирает экран прошлых зарисовок верёвок end когда я начинаю как клон задать [id соединения v] значение (кол-во созданных соединений) изменить [кол-во верёвочных соединений v] на (2) //для того, чтобы мы могли знать, каким из верёвочных соединений является клон повторять всегда отрендерить :: custom заменить элемент ((id соединения) + (2)) в [верёвочные соединения v] на (положение x) //для того, чтобы другие соединения могли смотреть на позицию этого соединения заменить элемент ((id соединения) + (3)) в [верёвочные соединения v] на (положение y) end определить отрендерить перейти в x: (элемент (id соединения) в [верёвочные соединения v]) y: (элемент ((id соединения) + (1)) в [верёвочные соединения v]) опустить перо перейти в x: (элемент ((id соединения) + (2)) в [верёвочные соединения v]) y: (элемент ((id соединения) + (3)) в [верёвочные соединения v]) поднять перо
Здесь добавляется физика:
когда я начинаю как клон задать [id соединения v] значение (кол-во созданных соединений) изменить [кол-во созданных соединений v] на (2) повторять всегда обработать физику :: custom отрендерить :: custom заменить элемент ((id соединения) + (2)) в [верёвочные соединения v] на (положение x) // для того, чтобы другие соединения могли смотреть на позицию этого соединения заменить элемент ((id соединения) + (3)) в [верёвочные соединения v] на (положение y) end определить отрендерить перейти в x: (элемент (id соединения) в [верёвочные соединения v]) y: (элемент ((id соединения) + (1)) в [верёвочные соединения v]) опустить перо перейти в x: (элемент ((id соединения) + (2)) в [верёвочные соединения v]) y: (элемент ((id соединения) + (3)) в [верёвочные соединения v]) поднять перо определить обработать физику задать [сила x v] значение (((элемент (id соединения) в [верёвочные соединения v]) - (положение x)) * (жёсткость)) задать [настоящая сила x v] значение ((сила x) / (масса)) // Распределение силы по массе задать [скорость x v] значение ((демпфирование) * ((скорость x) + (настоящая сила x))) //Сила трения задать [сила y v] значение (((элемент ((id соединения) + (1)) в [верёвочные соединения v]) - (положение y)) * (жёсткость)) изменить [сила y v] на (гравитация) // Убедитесь, что сила тяжести отрицательная задать [настоящая сила y v] значение ((сила y) / (масса)) задать [скорость y v] значение ((демпфирование) * ((скорость y) + (настоящая сила y))) изменить x на (скорость x) изменить y на (скорость y)
Готовый продукт
Это должен быть код для создания двухшарнирной верёвки, соединённой с мышью:
когда щёлкнут по зелёному флагу задать [кол-во созданных соединений v] значение (1) спрятаться повторить (2) раз создать клон [самого себя v] end повторить (6) раз добавить (0) к [верёвочные соединения v] end повторять всегда заменить элемент [1 v] в [верёвочные соединения v] на (x мыши) // Таким образом верёвка будет смотреть в направлении мыши заменить элемент ((0) + (2)) в [верёвочные соединения v] на (y мыши) стереть всё // Стирает экран прошлых зарисовок верёвок end когда я начинаю как клон задать [id соединения v] значение (кол-во созданных соединений) изменить [кол-во созданных соединений v] на (2) повторять всегда обработать физику :: custom отрендерить :: custom заменить элемент ((id соединения) + (2)) в [верёвочные соединения v] на (положение x) // для того, чтобы другие соединения могли смотреть на позицию этого соединения заменить элемент ((id соединения) + (3)) в [верёвочные соединения v] на (положение y) end определить отрендерить перейти в x: (элемент (id соединения) в [верёвочные соединения v]) y: (элемент ((id соединения) + (1)) в [верёвочные соединения v]) опустить перо перейти в x: (элемент ((id соединения) + (2)) в [верёвочные соединения v]) y: (элемент ((id соединения) + (3)) в [верёвочные соединения v]) поднять перо определить обработать физику задать [сила x v] значение (((элемент (id соединения) в [верёвочные соединения v]) - (положение x)) * (жёсткость)) задать [настоящая сила x v] значение ((сила x) / (масса)) // Распределение силы по массе задать [скорость x v] значение ((демпфирование) * ((скорость x) + (настоящая сила x))) //Сила трения задать [сила y v] значение (((элемент ((id соединения) + (1)) в [верёвочные соединения v]) - (положение y)) * (жёсткость)) изменить [сила y v] на (гравитация) // Убедимся, что сила тяжести отрицательная задать [настоящая сила y v] значение ((сила y) / (масса)) задать [скорость y v] значение ((демпфирование) * ((скорость y) + (настоящая сила y))) изменить x на (скорость x) изменить y на (скорость y)
Маятниково-пружинные верёвки
Переменные и списки
Для начала, для каждой точки верёвки будут нужны две переменные скорости:
(скорость x)
(скорость y)
Далее потребуется список, чтобы отслеживать каждую верёвку:
(верёвочные соединения:: list)