Материал из Скретч Вики

Document stub.png Статья не завершена! Если ты хочешь помочь — отредактируй её.
ScratchJr On Flag block.png Этот раздел или статья не предназначена для новичка! Она содержит сложную информацию.

Физика верёвок — физика действительной верёвки, или способ, напоминающий её. Этой физики довольно сложно добиться в Скретче, но она возможна.

Первый способ

Данный способ генерирует хорошие результаты, которые можно посмотреть здесь.

Добавление верёвочных соединений

Первый шаг создания верёвочной физики — создание верёвочных точек, который можно выполнить с помощью этого кода:

когда щёлкнут по зелёному флагу
удалить все из [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)

когда щёлкнут по зелёному флагу
повторять всегда //  Зададим размер пера и цвет верёвки
  установить размер пера (толщина)
  установить для пера цвет (цвет)

Второй способ

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

Информация.png Идеи, изложенные в этом разделе, можно также использовать для создания пружины вместо верёвки.

Переменные и списки

Для начала, для каждой точки верёвки будут нужны две переменные скорости:

  • (скорость x)
  • (скорость y)

А также переменные для её массы и некоторых свойств:

  • (масса)
  • (демпфирование)
  • (жёсткость)
  • (гравитация)

Жёсткость делает верёвку короче и жестче. Демпфирование заставляет силы перемещаться медленнее.

Для вычислительных целей необходимо ещё несколько переменных:

  • (сила x)
  • (сила y)
  • (настоящая сила x)
  • (настоящая сила y)
  • (кол-во созданных соединений)
  • (id соединения)

А также список для хранения пружинных соединений:

  • (верёвочные соединения::list)

Некоторые сведения

В пружине конец пружины всегда стремится попасть в верхнюю часть пружины. Однако он не может этого сделать из-за силы тяжести или потому, что наталкивается на другой участок пружины:

Пружина.png

Здесь верх пружины будет находиться в точке (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)

См. также

Cookie-файлы помогают нам предоставлять наши услуги. Используя наши сервисы, вы соглашаетесь с использованием cookie-файлов.