Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,882
Записей в блоге: 2

Параметры объекта "сила"

05.10.2025, 20:29. Показов 3280. Ответов 78
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день

Действие происходит в "мире физики" движка. Расчеты выполняются для шага симуляции dt, дефаулт 1/60 секунды. Это совсем не "бесконечно мало", но вполне достаточно чтобы делать удобные предположения/упрощения типа "меняется линейно" не связываясь с "дифурами" и др гадостью.

Есть 3D объект, на каждом шаге симуляции мы можем приложить к нему силу, она сообщит объекту ускорение, и скорость объекта изменится. Формулы в рамках 8-го класса (правда в векторах)

F = m * a;
v += a * dt;

И даже проще, масса конкретного объекта константа, ее можно считать = 1 чтобы не путалась под ногами. Итак, первый параметр объекта "сила" Acceleration (ускорение). Какие еще параметры нужны? Ну ясно что бесконечно расти скорость не может, нужен предел Speed Max. А (по аналогии) Speed Min? Думаю тоже есть смысл, напр человек (объект) стоял и пошел. Вы замечаете какую-то "фазу разгона" когда скорость нарастает? Я нет (вот если стоял и побежал, тогда может быть). Итак, перед тем как скормить движку силу, проверяем, может скорость уже макс и прилагать силу уже не нужно.

Хорошо, и вот первая "элементарная" (любимое слово лохов) задачка: как изменить направление движения? Напр двигался объект по оси X а потом повернулся на 90 и движется вдоль Y? Просто изменить вектор силы/ускорения очевидно недостаточно, получим движение "по диагонали", компонента X скорости сама по себе не иссякнет.
Ага, так он не знает основ физики! Нужно добавить силу трения, она погасит скорость по X!
Да, в движке можно задать трение, но использовать его для поворота, мягко скажем, затруднительно. Обычно радиус поворота слишком велик, а вот скорость резко уменьшается, причем "везде", и там где поворот не нужен. Формулируем
Какой параметр должен управлять "крутизной поворота"? Как его задать и что/как он должен делать?
По опыту предыдущих обсуждений. Попытки привлечь "больше физики" (или более фундаментальной) ничего не дают. Попытки привлечь "дифуры" - тем более. Думается школьной физики здесь вполне достаточно, это скорее задача ТАУ.

Спасибо
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.10.2025, 20:29
Ответы с готовыми решениями:

Сила (по Ньюьону и без)
Здравствуйте Есть 3D объекты имеющие массу. Есть движок физики, которому я могу сообщать "силы"...

Как отличить часть объекта от собственности объекта?
Здравствуйте! Вопрос на стыке русского языка и программирования. Возможно ли сделать программу,...

Получить необходимый объект по параметру
Приветствую. Пишу прогу для формирования шильдиков(бирок) для сигнальных модулей сиеменса. Задача...

78
 Аватар для abit
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,851
05.10.2025, 22:28
Да вроде там никто не назначает вот так лихо новую скорость, обычно в игровых движках по другому действуют
0
 Аватар для MallSerg
91 / 58 / 14
Регистрация: 16.11.2018
Сообщений: 274
05.10.2025, 22:36
Цитата Сообщение от Igor3D Посмотреть сообщение
Просто изменить вектор силы/ускорения очевидно недостаточно
Это откуда такое нелогичное утверждение?

Более чем достаточно в каждый момент итерации для каждого нужного действия прикладывать вектор к объекту.
Прикладывание усех векторов к объекту и расчет векторной суммы это и есть суть и цель рассчета выполняемого в итерации. =). и ничего больше
0
 Аватар для abit
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,851
05.10.2025, 22:43
Цитата Сообщение от MallSerg Посмотреть сообщение
Прикладывание усех векторов к объекту и расчет векторной суммы это и есть суть и цель рассчета выполняемого в итерации. =). и ничего больше
именно об этом и теория, что я скинул), человек похоже вообще не в курсе
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,882
Записей в блоге: 2
05.10.2025, 23:18  [ТС]
Цитата Сообщение от abit Посмотреть сообщение
Да вроде там никто не назначает вот так лихо новую скорость, обычно в игровых движках по другому действуют
Где "там"? Я не планирую никаких игр ни движков. Ссылку посмотреть не удается по техническим причинам. Если там интересная идея - объясните "на пальцах" своими словами. Спасибо

Цитата Сообщение от MallSerg Посмотреть сообщение
Это откуда такое нелогичное утверждение?

Более чем достаточно в каждый момент итерации для каждого нужного действия прикладывать вектор к объекту.
Прикладывание усех векторов к объекту и расчет векторной суммы это и есть суть и цель рассчета выполняемого в итерации. =). и ничего больше
Возможно Вы имели ввиду приложение нескольких сил, напр помимо "движущей" есть еще и гравитация. Но просто так избавиться от инерции не удается, пример

v = (1, 0, 0)
v + a * dt = (1, 0.05, 0)
v + a * dt = (1, 0.1, 0)
и.т.д.

Скорость по X остается
0
 Аватар для abit
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,851
05.10.2025, 23:44
Цитата Сообщение от Igor3D Посмотреть сообщение
Ссылку посмотреть не удается по техническим причинам
посмотрите тогда по этой ссылке
идея в том, что вы действительно должны складывать вектора и тактировать их по времени, тикрейты вроде у нас называются, но я не уверен в названии, уверен в идее, там кстати интерактивный учебник, вы можете сами поводить мышкой и посмотреть что происходит

Добавлено через 17 минут
Но просто так избавиться от инерции не удается, пример
да нет такой силы! это выдумка для младших классов
1
 Аватар для abit
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,851
06.10.2025, 06:11
чтобы избавиться от инерции достаточно прейти в другую систему отсчёта
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,882
Записей в блоге: 2
06.10.2025, 15:26  [ТС]
Цитата Сообщение от abit Посмотреть сообщение
посмотрите тогда по этой ссылке
Спасибо, даже лучше чем первая (тоже удалось посмотреть). Хорошо, давайте разбираться. Вот как управляют объектом
// Standard update function
update() {
this.velocity.add(this.acceleration);
this.velocity.limit(this.maxspeed);
this.position.add(this.velocity);
this.acceleration.mult(0);
}

// Newton’s second law (skipping the math)
applyForce(force) {
this.acceleration.add(force);
}
Все понятно, те же простые школьные формулы. Вот правда я могу рулить только силой, ни velocity ни position трогать не могу, этим занимается движок. При отсутствии в симуляции др факторов движок сделает то же самое. Еще смущает что нигде нет dt, шага симуляции по времени, наверно он полагается единичным.Ладно, поехали дальше, вот расчет силы
// The seek steering force algorithm
seek(target) {
let desired = p5.Vector.sub(target, this.position);
desired.setMag(this.maxspeed);
let steer = p5.Vector.sub(desired, this.velocity);
steer.limit(this.maxforce);
this.applyForce(steer);
}
Здесь немного другая задача: объект должен прийти в заданную точку target. Не проблема, мы можем заменить (target - this.position) на требуемый вектор скорости, у нас его задает юзер. Складываются 2 вектора: требуемый вектор скорости и текущий с минусом, вот оно, гашение инерции. И, как показывают демки, все это вполне прилично, разумно работает, даже без всяких параметров (вообще Рейнольдс - гениальный чувак). Да, но контроля-то нет, а он нужен, напр муха развернется и полетит в нужном направлении гораздо шустрее чем тяжелый автомобиль. Ваши предложения?

Не по теме:

Цитата Сообщение от abit Посмотреть сообщение
чтобы избавиться от инерции достаточно прейти в другую систему отсчёта
Да, в детстве помню такую задачку
Лодочник плыл против течения и под мостом потерял багор. Через час он заметил пропажу, развернулся и догнал багор в 6 км от моста ниже по течению. Какова скорость течения реки?
Я так и сяк пробовал что-то назначить "иксом" и составить уравнение - но ничего не выходило :)

0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,882
Записей в блоге: 2
08.10.2025, 23:44  [ТС]
Так, ну все как обычно: тыцнул ссылкой - и убежал . А поговорить, обсудить? Пусть ссылка забылась или вообще не смотрел - ну в данном случае минут за 10 все можно освоить. Иначе какой смысл накачивать такую "эрудицию"?

Кое-что уточним.
Цитата Сообщение от Igor3D Посмотреть сообщение
все это вполне прилично, разумно работает, даже без всяких параметров
Это неверно. Параметры есть, вот тот же псевдокод чтобы был под рукой
// The seek steering force algorithm
seek(target) {
let desired = p5.Vector.sub(target, this.position);
desired.setMag(this.maxspeed);
let steer = p5.Vector.sub(desired, this.velocity);
steer.limit(this.maxforce);
this.applyForce(steer);
}
Пусть отсечка steer.limit не имеет эффекта. Тогда вектор скорости вычитается полностью, объект мгновенно меняет направление движения (что вообще-то не есть хорошо/правильно). Манипулируя значениями maxspeed и maxforce можно уменьшать вычитаемый вектор скорости добиваясь большей или меньшей инерции. Ну так ли уж это удобно? По-моему нет. И лично меня достает что напр скорость как-то свободно складывается с силой или с ускорением.

Попробуем сформулировать "с примером"
Объект двигается напр вдоль оси X со скоростью v = (1, 0, 0). Под воздействием нашего объекта "сила" его скорость должна быть изменена на v' = (0, 1, 0), т.е. движение в перпендикулярном направлении. Требуется юзеровский параметр управляющий "крутизной поворота", т.е. как быстро вектор скорости будет полностью замещен. Физическое обоснование и объяснение для юзера необязательно, но желательно
Не стоит воспринимать задачу как "мозговой штурм" и лепить фантастические идеи Это вполне конкретная, инженерная задача. Распускать хвост с "большой физикой" тоже не нужно (если уж мы называет игровые рецепты "теорией"). Пусть лучше не будет ответов чем отписываться на какой-то собачий бред. Спасибо за понимание
0
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
16.12.2025, 17:17
Основная проблема этой темы для меня — это непонятный контекст задачи. Так сказать, XY-проблема — ощущение, что формулируется не та задача, которая на самом деле ТС волнует.
Поэтому я зайду издали.

Есть, грубо говоря, два подхода при моделировании движения:
1) отталкиваемся от кинематики, чтобы движение выглядело красиво, а динамику подводим задним числом. Это путь анимирования элементов на сайте, движения менюшечек в играх (выпадающее меню в warcraft, падающие квадратики с сообщениями-событиями в total war). Здесь можно сделать красивую картинку, визуально эстетичную, с простыми формулами, без нагрузки на машину. Ярким примером этого подхода является реализация самонаводящихся ракет «как в аниме».
2) отталкиваемся от динамики, чтобы были заданы «правила игры» мира, чтобы все игроки и NPC им в равной мере следовали. Рассмотрим этот вариант подробнее.

Цитата Сообщение от Igor3D Посмотреть сообщение
Это вполне конкретная, инженерная задача. Распускать хвост с "большой физикой" тоже не нужно (если уж мы называет игровые рецепты "теорией").
Сразу скажу, что это не мой путь. Считаю, что нормальное инженерное решение как раз таки должно опираться на конкретную, известную и хорошо изученную теорию из «большой физики». В противном случае мы рискуем в самом неожиданном месте словить дефект, непосредственно следующий из нереалистичности выбранной неявно(!) подлежащей физической модели.

Вот, к примеру, обсуждение реализации физики гоночных игр (см. также комментарии к статье). Краткий вывод: даже для простой 2D гонки нужно хотя бы в базовых очертаниях представлять распределение сил в автомобиле, колёсах, подвеске. Иначе будет не гонка с заносом и дрифтом, а катание водомерок по водной глади в декорациях гоночной трассы.

Ещё один момент: поскольку в рамках этого подхода мы задаём универсальную динамику, которой подчинены все агенты (игрок, NPC, прочие предметы), то в игре с необходимостью возникает потребность в «ИИ», который будет решать обратную задачу.
Например, если мы реализовали движение с инерцией, то боты должны понимать, как двигаться к выбранной цели: когда необходимо разгоняться, когда притормаживать и т.п.
Можно попытаться эти два компонента совместить воедино, но скорее всего или решение сведётся к кинетической модели, а динамика — сбоку бантик, или высокий риск накосячить.

Собственно, эта мысль уже была озвучена:
Цитата Сообщение от Igor3D Посмотреть сообщение
Вот правда я могу рулить только силой, ни velocity ни position трогать не могу, этим занимается движок.
Да, игрок и боты могут рулить только силой (и то — не всякой), всё остальное делает движок, который реализует конкретную модель физической среды.

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

Не по теме:

Цитата Сообщение от Igor3D Посмотреть сообщение
Еще смущает что нигде нет dt, шага симуляции по времени, наверно он полагается единичным
Кто-то считает массу равной единице, кто-то считает шаг времени единицей. Это всё сравнимо с выбором более удобной системы единиц измерений. Пока число обусловленности хорошее — разницы нет никакой.



Итак, открытый вопрос: что именно мы хотим достичь из того, что в статье не было разобрано? В чём проблема? Какой контекст задачи? Без внятного ответа на них мне сложно ответить конкретнее и предметнее.
1
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,882
Записей в блоге: 2
16.12.2025, 20:12  [ТС]
Цитата Сообщение от Mysterious Light Посмотреть сообщение
В чём проблема? Какой контекст задачи?
Хорошо, начнем с главного. Упоминаемая "статья" - имеется ввиду эта ссылка. Цель - создание реалистичного (физически корректного) но при этом управляемого движения/анимации. Сразу оговоримся что это не игра, интерактивности нет, сценарий такого движения задается юзером, хотя и необязательно явно.

Пример: анимация колобка (создавал и такую тему). С кинематикой проблем нет, мы легко можем заставить объект двигаться куда надо на заданном интервале времени, для этого в любом 3D приложении есть линейка времени, кейфреймы, сплайны (Безье и другие) и еще много чего. Увы, реалистичным такое движение не будет Напр если колобок катится по неровной поверхности, да хотя бы спускается по ступенькам - придется долго пыль глотать всего лишь для того чтобы он нормально контактировал с землей/поверхностью. Не говоря уже о всяких там подскоках и.т.п. Конечно добиться чего-то приемлемого можно, но это кропотливо/трудоемко, а в итоге совсем не то чем можно гордиться.

С др стороны, движок обеспечивает реалистичность "на раз". Просто "уронил" того колобка на поверхность, он и покатился, возможно как-то подпрыгивая, контакт с полом достигается гравитацией, с реализмом все отлично! Да вот беда - управления-то никакого, он катится куда хочет

Надеюсь цель понятна, теперь важные нюансы
Цитата Сообщение от Mysterious Light Посмотреть сообщение
При этом считается, что никаких других сил нет, т.е. агент (игрок, бот) имеет полный контроль над силой.
НЕТ, "полного" контроля нет, и это очень важно. Любое число сил может быть назначено для объекта, и каждая сила ничего не знает о других. Заметим что все параметры объекта (и силы тоже) имеют анимационные кривые, т.е. могут быть анимированы во времени. Напр вполне возможно что при наличии др сил объект вовсе не придет в заданную точку (статья) или придет позже или по какому-то хитрому пути и.т.п. - все это "замысел юзера" который назначает силы. Данная сила (рассматриваемая в статье) должна неуклонно стремиться привести объект в заданную точку, но во что это вольется - как фишка ляжет.
Цитата Сообщение от Mysterious Light Посмотреть сообщение
автомобиле, колёсах, подвеске.
Машины/автомобили не рассматриваем, это специфическая задача для которой в движке есть свои средства, модель (кузов + колеса) и др
Цитата Сообщение от Mysterious Light Посмотреть сообщение
что именно мы хотим достичь из того, что в статье не было разобрано?
Для начала мы хотим дать юзеру удобный параметр для управления/гашения инерции. Ясно что мгновенно развернуться и броситься в заданную точку реальный объект не может. Но поворачиваться слишком долго тоже нет, это не нефтяной танкер. Нужен контроль
0
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
16.12.2025, 22:00
Цитата Сообщение от Igor3D Посмотреть сообщение
Надеюсь цель понятна, теперь важные нюансы
Пока что цель не очень понятна. Зато мы начали понимать друг друга, потому что первые половины наших сообщений говорят одно и то же разными словами. Хорошее начало.

Цитата Сообщение от Igor3D Посмотреть сообщение
НЕТ, "полного" контроля нет, и это очень важно.
Я говорил про модель, описанную по приведённой ссылке. Полный контроль там предполагается.

Цитата Сообщение от Igor3D Посмотреть сообщение
Заметим что все параметры объекта (и силы тоже) имеют анимационные кривые, т.е. могут быть анимированы во времени.
Я не понял этого предложения, его смысл и содержание.

Цитата Сообщение от Igor3D Посмотреть сообщение
Напр вполне возможно что при наличии др сил объект вовсе не придет в заданную точку (статья) или придет позже или по какому-то хитрому пути и.т.п. - все это "замысел юзера" который назначает силы. Данная сила (рассматриваемая в статье) должна неуклонно стремиться привести объект в заданную точку, но во что это вольется - как фишка ляжет.
Не уверен, что понял сказанное. Сейчас перескажу своими словами.

Во-первых, в статье определяется класс Vehicle, который реализует методы update (физика — законы динамики), seek (логика агента — где его цель и как он к ней намерен двигаться), show и др. Тут намешаны разные слои (физический движок, логика агента, представление) в пределах одного класса, но они чётко разделены по методам. Если рассматривать только метод seek, который отвечает за поведение агента, то можно сказать, что рассматривается вариант, когда агент полностью определяет силу.

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

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

В-четвёртых, может случиться, что при выбранной реализации функции seek агент попадёт в заданную точку позже, чем мог бы при альтернативной реализации этой функции, или же придёт по хитрому пути. В любом случае, этот исход полностью определяется тем, как задана зависимость силы, которой агент управляет, от времени/состояния/положения других объектов/др.

Так?

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

Цитата Сообщение от Igor3D Посмотреть сообщение
Машины/автомобили не рассматриваем, это специфическая задача для которой в движке есть свои средства, модель (кузов + колеса) и др
Правильно. А если мы рассматриваем колобка, то мы должны смоделировать его момент инерции, упругость, вязкость и т.п. Поэтому и прошу уточнить задачу.

Цитата Сообщение от Igor3D Посмотреть сообщение
Для начала мы хотим дать юзеру удобный параметр для управления/гашения инерции. Ясно что мгновенно развернуться и броситься в заданную точку реальный объект не может. Но поворачиваться слишком долго тоже нет, это не нефтяной танкер. Нужен контроль
Посмотри на пример 5.2 Arriving at a Target.
Если убрать интерактив, то это поведение похоже на требуемое?
Если да, то задача состоит в том, чтобы дать пользователю набор параметров, которые захардкожены в их решении.
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,882
Записей в блоге: 2
16.12.2025, 23:13  [ТС]
По поводу анимационных кривых. Напр сила имеет параметр Acceleration (ускорение). Известно общее время анимации, напр 10 сек. Значения Acceleration могут меняться юзером на этом интервале времени, напр A = 10 для времени t = 0 сек, A = 5 для t = 2 и.т.д. Переход между значениями (плавно, скачком и др) также задается, в любом случае на тике симуляции известно текущее ускорение
Цитата Сообщение от Mysterious Light Посмотреть сообщение
Так?
Да, так. Сторонние силы могут привести к любому результату.
Цитата Сообщение от Mysterious Light Посмотреть сообщение
Посмотри на пример 5.2 Arriving at a Target.
Если убрать интерактив, то это поведение похоже на требуемое?
Если да, то задача состоит в том, чтобы дать пользователю набор параметров, которые захардкожены в их решении.
Да, и это кажется до смешного простым (на первый взгляд). В частности мы хотим параметр инерция/занос больше/меньше, если не возражаете - сосредоточимся на нем
0
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
17.12.2025, 00:53
Возьмём за основу код, предложенный по ссылке, абстрагируем его.
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
arrive(target) {
    // определим желательную скорость;
    // в конечном счёте мы выберем силу, которая будет приближать реальную скорость к желательной
    let desired = p5.Vector.sub(target, this.position);
    // в качестве первого приближения считаем,
    // что желательная скорость — вектор между текущим положением и целью
    let d = desired.mag(); // Считаем расстояние между текущим положением и целью
 
    // если мы подошли к цели ближе, чем на расстояние this.distToSlow
    if (d < this.distToSlow) {
      let m = map(d, 0, this.distToSlow, 0, this.maxspeed);
      // насколько я понимаю, это эквивалентно
      // let m = this.maxspeed * d / this.distToSlow;
      desired.setMag(m);
      // уменьшаем желательную скорость пропорционально оставшемуся расстоянию,
      // чтобы плавно замедлиться по мере приближения к цели (с учётом инерции)
    } else {
      desired.setMag(this.maxspeed); // вдали от цели можно ускоряться до максимальной скорости
    }
 
    // для изменения скорости используем силу (=ускорение),
    // равную разности желательной и реальной скорости
    let steer = p5.Vector.sub(desired, this.velocity);
    steer.limit(this.maxforce); // ограничим максимальную силу (*)
    this.applyForce(steer);
}
Прим. (*) — я считаю, что эту строчку надо выносить в метод, который отвечает за физику. Но для простого эксперимента и так сойдёт.

Итак, метод параметризован следующими параметрами:
1. maxforce — максимальное ускорение (макс. сила), которое может быть у агента;
2. maxspeed — максимальная скорость, которая может быть у агента;
3. distToSlow — расстояние до цели, начиная с которого вместо тактики «гони что есть мочи» используется тактика «плавно опускаем скорость до нуля по мере приближения к цели».

Все три параметра можно варьировать.
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,882
Записей в блоге: 2
17.12.2025, 15:37  [ТС]
Цитата Сообщение от Mysterious Light Посмотреть сообщение
3. distToSlow — расстояние до цели, начиная с которого вместо тактики «гони что есть мочи» используется тактика «плавно опускаем скорость до нуля по мере приближения к цели».
Давайте пока distToSlow "выведем за скобки", это дополнительная (optional) фича

Код ниже будет гасить инерцию, это достигается вычитанием вектора текущей скорости
Цитата Сообщение от Mysterious Light Посмотреть сообщение
// для изменения скорости используем силу (=ускорение),
    // равную разности желательной и реальной скорости
    let steer = p5.Vector.sub(desired, this.velocity);
    steer.limit(this.maxforce); // ограничим максимальную силу (*)
    this.applyForce(steer);
При достаточно большом this.maxforce текущая скорость полностью заменяется новой, при меньших значениях есть какая-то инерция. Я реализовал это иначе, но принципиальной разницы нет. В итоге да, инерцию мы гасим (контролируемо), но возникает неприятный побочный эффект. Теперь если объект "подпрыгнул", то он как бы "парит" в воздухе, опускаться на землю (поверхность) не спешит. Контакт с поверхностью также "не тот", часто хорошо заметен зазор между ней и объектом, он как бы летит над землей не касаясь ее. Напр шарик/колобок уже скользит (а не катится). Конечно это можно как-то замазать оставляя бОльшую инерцию, но проблема есть

Откуда берется этот (нехороший) эффект - легко понятно, за счет вычитания вектора скорости, которая создается всеми силами, в том числе и гравитацией. Др словами мы просто не даем гравитации "уронить" объект на поверхность

Как с этим бороться?
0
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
17.12.2025, 21:28
Цитата Сообщение от Igor3D Посмотреть сообщение
Теперь если объект "подпрыгнул", то он как бы "парит" в воздухе, опускаться на землю (поверхность) не спешит. Контакт с поверхностью также "не тот", часто хорошо заметен зазор между ней и объектом, он как бы летит над землей не касаясь ее. Напр шарик/колобок уже скользит (а не катится). Конечно это можно как-то замазать оставляя бОльшую инерцию, но проблема есть
Полный код и анимацию в студию!

Так-то в приведённом мною коде никакой гравитации нет, как и любых других сторонних сил (трение, вязкость, притяжение и т.п.).

В целом мне не понятно, с чего бы это объект должен роняться на поверхность, если цель этого объекта — достичь определённой точки, которая находится где-то… где-то в воздухе, наверное.
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,882
Записей в блоге: 2
18.12.2025, 00:46  [ТС]
Цитата Сообщение от Mysterious Light Посмотреть сообщение
Полный код и анимацию в студию!
Код выдрать из проекта не могу, а качество анимации "оставляет желать лучшего". Ну "чем богаты". Анимации отличаются лишь гашением инерции (во второй вычитается вектор текущей скорости). В обеих Колобок движется по пересеченной местности. Сила сначала приложена вдоль оси X, ускорение 50, макс скорость 60. На кадре 600 сила меняет направление скачком, новое направление вдоль Z. В первой анимации Колобок начинает двигаться по диагонали (т.к. гашения нет), во второй - быстро меняет направление на нужное.

Цитата Сообщение от Mysterious Light Посмотреть сообщение
В целом мне не понятно, с чего бы это объект должен роняться на поверхность, если цель этого объекта — достичь определённой точки, которая находится где-то… где-то в воздухе, наверное.
Ну поставить объект на такую кривую поверхность затруднительно, гораздо проще его уронить с небольшой высоты, пусть движок посчитает где он упадет. "Достичь определённой точки" само по себе не цель/задача в данном случае. В приложении можно нарисовать любой путь за минуты и пустить по нему объект. Но это чистая "кинематика", ее минусы понятны. Приведенный выше код тоже дает "кинематику", только она создается программно/алгоритмически. Вычитая вектор скорости мы рубим почти все что делает движок, в итоге имеем бедную, нереалистичную анимацию
Цитата Сообщение от Mysterious Light Посмотреть сообщение
Так-то в приведённом мною коде никакой гравитации нет, как и любых других сторонних сил (трение, вязкость, притяжение и т.п.).
Не надо пытаться "самому делать все", так быстро надорвемся. Надо натравить движок который это умеет
Вложения
Тип файла: mp4 Preview1.mp4 (1.05 Мб, 2 просмотров)
Тип файла: mp4 Preview2.mp4 (1.05 Мб, 2 просмотров)
0
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
18.12.2025, 01:39
Товарищ подсудимый, вы путаетесь в своих показаниях

Цитата Сообщение от Igor3D Посмотреть сообщение
"Достичь определённой точки" само по себе не цель/задача в данном случае.
Цитата Сообщение от Igor3D Посмотреть сообщение
Для начала мы хотим дать юзеру удобный параметр для управления/гашения инерции. Ясно что мгновенно развернуться и броситься в заданную точку реальный объект не может. Но поворачиваться слишком долго тоже нет, это не нефтяной танкер. Нужен контроль
Цитата Сообщение от Igor3D Посмотреть сообщение
Цитата Сообщение от Mysterious Light Посмотреть сообщение
Посмотри на пример 5.2 Arriving at a Target.
Если убрать интерактив, то это поведение похоже на требуемое?
Если да, то задача состоит в том, чтобы дать пользователю набор параметров, которые захардкожены в их решении.
Да, и это кажется до смешного простым (на первый взгляд). В частности мы хотим параметр инерция/занос больше/меньше, если не возражаете - сосредоточимся на нем
Возвращаемся назад к первоначальному, главному вопросу. В чём он состоит?
1. Мы хотим реализовать динамику, чтобы колобок катился-прыгал по неровной поверхности более-менее реалистично?
2. Мы хотим при реализованной динамике управлять колобком, чтобы он с учётом действующих внешних сил двигался к точечной цели?
3. Мы хотим что-то третье?

Последний контрольный вопрос: в приведённых видеофайлах используется собственный движок (реализация динамики/физики) или сторонний? Он работает отлаженно и хорошо, или же по его работе тоже есть вопросы, которые касаются обсуждения в данной теме?
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,882
Записей в блоге: 2
18.12.2025, 16:47  [ТС]
Цитата Сообщение от Mysterious Light Посмотреть сообщение
в приведённых видеофайлах используется собственный движок (реализация динамики/физики) или сторонний? Он работает отлаженно и хорошо, или же по его работе тоже есть вопросы, которые касаются обсуждения в данной теме?
Это популярный open-sources движок Bullet. Насколько он "хорош"? Вполне устраивает. Вопросы есть всегда и к любому движку, но задача его улучшать здесь не ставится. Ну или: здесь мы занимаемся "контроллером" на базе готового движка, можно и так сказать.
Цитата Сообщение от Mysterious Light Посмотреть сообщение
1. Мы хотим реализовать динамику, чтобы колобок катился-прыгал по неровной поверхности более-менее реалистично?
2. Мы хотим при реализованной динамике управлять колобком, чтобы он с учётом действующих внешних сил двигался к точечной цели?
3. Мы хотим что-то третье?
Коротко "да" на все 3 вопроса, которым явно не хватает масштабности. Ясно что сила - вектор, имеющий величину и направление, поэтому так или иначе задать этот вектор придется. Отсюда следует что "движение к точечной цели" - всего лишь один из способов задания направления, таких способов немало, самое простое задать это направление явно (напр по оси X). Вообще "прийти в точку" - случай возможный, но не очень актуальный. Гораздо интереснее "догнать объект" или "приземлиться" на его поверхности. Задать точку назначения не проблема, но она недостижима, ни проникнуть внутрь др объекта, ни воткнуться в поверхность движок не позволит. И как это разрулить - неясно. Но в любом случае это проблемы "второго плана" (а то и третьего), сначала должны быть решены принципиальные вещи, такие как инерция
Цитата Сообщение от Mysterious Light Посмотреть сообщение
при реализованной динамике
Да, да и да (простите за пафос). При движении (под действием нашей силы) объект должен корректно взаимодействовать с др силами и объектами сцены. Если объекты летают в пустоте, то часто нет смысла и движок запускать, проще решить все кинематикой. По минимуму есть гравитация и есть пол/поверхность
0
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
19.12.2025, 14:09
Цитата Сообщение от Igor3D Посмотреть сообщение
Коротко "да" на все 3 вопроса, которым явно не хватает масштабности.
Это были взаимоисключающие варианты…
В рамках одной темы невозможно заниматься всеми компонентами настолько сложной системы.

Давайте будем считать, что движок, реализующий динамику (уравнения движения, гравитацию, трение и т.п.), уже реализована.
Я так понял, уже используется Bullet (не знаком с таким).

Цитата Сообщение от Igor3D Посмотреть сообщение
здесь мы занимаемся "контроллером" на базе готового движка, можно и так сказать.
Получается, наша задача — определять «нашу силу» (мощность работающего двигателя, реактивную тягу негодующего колобка и т.п.), чтобы при движении по реализованным движком законам объект (ракета, колобок) попали туда, куда надо, или по нужно траектории.

Цитата Сообщение от Igor3D Посмотреть сообщение
При движении (под действием нашей силы) объект должен корректно взаимодействовать с др силами и объектами сцены
Ну вот опять противоречие… или то, что я написал выше в рамках этого моего сообщения, неправда, или предложения в цитате быть не должно. Нельзя их совместить!
Можно ли считать, что то написанное мною выше — правда, а вместо процитированного сообщения должно быть:
При движении (под действием нашей силы) объект будет корректно взаимодействовать с др силами и объектами сцены, потому что этими вопросами занимается выбранный движок
Далее:
Цитата Сообщение от Igor3D Посмотреть сообщение
Задать точку назначения не проблема, но она недостижима, ни проникнуть внутрь др объекта, ни воткнуться в поверхность движок не позволит.
Что-то я не понял. Допустим, у нас есть статичная поверхность, где-то на ней лежит колобок. Что мы от колобка хотим? Чтобы он начал катиться и докатился до определённого другого места? Хотим, чтобы он по определённой трассе (с допусками по ширине) прокатился? Что мы хотим? Если точка назначения недостижима (например, находится под поверхностью), что должен колобок сделать, повеситься от безысходности?

А ещё я предлагаю сначала поставить и решить задачу в 2D. Это проще сделать и проще обсуждать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.12.2025, 14:09
Помогаю со студенческими работами здесь

Оценка параметров объекта по изображению
Здравствуйте, мне нужна программма на языке С++ позволяющая по исходному изображению определить...

Сегментация карты глубины на объекты. Определение параметров объектов
Доброго времени суток. В наличии конвейер и 3 камеры, выдающих карту глубин. SDK камер выдает...

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

Генерация случайного сильно связанного орграфа
Здравствуйте. Необходимо, случайным образом, генерировать сильно связный орграф с заданным...

Метод грубой силы при обработке графов
Всем привет! Вот условие задачи: дано около 20 топологий графа (две наиболее простых и понятных...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru