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

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

05.10.2025, 20:29. Показов 3356. Ответов 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
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,892
Записей в блоге: 2
25.01.2026, 22:32  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Mikle Quits Посмотреть сообщение
если просто создать шарик, сцену, задать гравитацию - и отпустить шарик?
Этот пример в движке называется "Hello World"
Цитата Сообщение от Mikle Quits Посмотреть сообщение
Движок отрабатывает? По идее - до первого касания со сценой всё точно должно быть хорошо, дальше - отскок, вот тут уже появляются нюансы, насколько упругий отскок? Должен задаваться коэффициент упругости. На сколько гладкий отскок? То есть нужно задавать коэффициент трения и тензор инерции для шарика. Дальше остаётся, разве что, задать трение о воздух, ну и можно задать коэффициент трения на качение шарика, чтобы катящийся по плоскости шарик останавливался, всё же, быстрее, чем от трения о воздух только.
Все отрабатывает, отскок (bouncing) задается, шарик катится и останавливается. Можно назначить кастомный центр тяжести и получить что-то типа "ваньки-встаньки". Все хорошо, но таких простых анимаций (что-то упало и покатилось) юзер нажрался еще лет 15 назад.
0
 Аватар для Mikle Quits
769 / 286 / 17
Регистрация: 21.01.2023
Сообщений: 465
25.01.2026, 22:49
Цитата Сообщение от Igor3D Посмотреть сообщение
Все хорошо, но таких простых анимаций (что-то упало и покатилось) юзер нажрался еще лет 15 назад.
Хорошо, с этим разобрались, дальше для того, чтобы управлять шариком, не отключая уже работающую физику, можно либо задавать дополнительно действующую на него силу (как магнит, например), либо сообщать шарику импульсы, то есть порции движения, получаемые за время, меньше одного тика, то есть для данного случая мгновенно, это, например, как удар в бильярде.
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,892
Записей в блоге: 2
26.01.2026, 01:16  [ТС]
Цитата Сообщение от Mikle Quits Посмотреть сообщение
чтобы управлять шариком, не отключая уже работающую физику, можно либо задавать дополнительно действующую на него силу (как магнит, например), либо сообщать шарику импульсы, то есть порции движения, получаемые за время, меньше одного тика, то есть для данного случая мгновенно, это, например, как удар в бильярде.
Да, сила действует в течение тика. Можно прилагать к центру масс объекта, можно в заданной точке (типа "подкручивать"). Аналогично крутящий момент (applyTorque). Да, импульс (мгновенное изменение скорости) тоже есть, хотя и не помню чтобы я его использовал, столкновения/отскоки движок решает/делает сам
0
 Аватар для Mikle Quits
769 / 286 / 17
Регистрация: 21.01.2023
Сообщений: 465
26.01.2026, 07:51
Ну так чего тогда не хватает?
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,892
Записей в блоге: 2
26.01.2026, 14:54  [ТС]
Цитата Сообщение от Mikle Quits Посмотреть сообщение
Ну так чего тогда не хватает?
Того о чем спрашивается в стартовом посте
Цитата Сообщение от Igor3D Посмотреть сообщение
Какой параметр должен управлять "крутизной поворота"? Как его задать и что/как он должен делать?
И про гравитацию не забудьте

Не по теме:

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

0
 Аватар для Mikle Quits
769 / 286 / 17
Регистрация: 21.01.2023
Сообщений: 465
26.01.2026, 15:38
Цитата Сообщение от Igor3D Посмотреть сообщение
как только начинаются "наводящие"
Это не наводящие. Я достаточно поздно понял, что речь ведётся об использовании конкретного движка. В первом сообщении указывается термин "движок", но без названия, поэтому я считал сначала, что речь про написание своего движка.
Вот конкретный ответ: если прилагать к шарику, катящемуся по сцене, силу, перпендикулярную текущей скорости шарика и направленную в сторону нужного поворота, то шарик, не меняя текущей скорости, будет поворачивать тем круче, чем большая сила приложена.
Цитата Сообщение от Igor3D Посмотреть сообщение
И про гравитацию не забудьте
А вот про гравитацию - ещё не до конца выяснено, что её компенсирует. Если не вводить никаких искусственных ограничений, то она никуда и не пропадёт. Вообще, как проявляется то, что "гравитация не действует"? Шарик висит в воздухе и не хочет падать? Или падает, но, когда лежит на склоне, не хочет катиться вниз?
Когда я задал вопрос:
Цитата Сообщение от Mikle Quits Посмотреть сообщение
А что происходит, если просто создать шарик, сцену, задать гравитацию - и отпустить шарик? Движок отрабатывает?
Я получил ответ:
Все отрабатывает, отскок (bouncing) задается, шарик катится и останавливается.
То есть, как бы, проблем с гравитацией нет. Значит они появляются при каких-то других условиях? При каких?

Не по теме:

Цитата Сообщение от Igor3D Посмотреть сообщение
Народная примета
В приметы не верю.

1
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,892
Записей в блоге: 2
26.01.2026, 17:38  [ТС]
Попробую ухватить/ответить главное
Цитата Сообщение от Mikle Quits Посмотреть сообщение
То есть, как бы, проблем с гравитацией нет. Значит они появляются при каких-то других условиях? При каких?
Да, если шарик упал и прокатился - проблем с гравитацией нет. И реалистичность устраивает. Но управления-то никакого, шарик катится "куда бог послал". В той же сцене будем прилагать к шарику вектор силы (1, 0, 0) - опять все хорошо, шарик катится по X, как мы хотели, и с заданной скоростью. Проблема с гравитацией начинаются когда мы хотим изменить направление движения шарика и для этого начинаем тормозить, вычитать текущий вектор скорости, а вместе с ним и скорость внесенную гравитацией. Хорошо сказал мой тезка, "у него как бы джетпак за спиной", он не придавливается к земле должным образом, в анимации это хорошо заметно. Там выше есть мувики, если надо сделаю опрятнее (кодеки давеча починил)
0
 Аватар для Mikle Quits
769 / 286 / 17
Регистрация: 21.01.2023
Сообщений: 465
26.01.2026, 19:17
Цитата Сообщение от Igor3D Посмотреть сообщение
Проблема с гравитацией начинаются когда мы хотим изменить направление движения шарика и для этого начинаем тормозить, вычитать текущий вектор скорости, а вместе с ним и скорость внесенную гравитацией
Воо.., теперь понятнее.
Как я выше писал, для поворота нужно прилагать силу, перпендикулярную вектору скорости, в направлении поворота. Разворачивать вектор скорости на 90 градусов вокруг нормали поверхности в точке соприкосновения, тормозить ничего не надо (если, конечно, не ставится задача снизить скорость в повороте).
А можно, кстати, даже не поворачивать вектор, а векторно перемножить (CrossProduct) вектор скорости и нормаль поверхности - результат будет тот же. В зависимости от порядка множителей поворот будет вправо или влево.
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,892
Записей в блоге: 2
26.01.2026, 22:26  [ТС]
Цитата Сообщение от Mikle Quits Посмотреть сообщение
Как я выше писал, для поворота нужно прилагать силу, перпендикулярную вектору скорости, в направлении поворота. Разворачивать вектор скорости на 90 градусов вокруг нормали поверхности в точке соприкосновения, тормозить ничего не надо
Направление силы меняет юзер, на 90 или как - его дело. При текущей скорости (1, 0, 0) сила в новом направлении изменит вектор скорости напр (1, 1, 0), т.е. старая скорость/компонента сама собой не иссякнет. Поэтому тормозить (гасить инерцию) надо. С трением упомянуто в стартовом посте, потом разжевал подробнее. Других предложений не вижу. Свои мысли высказал

Не по теме:

Цитата Сообщение от Mikle Quits Посмотреть сообщение
В зависимости от порядка множителей поворот будет вправо или влево.
Предлагаю считать всех присутствующих достаточно грамотными :)

0
 Аватар для Mikle Quits
769 / 286 / 17
Регистрация: 21.01.2023
Сообщений: 465
26.01.2026, 22:49
Цитата Сообщение от Igor3D Посмотреть сообщение
При текущей скорости (1, 0, 0) сила в новом направлении изменит вектор скорости напр (1, 1, 0), т.е. старая скорость/компонента сама собой не иссякнет.
Я написал "приложить силу", а не "сообщить импульс". А сила за один тик изменит вектор скорости не так радикально, а, скажем, до (1, 0.01, 0). А в следующем тике перпендикуляр будет искаться уже к этому вектору. То есть добавочная сила получится уже немного назад по сравнению с изначальной. И так, по мере поворота, приложенная сила тоже будет поворачивать, оставаясь всегда перпендикулярной с текущей скоростью. Так что "старая скорость/компонента" иссякнет, только не сама собой, а вполне за счёт поворачивающей силы.
Цитата Сообщение от Igor3D Посмотреть сообщение
Направление силы меняет юзер, на 90 или как - его дело
Если его дело, то пускай меняет, как хочет, а я отвечал на вопрос, что нужно сделать, чтобы объект плавно повернул. Эти 90 градусов - это не поворот конечной скорости, а поворот начальной скорости с целью получить направление вектора нужной для поворота силы. А для того, чтобы объект перестал поворачивать, просто снимаем с него эту поворачивающую силу, дождавшись момента, когда он движется в нужном нам направлении.
Цитата Сообщение от Igor3D Посмотреть сообщение
Предлагаю считать всех присутствующих достаточно грамотными
Так начните это делать.
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,892
Записей в блоге: 2
27.01.2026, 12:57  [ТС]
Цитата Сообщение от Mikle Quits Посмотреть сообщение
Я написал "приложить силу", а не "сообщить импульс". А сила за один тик изменит вектор скорости не так радикально, а, скажем, до (1, 0.01, 0). А в следующем тике перпендикуляр будет искаться уже к этому вектору. То есть добавочная сила получится уже немного назад по сравнению с изначальной. И так, по мере поворота, приложенная сила тоже будет поворачивать, оставаясь всегда перпендикулярной с текущей скоростью. Так что "старая скорость/компонента" иссякнет, только не сама собой, а вполне за счёт поворачивающей силы.
Да, но все равно мы прилагаем силу противоположную текущему вектору скорости. Пусть делаем это как-то хитро, создавая поворот, но сути это не меняет, все равно прилагаемая сила вычисляется на основании текущей скорости и гасит ее/инерцию.

Вот что плохого в тезисе/утверждении?
Объект умеет тормозить
Тот же велосипедист, ну он же может остановить свой велик не дожидаясь пока это сделает трение. Пешеход, автомобиль, на худой конец кошка - все умеют останавливаться и/или поворачивать. Останов можно рассматривать как частный случай поворота, просто новый вектор скорости нулевой. Почему это немедленно называется "костыль"? Что тут "костыльного"? Наоборот, костыль здесь как раз отсутствие параметра "тормоз"

Теперь с пропадающей гравитацией/джетпаком. Почему бы тупо не сказать "а наш тормоз не работает вдоль оси Y", и в расчетах просто обнулять Y-компоненту вычитаемого вектора? На чекбокс эту опцию, может в космосе и по Y тормозим.
Как думаете? Покритикуйте
0
 Аватар для Mikle Quits
769 / 286 / 17
Регистрация: 21.01.2023
Сообщений: 465
27.01.2026, 13:51
Цитата Сообщение от Igor3D Посмотреть сообщение
все равно мы прилагаем силу противоположную текущему вектору скорости
Мы прилагаем силу, перпендикулярную текущему вектору скорости. После нескольких тиков в этой силе постепенно нарастает компонента, противоположная начальной, а не текущей скорости.

Цитата Сообщение от Igor3D Посмотреть сообщение
все равно прилагаемая сила вычисляется на основании текущей скорости и гасит ее/инерцию.
Не гасит, а перенаправляет, именно так действует сила, перпендикулярная скорости.

Цитата Сообщение от Igor3D Посмотреть сообщение
что плохого в тезисе/утверждении?
Объект умеет тормозить
Ничего плохого. Только задача была сделать плавный поворот, а не торможение. Я её и решил.

Цитата Сообщение от Igor3D Посмотреть сообщение
Останов можно рассматривать как частный случай поворота
Нельзя. При повороте модуль скорости не меняется.

Цитата Сообщение от Igor3D Посмотреть сообщение
костыль здесь как раз отсутствие параметра "тормоз"
Я не предлагал его запрещать, просто в текущей задаче он не был нужен.

Цитата Сообщение от Igor3D Посмотреть сообщение
Почему бы тупо не сказать "а наш тормоз не работает вдоль оси Y", и в расчетах просто обнулять Y-компоненту вычитаемого вектора?
Хотя бы потому, что такой тормоз на наклонной плоскости будет слабее тормозить, чем на горизонтальной.

Цитата Сообщение от Igor3D Посмотреть сообщение
Покритикуйте
Исполнено.
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,892
Записей в блоге: 2
28.01.2026, 17:32  [ТС]
Цитата Сообщение от Mikle Quits Посмотреть сообщение
Мы прилагаем силу, перпендикулярную текущему вектору скорости. После нескольких тиков в этой силе постепенно нарастает компонента, противоположная начальной, а не текущей скорости.
Это я тоже пытался здесь обсуждать (с обычным успехом), правда для немного иной задачи. Вот стоит чайник и смотрит носиком в направлении (1, 0, 0). Представим что это напр автобус. Задается направление движения, напр (0, 0, 1), туда нужно ехать. Ясно что поехать "сразу вбок" автобус не может, надо как-то вырулить на требуемое направление. Напрашивается прилагать силу перпендикулярно, но начальная скорость может быть малой или вообще нулевой.

А если "ось движения" не задана, т.е. объект может двигаться как угодно, то в таком повороте не видно смысла, любое смешивание векторов (требуемое ускорение и текущая скорость) производит поворот, достигать того же каким-то хитрым способом нет смысла, это простые игры с алгеброй/арифметикой
0
 Аватар для Mikle Quits
769 / 286 / 17
Регистрация: 21.01.2023
Сообщений: 465
28.01.2026, 18:39
Цитата Сообщение от Igor3D Посмотреть сообщение
Ясно что поехать "сразу вбок" автобус не может, надо как-то вырулить на требуемое направление.
А этот вопрос никакого отношения к физике не имеет - это уже, какой-никакой, ИИ.
Я такое делал ещё в AoS2 - соперники, вылетевшие на обочину, сами выруливают на дорогу, при необходимости используют задний ход.
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,892
Записей в блоге: 2
28.01.2026, 21:36  [ТС]
Цитата Сообщение от Mikle Quits Посмотреть сообщение
А этот вопрос никакого отношения к физике не имеет - это уже, какой-никакой, ИИ.
А никто и не ограничивал задачу "чисто физикой"
0
 Аватар для Mikle Quits
769 / 286 / 17
Регистрация: 21.01.2023
Сообщений: 465
28.01.2026, 22:31
Цитата Сообщение от Igor3D Посмотреть сообщение
А никто и не ограничивал задачу "чисто физикой"
Тогда нужно уточнить условия. Есть какие-то заборы, бордюры, прочие препятствия? Если нет - то остаётся задать радиус поворота, условную цену переключения передачи (представим, что нужно ехать назад, что проще, сразу передним ходом сделать полный разворот, или на 90 градусов задним ходом, потом на 90 градусов передним). А ещё могут быть условия, типа не нарушать ПДД.
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,892
Записей в блоге: 2
30.01.2026, 15:25  [ТС]
Цитата Сообщение от Mikle Quits Посмотреть сообщение
Тогда нужно уточнить условия. Есть какие-то заборы, бордюры, прочие препятствия? Если нет - то остаётся задать радиус поворота, условную цену переключения передачи (представим, что нужно ехать назад, что проще, сразу передним ходом сделать полный разворот, или на 90 градусов задним ходом, потом на 90 градусов передним). А ещё могут быть условия, типа не нарушать ПДД.
Ну хорошо, давайте потренируемся с плавным поворотом вектора скорости, по меньшей мере это нужно в другой/близкой задаче. Дано
C++
1
2
3
4
5
6
dt = 1/60 sec                  // тик симуляции
CurrentSpeed = (50, 0, 0)  m/sec  // вектор текущей скорости
MaxSpeed = 50 m/sec            // макс скорость
Acceleration = 10 m/sec  // ускорение
ForceDir = (0, 0, 1)         // требуемое направление вектора скорости  
Radius = 15 m               // радиус поворота (?)
Нужно посчитать вектор силы F прилагаемый для разворота текущего вектора скорости до направления ForceDir на интервале dt. Конечно полный поворот выполнится за несколько/много тиков
0
 Аватар для Mikle Quits
769 / 286 / 17
Регистрация: 21.01.2023
Сообщений: 465
30.01.2026, 15:31
Цитата Сообщение от Igor3D Посмотреть сообщение
Acceleration = 10 m/sec  // ускорение
О каком ускорении речь? Или речь про G, ускорение свободного падения?
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,892
Записей в блоге: 2
30.01.2026, 21:34  [ТС]
Цитата Сообщение от Mikle Quits Посмотреть сообщение
О каком ускорении речь?
Это величина/модуль силы (F = m * a) прилагаемой к объекту. Направление задается отдельно. Напр если ускорение = 10, то стоящий объект через 1 сек получит скорость 10 м/сек
Только вот размерность указана неверно, правильно m / (sec * sec)

Добавлено через 3 минуты
Думается правильно рассматривать (или "можно считать") Acceleration как мощность двигателя/мотора что имеет активный объект
0
 Аватар для Mikle Quits
769 / 286 / 17
Регистрация: 21.01.2023
Сообщений: 465
31.01.2026, 09:05
Будь это шарик - достаточно вспомнить формулу центростремительной силы:
Code
1
F = m*v^2/R
Эту силу необходимо прикладывать для поворота объекта заданной массы, с заданной текущей скоростью и с заданным радиусом поворота.
Если же это автомобиль, задача вообще не таким образом решается. Нам не нужно рассчитывать силу F, нам нужно задать угол поворота рулящих колёс, и эта сила возникнет сама в результате работы физики.
А усилие двигателя должно применяться для поддержания текущего модуля скорости, который будет снижаться из-за трения. И это усилие - величина, зависящая от таких факторов, как текущая передача, текущая скорость, глубина нажатия педали "газ". Даже если сильно упростить, то всё равно, эту величину более правильно определить не как силу или ускорение, а как мощность - при меньшей скорости двигатель способен обеспечить большую тягу.
Я когда-то делал максимально упрощённую (фейковую) физику автомобиля на плоскости. Однако тут имеются передачи, заносы\пробуксовки, наклоны корпуса машины по двум осям:

Visual Basic
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
Option Explicit
Dim Keyb(255) As Boolean
 
Dim Accel As Single     'Текущее положение педали газа
Dim Break As Single     'Текущее положение педали тормоза
Dim Steer As Single     'Текущее положение руля
Dim KPPstep As Long     'Текущая передача
Const KPPMaxstep = 4    'Число ступеней передач вперед
Dim KPP(-1 To KPPMaxstep) As Single 'Коэффициенты КПП
 
Dim Speed As Single     'Скорость
Dim CarX As Single      'Координата X центра тяжести машины
Dim CarY As Single      'Координата Y центра тяжести машины
Dim Alpha As Single     'Угол поворота корпуса вокруг вертикальной оси Z
Dim SpeedAlpha As Single  'Скорость вращения
Dim SpeedX As Single    'X компонента вектора скорости
Dim SpeedY As Single    'Y компонента вектора скорости
Dim DTime As Single     'Время, прошедшее с предыдущего кадра в сек.
 
  'Следующие семь величин нужны только в 3D
Dim carDiffFB As Single 'Наклон машины вперед-назад
Dim carDiffLR As Single 'Наклон машины вправо-влево
Const kYung = 15        'Жесткость амортизаторов
Const carWidth = 1.85   'Ширина машины в м.
Const carHeight = 2.3   'Длина машины между осями в м.
Const resLR = 3.5       'Поперечная резонансная частота качания в гц.
Const resFB = 2         'Продольная резонансная частота качания в гц.
 
Const kAF = 0.5         'Коэффициент трения о воздух и в подвеске
Const MaxFRCY = 20      'Максимальная продольная сила трения, выше - пробуксовка
Const MaxFRCX = 20      'Максимальная поперечная сила трения, выше - занос
Const MaxRotFRC = 10    'Максимальная сила трения вращения
  'Примерные значения MaxFRCY, MaxFRCX и MaxRotFRC:
                        'для асфальта - 20, 20, 10
                        'для льда - 5, 5, 3
                        'для гравия - 10,15, 5
 
Const Power = 0.12      'Мощность движка в квт, деленная на массу в кг(1 л.с. = 736 ватт)
                        'При мощности 165 л.с. и массе 1 т. Power = 165 * 0.736 / 1000
Const CarSpeed = 90     'Максимальная скорость без учета трения в м/с (1 км/ч = 0.278 м/с)
Const Radius = 4        'Радиус поворота в м.
Const CtrlSens = 1.2    'Чувствительность управления
Const carExBack = 1.25  'Расстояние от задней оси до центра тяжести в м.
 
  'Коэффициенты КПП, на максимальной ступени должно быть = 1.
  KPP(-1) = -0.3
  KPP(0) = 0
  KPP(1) = 0.3
  KPP(2) = 0.566
  KPP(3) = 0.8
  KPP(4) = 1
 
Private Sub Driving()   'Управление
  If Keyb(vbKeyUp) Then         'Газ
    Accel = Accel + DTime * CtrlSens: If Accel > 1 Then Accel = 1
  Else
    Accel = Accel - DTime * CtrlSens: If Accel < 0.1 Then Accel = 0.1   'Холостые обороты
  End If
  
  If Keyb(vbKeyDown) Then       'Тормоз
    Break = Break + DTime * CtrlSens: If Break > 1 Then Break = 1
  Else
    Break = Break - DTime * CtrlSens: If Break < 0 Then Break = 0
  End If
 
  If Keyb(vbKeyLeft) Then       'Влево
    Steer = Steer - DTime * CtrlSens: If Steer < -0.5 Then Steer = -0.5
  ElseIf Keyb(vbKeyRight) Then  'Вправо
    Steer = Steer + DTime * CtrlSens: If Steer > 0.5 Then Steer = 0.5
  Else                          'Выровнять
    If Abs(Steer) < CtrlSens Then
      Steer = 0
    Else
      Steer = Steer - DTime * CtrlSens * Sgn(Steer)
    End If
  End If
 
  If Keyb(vbKeyA) Then          'Передача +
    If KPPstep < KPPMaxstep Then KPPstep = KPPstep + 1
    Keyb(vbKeyA) = False
  ElseIf Keyb(vbKeyZ) Then      'Передача -
    If KPPstep > -1 Then KPPstep = KPPstep - 1
    Keyb(vbKeyZ) = False
  End If
End Sub
 
Private Sub Moving()    'Движение
Dim SpX As Single       'Скорость по локальной оси X
Dim SpY As Single       'Скорость по локальной оси Y
Dim FrcX As Single      'Сила по локальной оси X
Dim FrcY As Single      'Сила по локальной оси Y
Dim ForceX As Single    'Сила по оси X
Dim ForceY As Single    'Сила по оси Y
Dim RotFRC As Single    'Момент силы вращения
Dim tmp As Single
 
  'Перевод величин в локальную систему координат автомобиля
  If SpeedY > 0.0000001 Then
    tmp = Atn(SpeedX / SpeedY)
  ElseIf SpeedY < -0.0000001 Then
    tmp = 3.141593 + Atn(SpeedX / SpeedY)
  Else
    tmp = 1.570796 * Sgn(SpeedX)
  End If
  tmp = tmp - Alpha
  Speed = Sqr(SpeedX * SpeedX + SpeedY * SpeedY)
  SpX = -Speed * Sin(tmp)
  SpY = Speed * Cos(tmp)
 
  'Расчет сил
  If KPPstep = 0 Then
    FrcY = 0
  Else
    FrcY = (KPP(KPPstep) * CarSpeed * Accel - SpY) * Power / (KPP(KPPstep) * KPP(KPPstep))
  End If
 
  FrcY = FrcY - (Break / DTime + kAF) * Sgn(SpY)
  FrcX = (-SpY * Steer * carExBack / Radius - SpX) / DTime
 
  If Abs(FrcX) > MaxFRCX Then FrcX = MaxFRCX * Sgn(FrcX)    'занос
  If Abs(FrcY) > MaxFRCY Then FrcY = MaxFRCY * Sgn(FrcY)    'пробуксовка
 
  If KPPstep = 0 Then tmp = 0 Else tmp = 2 / (Abs(KPP(KPPstep)) * CarSpeed)
  RotFRC = (Steer * SpY / Radius - SpeedAlpha + SpX * Accel * tmp) / DTime
  tmp = MaxRotFRC * (CarSpeed - SpY) / CarSpeed
  If Abs(RotFRC) > tmp Then RotFRC = Sgn(RotFRC) * tmp
 
  'Вычисление наклонов
  tmp = DTime * resFB
  carDiffFB = carDiffFB * (1 - tmp) + FrcY / (MaxFRCY * kYung * carHeight) * tmp
  tmp = DTime * resLR
  carDiffLR = carDiffLR * (1 - tmp) + FrcX / (MaxFRCX * kYung * carWidth) * tmp
 
  'Перевод величин в мировую систему координат
  ForceY = FrcY * Cos(Alpha) + FrcX * Sin(Alpha)
  ForceX = FrcY * Sin(Alpha) - FrcX * Cos(Alpha)
  
  SpeedAlpha = SpeedAlpha + RotFRC * DTime
  SpeedX = SpeedX + ForceX * DTime
  SpeedY = SpeedY + ForceY * DTime
  Alpha = Alpha + SpeedAlpha * DTime
  CarX = CarX + SpeedX * DTime
  CarY = CarY + SpeedY * DTime
End Sub
Это код из рабочей демки на VB6, убрано всё лишнее - инициализация, визуализация, опрос клавиатуры.
Если использовать такую физику, нужно отключать физику движка.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.01.2026, 09:05
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru