Russian Qt Forum
Апрель 20, 2024, 03:07 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Движок физики. Силы, Ньютон  (Прочитано 14133 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Март 09, 2020, 09:51 »

Добрый день

Заколебали все эти примочки с юником и шаредом, хочется поговорить о большом и светлом Улыбающийся

Пусть мы освоили "современные технологии" и интегрировали движок Bullet в приложение. Теперь мы можем создать напр 100 шариков которые падают на плоскость (переписать пример). Теперь мы хотим чтобы они как-то двигались (или катились) в заданном направлении, напр по оси X, т.е. слева направо. Для этого есть штатное средство движка - сила. Нужно просто позвать (псевдокод)
Код
C++ (Qt)
void rigidBody::ApplyForce( const vector & force );
 
Ну и все, в том смысле что больше с движка здесь ничего не получить, откуда возьмется вектор силы - дело сугубо наше, движок этого не знает.

Очевидно надо создать такой объект "сила" в нашем приложении и дать юзеру возможность им управлять во времени. Как это сделать? Какими должны быть параметры объекта "сила"?

Из школьного курса помнится формула
Цитировать
F = m * a
Ну масса (m) - это свойство объекта, для простоты считаем m = 1. Значит объект "сила" должен иметь параметр "acceleration". Вроде все ясно, но увы, это работает плохо. Да, объекты движутся, но

1) Время разгона часто слишком велико. Правду сказать, физику я никогда особо не понимал. Тот еще пример: вот человек держит тяжелый мешок, выбивается из сил, но... оказывается "с точки зрения физики" никакой работы не выполняется! Какая-то подозрительная точка зрения Плачущий Подобное и здесь. Ну вот стоял человек, а потом взял и пошел - разве мы видим какую-то "фазу ускорения"? (я нет)

2) Наоборот, когда объект разогнался, то остановить (или даже замедлить) его - капитальный гемор. Просто так поставить acceleration = 0 (в нужный момент) не выходит, это просто "больше не ускорять", но текущая скорость-то остается. Приходится как-то прилагать силу в противоположном напр-и и.т.д.

3) По сути та же проблема c поворотом. Да, можно изменить вектор силы, но опять-таки старая скорость остается, поворот получается по какой-то параболе.

Есть и другая возможность движка - забить на силу и рулить скоростью напрямую. Однако так мы теряем почти всю "физику", объект уже не будет отскакивать от препятствий, не будет скатываться по наклонной плоскости и.т.п.

Какие решения Вы можете предложить? Какие параметры должен видеть юзверь в UI объекта "force" ?

Спасибо
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Март 09, 2020, 11:00 »

Здесь системы диффуров в помощь.. Улыбающийся И их решение методами Эйлера или Рунге-Кута 4-го порядка (все что помню из курсов в универе)..
« Последнее редактирование: Март 09, 2020, 11:02 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Март 09, 2020, 11:40 »

Здесь системы диффуров в помощь.. Улыбающийся И их решение методами Эйлера или Рунге-Кута 4-го порядка (все что помню из курсов в универе)..
Ну я чуть больше (ненамного, жизнь заставила). Эйлер совал свой пятак в очень многие вещи, поэтому под "методом Эйлера" обычно понимается не какие-то заумные формулы, а чисто алгоритм, примерно

- делаем "шаг" по времени, он должен быть достаточно мал. Выполняем действия шага, напр двигаем объекты, обычно с линейной скоростью

- проверяем "граничные условия", напр пересекаются ли объекты? Если нет - принимаем сделанный шаг и переходим к следующему. Иначе откатываемся и уменьшаем шаг

И собсно с Эйлером все. Так (в общих чертах) движок находит момент когда объекты пересеклись, но еще не "залезли друг в друга". Обнаружив это, движок собирает "контактные пары" и на их основании вычисляет взаимодействие объектов, напр отскок. Т.е. "в общих чертах" (если не копать детали) все довольно просто, и никакими "дифурами" там и не пахнет, их усердное изучение в ВУЗе носит чисто ритуальный характер  Улыбающийся

Ну и в данной теме это все ни причем. Что делать с этим Ньютоном который на практике не работает ?  Плачущий
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #3 : Март 09, 2020, 13:55 »

Что делать с этим Ньютоном который на практике не работает ?  Плачущий

V = a*t, a = V\t.

Хотите остановить мгновенно (t = 0.0000001), примените очень большую обратную силу (ускорение).
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Март 09, 2020, 16:36 »

Хотите остановить мгновенно (t = 0.0000001), примените очень большую обратную силу (ускорение).
А "интерактивности" нет, это не игра. Юзер может управлять силой во времени, но не объектом/симуляцией напрямую. Напр ускорение -30*100 может и остановит объект со скоростью 100 в течение одного кадра (30 fps), Но может и нет, если объект "уперся лбом" в стену, то его скорость уже = 0, и отрицательное ускорение толкнет его назад.

Поэтому нужно разумное/умелое управление вместо головняка с "голым" Ньютоном.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Март 10, 2020, 11:51 »

На всякий случай разжуем

"Интерактивно" - по-простому "давлю клавиши", нужно быстрее - нажал стрелку вперед, тормоз - стрелку назад и.т.п. Здесь никаких проблем не возникает, по Ньютону вполне достаточно.

Однако вот напр идет группа товарищей (35 метров, скрыншот ниже), управлять каждым не хватит клавиш и/или рук. В играх это иногда называют "NPC", т.е. монстры которыми игрок не управляет, но которые тоже "ходют". Вот мы запускаем движок и сообщаем ему что есть Force действующая на N заданных объектов. Да, юзер может управлять параметрами силы во времени. Напр задать acceleration = 100 для кадров 0-50 и acceleration = -100 для кадров 50-100 и.т.п. И это будет скармливаться движку. Однако это не интерактивно, т.е. какую скорость имеют объекты в момент приложения силы - известно приложению/коду, но не юзеру, он ее сможет узнать только после того как движок отработает и рез-т записан (все свершилось, управлять нечем). Поэтому просто "менять ускорение" не выходит
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Март 12, 2020, 11:14 »

Ну вот, стесняются товарищи Улыбающийся Видимо смущает бедноватый багаж, ну в самом деле
Цитировать
S = v * t
v = a * t
S = a * t * t / 2 + v0 * t
И это.. все формулы Непонимающий Ну как-то это совсем не похоже на "современные технологии" и совсем не круто. Должна (обязательно) быть какая-то вумная "фишка", и вот тогда, зная ее... А так не, ну это несерьезно  Улыбающийся

А между тем разумные ответы были, и не один. Ну хотя бы

1) Чисто "шкурный" подход. Bullet - пожалуй самый популярный движок физики, и эти "силы" должны применять многие. Без них (вернее с одной гравитацией, это тоже сила) можно сыпать объекты на плоскость, этого вдоволь наелись еще в начале нулевых. Так как делают другие?

2) Хотя в стартовом посте и не звучало, но в первую очередь надо ограничить скорость объекта, не может она расти бесконечно, хоть в играх, хоть в real-life, хоть где. Вот и параметр для юзверя "Max Speed", может с чекбоксом

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

Мда... ну ладно  Улыбающийся
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #7 : Март 12, 2020, 12:55 »

Изменение импульса тела обусловленно действием на него силы. Так что пока на тело будет действовать сила, оно будет двигаться с ускорением.
Хотите равномерного движения, с возможностью управлять величиной скорости: бейте по телу кратковременной (tau - время действия силы) силой F.
Тогда, если скорость в начальный момент была v0, то после времени tau, тело будет двигаться с постоянной скоростью v = v0 + F*tau/m.  

Жирным шрифтом выделены вектора.
« Последнее редактирование: Март 12, 2020, 12:57 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Day
Частый гость
***
Offline Offline

Сообщений: 290


Просмотр профиля
« Ответ #8 : Март 12, 2020, 14:24 »

Igors. По-поводу движка не знаю, а по-поводу Ньютона можно сказать так. В момент остановки и отскока, да, действуют силы и F = ma. Но силы эти кратковременны, велики и изменяются по трудно учитываемым законам. Для проверки попробуйте ударится головой о стену Улыбающийся Поэтому при исследовании удара применяются другие законы (которые есть следствия F = ma, но это неважно) Это сохранение энергии для абсолютно упругого удара mv2/2 = const и то, что изменение скорости происходит по нормали к поверхности столкновения. Если удар не абсолютно упруг, часть энергии (или даже вся) теряется на деформацию-нагревание поверхностей. И вот для удара или внезапной остановки (что по сути тоже есть удар, как и внезапное начало движения) в движке должны присутствовать именно эти формулы.
То есть, для вычисления ситуации на следующем такте игры надо использовать именно формулы, придуманные для анализа удара.
Уточню еще (из физики). В самом деле момента удара не существует. Удар - это тоже процесс во времени. Но время мало, а силы не поддаются простому вычислению (если не привлекать физику твердого тела) Поэтому мы связываем два состояния "до" и "после" другими уравнениями.
Конечно, если шариком является чья-то голова, этот подход несколько бесчеловечен. При ударе о деревянную и бетонную стену в этой голове будут происходить разные эффекты. Но для внешнего наблюдателя эта разница не имеет никакого значения. Улыбающийся
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 579


Просмотр профиля
« Ответ #9 : Март 13, 2020, 07:40 »

Есть и другая возможность движка - забить на силу и рулить скоростью напрямую. Однако так мы теряем почти всю "физику", объект уже не будет отскакивать от препятствий, не будет скатываться по наклонной плоскости и.т.п.

Какие решения Вы можете предложить? Какие параметры должен видеть юзверь в UI объекта "force" ?
Спасибо

Если рассматривать корректное физическое движение объектов в пространстве, то здесь требуется учитывать фундаментальные законы сохранения - массы, импульса и энергии. Вся теория физики проистекает из них. Управлять значением силы для описания соударений, как минимум неудобно, так как при абсолютно упругом столкновении имеется разрыв в функции скорости от времени, а функция ускорения от времени стремится в бесконечность (производная по времени функции скорости от времени). Фактически, возникающая в момент соударения сила является следствием свойств самих тел и их кинематических характеристик движения. Она принципиально не может быть задана заранее для любых столкновений, так как в каждом случае она будет своя.

Пользователь должен иметь возможность задавать массу объекта, силы действующие на него в пространстве - точечное воздействие или потенциальное поле.
А для моделирования столкновения объектов задавать процент потерь на диссипацию энергии, и рассчитывать кинематические характеристики тел после столкновения в соответствии с уравнениями сохранения.
« Последнее редактирование: Март 13, 2020, 07:47 от ssoft » Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 579


Просмотр профиля
« Ответ #10 : Март 13, 2020, 08:05 »

 
На всякий случай разжуем

"Интерактивно" - по-простому "давлю клавиши", нужно быстрее - нажал стрелку вперед, тормоз - стрелку назад и.т.п. Здесь никаких проблем не возникает, по Ньютону вполне достаточно.

Однако вот напр идет группа товарищей (35 метров, скрыншот ниже), управлять каждым не хватит клавиш и/или рук.

И здесь оказывается, что пользователю не поведением каких либо бездушных тел нужно управлять, а группой "товарищей"  Подмигивающий Веселый

Так вот "товарищи" сами по себе обладают поведением и возможностями прикладывать к себе силы по мере необходиомости для достижения поставленных целей. Применение к ним модели сил со стороны пользователя выглядит весьма странно - как некое божественное вмешательство).

Обычно, для "товарищей" реализуется индивидуальная модель поведения с заданными ограничениями (скорость, ускорение и т.п.), а пользователем задаются параметры для реализации этой модели. Например, двигаться в из точки А в точку Б с 50% от физических возможностей "товарища", чтобы не сильно устать)), или не много топлива потратить, или других ресурсов, расход которых определяется моделью поведения.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Март 13, 2020, 11:01 »

Хотите равномерного движения, с возможностью управлять величиной скорости: бейте по телу кратковременной (tau - время действия силы) силой F.
Именно это и делает игрок постоянно "подправляя" поведение клавишами, но, как жевали выше, такой возможности здесь нет. Как всегда, Вы пропустили постановку мимо ушей  Плачущий

Уточню еще (из физики). В самом деле момента удара не существует. Удар - это тоже процесс во времени.
К слову: такой выбор есть в движке - можно считать столкновение "импульсом", можно "контактом во времени" что имеет продолжительность. Однако лезть в фундаментальную физику нереально, да и не нужно, см дальше.

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

И здесь оказывается, что пользователю не поведением каких либо бездушных тел нужно управлять, а группой "товарищей"  Подмигивающий Веселый
Неужели "начало доходить"?  Улыбающийся

Так вот "товарищи" сами по себе обладают поведением и возможностями прикладывать к себе силы по мере необходиомости для достижения поставленных целей. Применение к ним модели сил со стороны пользователя выглядит весьма странно - как некое божественное вмешательство).

Обычно, для "товарищей" реализуется индивидуальная модель поведения с заданными ограничениями (скорость, ускорение и т.п.), а пользователем задаются параметры для реализации этой модели. Например, двигаться в из точки А в точку Б с 50% от физических возможностей "товарища", чтобы не сильно устать)), или не много топлива потратить, или других ресурсов, расход которых определяется моделью поведения.
На мой взгляд короче и яснее сказать: "монстры должны управляться скриптами". С этим трудно не согласиться, но если прикинуть сколько "еще всего" надо для этого - сразу плохеет. Нужен механизм событий, нужны (долбаные) графы поведения и еще бог весть что. Да, и "монстры" - просто удачный пример, никакой игры нет, душный или бездушный объект - дело юзера, могут быть просто летающие шарики. И, кстати, опыт внедрения пытона показал - да, есть юзеры для которых скрыпты в кайф.  Но увы, их подавляющее меньшинство, обычный ответ "I'm not a programmer" что по сути = "а не пошел бы ты со своими скриптами.." в вежливой форме.

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

Если рассматривать корректное физическое движение объектов в пространстве,
Это другая, еще более интересная тема. А насколько "физически корректно" Вы (я, он) ходите? Если призадумаетесь, то очень скоро Вы обнаружите что от физики там остаются "рожки да ножки". Если отдать движку "просто модель (человека)" то ни одного "физического" шага эта модель не сделает, сразу рухнет. И то если движок не захлебнется на decomposition. Причем "корректно упасть" - своя, не слабая задача. Как уже упоминалось, мы почему-то обычно не видим плавного ускорения/останова. И физика ничего не знает о том что человек обычно ходит "лицом вперед". А "подъем по ступенькам" - еще одна прелесть. И много еще чего. И все это мне надо делать - но я совсем не знаю как Улыбающийся Ну разумеется "открыть книгу" как всегда (мягко говоря) "не катит". Поэтому с удовольствием поговорю на эту тему
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 579


Просмотр профиля
« Ответ #12 : Март 13, 2020, 12:48 »

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

Модель поведения можно и захарткодить. Необязательно переходить к скриптам. А пользователю необходимо дать возможность управлять моделью удобным для него способом.
Если необходимо выдержать определенную траекторию движения, например, пройти четко по кругу, а не по эллипсу. То пользователь ни в жизнь не подберет такой набор сил, которые нужно применить к объекту. И тем более не сможет заранее оценить, возможна ли в принципе такая траектория для данного "товарища". А вот модель поведения - может и силы рассчитать нужные, и приложить их в нужный момент, и максимально близкую траекторию движения к заданной выдержать.

Управляете, например, автомобилем, Вы ведь силы не задаете? Руль крутите и педали жмете в зависимости от текущих характеристик движения.

Если рассматривать корректное физическое движение объектов в пространстве,
Это другая, еще более интересная тема. А насколько "физически корректно" Вы (я, он) ходите? Если призадумаетесь, то очень скоро Вы обнаружите что от физики там остаются "рожки да ножки". Если отдать движку "просто модель (человека)" то ни одного "физического" шага эта модель не сделает, сразу рухнет. И то если движок не захлебнется на decomposition. Причем "корректно упасть" - своя, не слабая задача. Как уже упоминалось, мы почему-то обычно не видим плавного ускорения/останова. И физика ничего не знает о том что человек обычно ходит "лицом вперед". А "подъем по ступенькам" - еще одна прелесть. И много еще чего. И все это мне надо делать - но я совсем не знаю как Улыбающийся Ну разумеется "открыть книгу" как всегда (мягко говоря) "не катит". Поэтому с удовольствием поговорю на эту тему

Можно честно подходить к моделированию физических явлений, используя физические модели с разными упрощениями и допущениями. Как правило это трудоемко и связано с решением каких-нибудь дифференциальных уравнений (все те же законы сохранения). А можно использовать результаты натурных экспериментов - информация с датчиков или их приближения в виде сплайнов, изи кривых и т.п. В инженерных программах, где важна точность используют решение уравнений, в играх, где важна похожесть на правду, - используют приближения по натурным измерениям или их вообще аниматор задает, чтобы добиться какого-нибудь художественного эффекта.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Март 13, 2020, 14:35 »

Управляете, например, автомобилем, Вы ведь силы не задаете? Руль крутите и педали жмете в зависимости от текущих характеристик движения.
Bullet умеет управлять автомобилями Улыбающийся Однако это специфическая симуляция за рамками данной темы

А вот модель поведения - может и силы рассчитать нужные, и приложить их в нужный момент, и максимально близкую траекторию движения к заданной выдержать.
"Нужный момент" - это "событие" которое надо иметь, о чем я говорил. А так не вижу принципиальной разницы между "моделью поведения" и "объектом силой". Ну вот напр есть сила "движение по заданному пути", там вместо вектора напр-я задается путь который может быть сколь угодно кривым и иметь "толщину". Вот Вам и "модель" если без этого уж никак нельзя. Только это ничего не меняет, все равно силы надо как-то считать, а инерцию как-то гасить. Просьба держаться ближе к этой (изначальной) теме
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 579


Просмотр профиля
« Ответ #14 : Март 13, 2020, 16:33 »

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

Предположим для своевольного объекта задан маршрут движения. Тогда будет известно направление его движения в следующий момент времени. С учетом внешнего воздействия и текущих параметров внутренней модели (количество снаряжения, уровень ловкости, уровень сил, мотивация и др.) можно определить величину необходимых усилий, скорости перемещения, следующую точку на маршруте.
« Последнее редактирование: Март 13, 2020, 16:49 от ssoft » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.109 секунд. Запросов: 23.