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

Сила (по Ньюьону и без)

17.12.2015, 16:43. Показов 1513. Ответов 38
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте

Есть 3D объекты имеющие массу. Есть движок физики, которому я могу сообщать "силы" (вектора) в результате которых объекты могут двигаться. Пример: юзер включил силу: направление по оси X и величина напр 10. В рез-те объекты движутся с ускорением 10. Сила действует по Ньютону (F = m * a). Чтобы масса не путалась под ногами положим ее = 1 (это домножение на константу). Все хорошо.

Предположим так сила прилагается в течение 2 секунд, в рез-те объект приобрел скорость v = (20, 0, 0). Теперь юзер меняет направление силы - она уже действует по Y. Еще через 2 сек v = (20, 20, 0). Это абсолютно корректный рез-т по первому закону Ньютона. НО... он не устраивает юзера. "Чего это объект летит по диагонали? Я силу направил вверх, мне НАДО чтобы он вверх и полетел". Др словами надо гасить инерцию, полностью или частично. Это соответствует тому что объект как бы "активен", типа самолетик умеющий тормозить и.т..п.

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

1) Сил может быть сколько угодно, поэтому одна не должна давить все

2) Текущий вектор скорости конечно всегда известен, но он может не иметь ничего общего с приложенными ранее силами. Если напр объект уперся в препятствие то его скорость ноль, а если отскочил - скорость вообще направлена в др сторону. Этим занимается движок, менять скорость напрямую хотя и можно, но ничего хорошего не дает, грамотно прилагать силы. Прошу поделиться соображениями (хотя бы и сырыми).

Не по теме:


Ну что, опять "стык" теории и практики? :)


С уважением
Игорь
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.12.2015, 16:43
Ответы с готовыми решениями:

Гравитационное поле. Сила тяжести. Первая космическая сила. Как понять?
Гравитационное поле. Сила тяжести. Первая космическая сила. Как понять?

Сила тертя і сила пружності
Ребят, помогите, пожалуйста! Нужно решить одну задачку по физике. Один кінець горизонтально розташованої пружини жорсткістю k=250 Н/м...

Сила тока...
в цепь переменного тока напряжением 220 В и частотой 50 Гц последовательно включены резистор сопротивлением R=100 Ом, катушка...

38
Модератор
Эксперт функциональных языков программирования
3136 / 2283 / 469
Регистрация: 26.03.2015
Сообщений: 8,885
27.12.2015, 13:13
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Igor3D Посмотреть сообщение
Теперь юзер меняет направление силы - она уже действует по Y
Направление силы и руль - это разные вещи.
Используя руль и трение, можно повернуть под прямым углом - с околонулевым радиусом поворота. Для этого достаточно задать трение ноль в направлении руля и трение бесконечность в направлении, перпендикулярном рулю.
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,895
Записей в блоге: 2
27.12.2015, 14:05  [ТС]
Цитата Сообщение от Shamil1 Посмотреть сообщение
Направление силы и руль - это разные вещи.
Поспорить о корректности терминов можно практически всегда

Цитата Сообщение от Shamil1 Посмотреть сообщение
Используя руль и трение, можно повернуть под прямым углом - с околонулевым радиусом поворота. Для этого достаточно задать трение ноль в направлении руля и трение бесконечность в направлении, перпендикулярном рулю.
Как устойчив в сознании образ "трения" Но вот я что-то не вполне понимаю как это сделать. Попробуем "формализоваться". Есть

1) Текущий вектор силы - по сути ускорение м/сек^2
2) Текущий вектор скорости м/сек
3) Какой-то еще параметр силы регулирующий крутизну поворота
4) Частота движка, напр 30 fps

Как изменить текущий вектор силы так чтобы учесть "поворот"?
0
Модератор
Эксперт функциональных языков программирования
3136 / 2283 / 469
Регистрация: 26.03.2015
Сообщений: 8,885
27.12.2015, 14:35
3)
Есть угол, задающий ориентацию руля. Угол управляется пользователем.
Есть сила стрения, пропорциональная скорости.
Есть два коэффициента пропроциональности - "вдоль" и "перепендикулярно".

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

Добавлено через 2 минуты
Раскладываем вектор скорости на "вдоль" и "перепендикулярно" рулю. Вычисляем вектора силы трения в данных направлениях. Складываем и получаем вектор силы трения.
0
99 / 46 / 18
Регистрация: 09.08.2015
Сообщений: 367
27.12.2015, 14:50
Цитата Сообщение от Shamil1 Посмотреть сообщение
p.s. Меняет: было минимальное сопротивление в одном направлении, теперь минимальное сопротивление в другом направлении.
Падающий бутерброд с маслом - управляемое тело?

Цитата Сообщение от Igor3D Посмотреть сообщение
Да, если юзер обеспечил такие параметры силы. Очевидно что трение здесь не к месту
Ну тогда очевидно что физика здесь не к месту, вращайте вектор скорости в сторону необходимого вектора на заданный угол (кватернионы).
0
Модератор
Эксперт функциональных языков программирования
3136 / 2283 / 469
Регистрация: 26.03.2015
Сообщений: 8,885
27.12.2015, 15:04
Цитата Сообщение от AncientPenguin Посмотреть сообщение
Падающий бутерброд с маслом - управляемое тело?
Нет.
Странно, что Вы об этом спрашиваете. У бутерброда сопротивления в разных направлениях (относительно бутерброда) не меняются (если только он не начал разрушаться).
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,895
Записей в блоге: 2
27.12.2015, 15:44  [ТС]
Цитата Сообщение от Shamil1 Посмотреть сообщение
Раскладываем вектор скорости на "вдоль" и "перепендикулярно" рулю. Вычисляем вектора силы трения в данных направлениях. Складываем и получаем вектор силы трения.
Нет никакой необходимости упорно привлекать трение, достаточно просто утверждения о "рулении". Напр самолетик может включить "форсаж" или "дюзы" или что там еще - неважно как это технически реализуется в реальном мире. Ну хорошо, "раскладываемся"

C++
1
2
3
4
5
6
Vec3 accel;   // текущий вектор ускорения (сила)
Vec3 velocity; // текущий вектор скорости
 
Vec3 accelDir = accel.normalized();   // нормированный вектор ускорения 
Vec3 velocity_along = accelDir * dot(accelDir, velocity);  // проекция скорости на текущее ускорение
Vec3 velocity_across = velocity - velocity_along ;  // вторая компонента скорости
И вот дальше что? Как цивильно/грамотно задавить вторую компоненту?
0
99 / 46 / 18
Регистрация: 09.08.2015
Сообщений: 367
27.12.2015, 17:45
Цитата Сообщение от Igor3D Посмотреть сообщение
Нет никакой необходимости упорно привлекать трение
У вас там космический симулятор? Если я просто отпущу кнопку, что остановит тело?
0
Модератор
Эксперт функциональных языков программирования
3136 / 2283 / 469
Регистрация: 26.03.2015
Сообщений: 8,885
27.12.2015, 19:24
Цитата Сообщение от Igor3D Посмотреть сообщение
И вот дальше что?
Я уже написал, как вычислить вторую силу, которая действует на "самолётик" (первую задаёт пользователь). Дальше всё по законам механики, я не знаю, что ещё добавить.
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,895
Записей в блоге: 2
28.12.2015, 13:04  [ТС]
Цитата Сообщение от AncientPenguin Посмотреть сообщение
У вас там космический симулятор? Если я просто отпущу кнопку, что остановит тело?
Если никаких сил не приложено, тело движется со своей текущей скоростью сколь угодно долго

Цитата Сообщение от Shamil1 Посмотреть сообщение
Я уже написал, как вычислить вторую силу, которая действует на "самолётик" (первую задаёт пользователь). Дальше всё по законам механики, я не знаю, что ещё добавить.
Недостающую конкретность. Т.к. вот это
Цитата Сообщение от Shamil1 Посмотреть сообщение
Раскладываем вектор скорости на "вдоль" и "перепендикулярно" рулю. Вычисляем вектора силы трения в данных направлениях. Складываем и получаем вектор силы трения.
еще не решение
0
Модератор
Эксперт функциональных языков программирования
3136 / 2283 / 469
Регистрация: 26.03.2015
Сообщений: 8,885
28.12.2015, 13:37
Цитата Сообщение от Igor3D Посмотреть сообщение
Недостающую конкретность.
1. Представить вектор скорости в виде суммы двух векторов, один из которых лежит на прямой, параллельной "рулю".
2. Домножить один из этих двух векторов на одну константу, а другой - на другую.
3. Сложить два получившихся вектора.

Какой именно из этих трёх пунктов вызывает у Вас затруднения?
0
99 / 46 / 18
Регистрация: 09.08.2015
Сообщений: 367
28.12.2015, 14:17
Цитата Сообщение от Igor3D Посмотреть сообщение
Если никаких сил не приложено, тело движется со своей текущей скоростью сколь угодно долго
Пока пользователь зажал кнопку записывается (отдельно) вектор скорости только от нажатия кнопки, когда пользователь нажимает другую кнопку из реального вектора скорости вычитается тот который записывали.

Добавлено через 2 минуты
хотите плавно, "трите" трением только этот вектор.
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,895
Записей в блоге: 2
28.12.2015, 14:36  [ТС]
Цитата Сообщение от Shamil1 Посмотреть сообщение
2. Домножить один из этих двух векторов на одну константу, а другой - на другую.
А что это за константы и чему они физически соответствуют? Пусть напр одна = 0.5. Скорость по X была напр (100, 0, 0), мы ее гасим на каждом шаге вдвое. А если была (1000, 0, 0) - то и ее тоже вдвое. И вообще - любую вдвое. Уж слишком мощный супер-тормоз Логичнее ожидать что малые скорости погасятся быстрее. А что делает 2-й коэффициент - вообще не понимаю. "Вдоль руля" - надо просто добавлять вектор ускорения, чего ту множить?

Цитата Сообщение от Shamil1 Посмотреть сообщение
3. Сложить два получившихся вектора.
И что мы получили в рез-те этого сложения? В очередной раз напоминаю что выходом должен быть вектор силы (ускорения)

Цитата Сообщение от Shamil1 Посмотреть сообщение
Какой именно из этих трёх пунктов вызывает у Вас затруднения?
Слишком резво
0
Модератор
Эксперт функциональных языков программирования
3136 / 2283 / 469
Регистрация: 26.03.2015
Сообщений: 8,885
28.12.2015, 16:34
Цитата Сообщение от Igor3D Посмотреть сообщение
А что это за константы и чему они физически соответствуют?
Константы соответствуют сопротивлению/трению в двух направлениях. Только не забудьте, что константы должны быть отрицательными, так как сила сопротивления действует в направлении, противоположном скорости.

Цитата Сообщение от Igor3D Посмотреть сообщение
Логичнее ожидать что малые скорости погасятся быстрее.
В том варианте, который я предложил, малые скорости погасятся быстрее.
Я предложил самый простой вариант - сопротивление пропорционально скорости. А если послушать физиков, то нужно брать квадрат скорости.
Но Вы можете выбрать любую другую зависимость, которая Вам понравится. Всё равно физика у Вас намечается слабо похожая на настоящую ("Сила бездействует (ускорение ноль) если проекция скорости на направление силы превышает заданный предел").

Цитата Сообщение от Igor3D Посмотреть сообщение
А что делает 2-й коэффициент - вообще не понимаю. "Вдоль руля" - надо просто добавлять вектор ускорения, чего ту множить?
Вдоль руля тоже есть сопротивление, хотя и гораздо более низкое. Но ничто не мешает Вам задать нулевое сопротивление вдоль руля.

Цитата Сообщение от Igor3D Посмотреть сообщение
И что мы получили в рез-те этого сложения? В очередной раз напоминаю что выходом должен быть вектор силы (ускорения)
Очевидно, сложением двух векторов сил будет вектор силы?

Цитата Сообщение от Igor3D Посмотреть сообщение
Слишком резво
Меняя коэффициент от нуля до бесконечности Вы можете выбирать для "боковой" скорости поведение от "никогда не погасится" до "погасится мгновенно". Также Вы можете выбрать любую другую зависимость вместо линейной.
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,895
Записей в блоге: 2
28.12.2015, 17:42  [ТС]
Цитата Сообщение от Shamil1 Посмотреть сообщение
Всё равно физика у Вас намечается слабо похожая на настоящую ("Сила бездействует (ускорение ноль) если проекция скорости на направление силы превышает заданный предел").
Пример: шофер давит газ, автобус набирает скорость. Нужная скорость достигнута - газ больше не давится. Что здесь "не настоящего"?

Цитата Сообщение от Shamil1 Посмотреть сообщение
Очевидно, сложением двух векторов сил будет вектор силы?
Чего это? Взяли текущий вектор скорости, как-то его изменили, и теперь говорим что это вектор силы (ускорения)?

Пример: скорость была (100, 0, 0) теперь сила (величиной 10 м/c*c) изменила напр-е вверх. Коэффициенты 0.5 и 0. Наверное Вы имели ввиду вектор ускорения (-50, 10, 0). Но это ведь "метры в секунду". При интеграции в скорость (v += a * dt) получится

(100, 0, 0) + (-50, 10, 0) / 30 // текущий шаг движка 30 fps

Во-первых результаты принципиально разные для разных fps, а во-вторых время разворота может оказаться гораздо большим чем желает юзер.
0
Модератор
Эксперт функциональных языков программирования
3136 / 2283 / 469
Регистрация: 26.03.2015
Сообщений: 8,885
28.12.2015, 18:53
Цитата Сообщение от Igor3D Посмотреть сообщение
Взяли текущий вектор скорости, как-то его изменили
Я вектор скорости не менял. Вектор скорости изменяется сам - под воздействием сил, действующих на тело.

Цитата Сообщение от Igor3D Посмотреть сообщение
При интеграции в скорость (v += a * dt) получится
Приблизительно так. Для малых dt.

Цитата Сообщение от Igor3D Посмотреть сообщение
Во-первых результаты принципиально разные для разных fps
Приблизительно одинаковые, если считать приблизительно (скорость изменяется ступенками). Одинаковые, если считать точно (скорость изменяется плавно).

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

Цитата Сообщение от Igor3D Посмотреть сообщение
Пример: шофер давит газ, автобус набирает скорость. Нужная скорость достигнута - газ больше не давится. Что здесь "не настоящего"?
Если это автобус, то он остановится, если газ отпустить. А если это космический корабль, то... выходит у Вас автоматическое отключение двигателя при достижении некой скорости? Тогда можно добавить ещё автоматики, и корабль будет двигаться по любой траектории без всякой физики.
0
99 / 46 / 18
Регистрация: 09.08.2015
Сообщений: 367
28.12.2015, 23:35
Igor3D

F = текущее ускорение
Finput = нормализованный вектор в ту сторону куда должен полететь корабль (например нажал пользователь вправо, вектор вправо)
Fnorm = нормализовать F
Fscale = скалярное ускорение
F = (Fnorm + Finput) * Fscale

В итоге НЛО будет рулить в ту сторону в которую жмет пользователь, скорость руления зависит от набранной скорости и ускорения.

Добавлено через 3 часа 53 минуты
Цитата Сообщение от AncientPenguin Посмотреть сообщение
F = (Fnorm + Finput) * Fscale
F = (Fnorm - Finput) * Fscale
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,895
Записей в блоге: 2
29.12.2015, 15:41  [ТС]
Сила - это вектор ускорения, во всяком случае с точки зрения ее применения. Направление вектора силы может задаваться всяко-разно юзером в зависимости от типа силы и.т.п. А вот модуль (величина) ее в любом случае задается. Пусть юзер задал величину ускорения 10 (тот же исходный пример)

Что мне не нравится в схеме с "трением компоненты" - ее полная "нефизичность". Ускорение 10 - ну какой-то скромный моторчик. Но с др стороны при k = 0.5, v = 100 эта же сила лихо тормозит создавая ускорение минус 50. Что за странный моторчик такой? С др стороны если текущая скорость мала (напр 5) то мы тормозим минус 2.5, хотя "моторчик 10" с гашением такой малой скорости мог бы справиться быстрее.

Не по теме:

Впрочем я уже потерял интерес к обсуждению - не видно ни одной идеи, повторяется одно и то же "множим на коэффициент"

0
99 / 46 / 18
Регистрация: 09.08.2015
Сообщений: 367
29.12.2015, 18:21
Цитата Сообщение от Igor3D Посмотреть сообщение
не видно ни одной идеи
Вас носом ткнуть? Вот:

Цитата Сообщение от AncientPenguin Посмотреть сообщение
F = (Fnorm - Finput) * Fscale
Цитата Сообщение от Igor3D Посмотреть сообщение
повторяется одно и то же "множим на коэффициент"
И где там коэффициент?

Цитата Сообщение от Igor3D Посмотреть сообщение
Предположим так сила прилагается в течение 2 секунд, в рез-те объект приобрел скорость v = (20, 0, 0). Теперь юзер меняет направление силы - она уже действует по Y. Еще через 2 сек v = (20, 20, 0). Это абсолютно корректный рез-т по первому закону Ньютона. НО... он не устраивает юзера. "Чего это объект летит по диагонали? Я силу направил вверх, мне НАДО чтобы он вверх и полетел".
Вот ключевая ошибка "Я силу направил вверх", надо направлять силу так чтобы в результате получилось вверх, а не просто силу вверх. Когда водитель поворачивает направо он в процессе поворота меняет положение руля от и до, а не просто направо джойстик жмет и машина сама вправо едет.
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,895
Записей в блоге: 2
05.01.2016, 12:04  [ТС]
Ладно, попробуем др вещь, из той же оперы, может тут лучше пойдет.

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

Вопрос: что делать при достижении мишени? Не надо связывать это с "давит на клавишу/джойстик" - представим себе напр 100 объектов у каждого из которых свой "target". Как этим удобно управлять, какой ф-ционал дать юзеру? Здесь нет привязки к какой-то одной, конкретной сцене, но есть типовые ситуации которые хотелось бы обсудить.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.01.2016, 12:04
Помогаю со студенческими работами здесь

Сила трения
На горизонтальной поверхности лежит брусок массой m = 0,9 кг . В него попадает пуля массой vo = 12 г, летящая ...

Сила трения
Писал сегодня отборочную олимпиаду по физике при БГУ. И после неё начали спросить с одноклассником нужно ли учитывать силу трения. ...

сила инерции
При аварийном торможении движущегося горизонтально вагона подвешенная на нити гирька массой m = 0.5 кг отклонилась на угол 30° от...

Сила трения
В установке, изображенной на рисунке масса тела, расположенного на наклонной плоскости, равна m1 = 3 кг, гири — m2 = 2 кг, коэффициент...

В чем сила C#?
представилась возможность начать изучать программирование, вернее попробовать себя в профессии программиста, правда перед этим немного...


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

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Новые блоги и статьи
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