AddForceAtPosition плечо силы

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

AddForceAtPosition плечо силы

Сообщение BlindGuard 04 апр 2021, 10:16

Салют, народ. Есть небольшая непонятка по поводу функции AddForceAtPosition.
Пишу скрипт управления маневровыми кораблями космического корабля. У меня есть родительский объект (пока что коробка) и дочерние ему пустые объекты (положения движков) с которых я беру transform.position. Установлены они на одном расстоянии от центра корабля, строго друг на против друга. Ну и смотрят локальной y осью в противоположные стороны. Код такой:

Синтаксис:
Используется csharp
 private void FixedUpdate()
    {
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            rb.AddForceAtPosition(thruster1.transform.up, thruster1.transform.position);
            rb.AddForceAtPosition(thruster2.transform.up, thruster2.transform.position);
        }


Все ок, корабль делает крен, движения никакого нет, только вращение (т.к двигатели одинаковы по силе и находятся строго друг напротив друга, следовательно моменты их сил равны). Но если я переношу один движок дальше от центра корабля, по логике момент его силы растет, и он должен толкать корабль активнее, следовательно должна происходить расбалансировка и корабль должен мало того что неадекватно вращаться, так еще и двигаться в какую-то сторону, но этого не происходит. Что я делаю не так?
Лучше без точно сформулированной цели двигаться вперед, чем без цели стоять на месте, и уж наверняка гораздо лучше, чем без цели пятиться. (с) Эмиель Регис Рогеллек Терзиефф-Годфрой
Аватара пользователя
BlindGuard
UNец
 
Сообщения: 17
Зарегистрирован: 15 ноя 2011, 21:54

Re: AddForceAtPosition плечо силы

Сообщение 1max1 04 апр 2021, 11:00

Рычаг же длиннее будет, хоть толкать легче, но расстояние по дуге нужно преодолеть больше. Я за физику не шарю, но вроде бы всё логично.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: AddForceAtPosition плечо силы

Сообщение BlindGuard 04 апр 2021, 11:47

1max1 писал(а):Рычаг же длиннее будет, хоть толкать легче, но расстояние по дуге нужно преодолеть больше. Я за физику не шарю, но вроде бы всё логично.


Так в том то и дело. Рычаг длиннее, значит результат работы движка больше.
Мы, к примеру, делаем крен влево. Значит левый движок толкает левую часть корабля вниз, а правый движок толкает правую часть корабля наверх, получаем вращение против часовой стрелки. Движения при этом компенсированы, т.к силы равны и точки приложения равноудалены. Но если я правый движок вынесу дальше от центра масс, то засчет того что его плечо больше, он будет активнее толкать правую сторону наверх, чем второй движок толкает левую вниз. Значит у нас вращение будет не совсем адекватным, а главное - корабль будет смещаться - компенсация уже не работает.
Но на деле никакого смещения не происходит, куда бы я не выносил движок. Это вроде не норм.
Лучше без точно сформулированной цели двигаться вперед, чем без цели стоять на месте, и уж наверняка гораздо лучше, чем без цели пятиться. (с) Эмиель Регис Рогеллек Терзиефф-Годфрой
Аватара пользователя
BlindGuard
UNец
 
Сообщения: 17
Зарегистрирован: 15 ноя 2011, 21:54

Re: AddForceAtPosition плечо силы

Сообщение 1max1 04 апр 2021, 12:16

Ради эксперимента, приложи большую силу на один движок и посмотри будет ли смещение.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: AddForceAtPosition плечо силы

Сообщение waruiyume 04 апр 2021, 12:26

Чем дальше от центра масс приложена сила, тем больше энергии преобразуется во вращение, а не движение.
Я хз какими формулами это описывается, но очень просто подтверждается экспериментом: в первый раз: ударьте длинный, падающий предмет в центр масс, а во второй: потом по его краю.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: AddForceAtPosition плечо силы

Сообщение BlindGuard 04 апр 2021, 12:47

1max1 писал(а):Ради эксперимента, приложи большую силу на один движок и посмотри будет ли смещение.

Да, смещение есть.

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


Не совсем уловил суть. В первом случае вращения не будет, во втором оно будет т.к у вас нет удара в равноудаленную точку с противоположной стороны. Смещение будет передано телу и в первом и во втором случае.
Я делал эксперимент в движке по-другому: брал продолговатый предмет, вешал на него rigidbody и выключал гравитацию. Добавлял сферы с левой и правой сторон от объекта (одну снизу, другую сверху). Размещал их равноудаленно от центра объекта, и бил ими в наш предмет. В случае одинакового расстояния от центра масс - движения небыло, только вращение. В случае разного расстояния - было и вращение и движение.
А вот при подобной ситуации, с исп. функции addforceatposition - так не работает
Лучше без точно сформулированной цели двигаться вперед, чем без цели стоять на месте, и уж наверняка гораздо лучше, чем без цели пятиться. (с) Эмиель Регис Рогеллек Терзиефф-Годфрой
Аватара пользователя
BlindGuard
UNец
 
Сообщения: 17
Зарегистрирован: 15 ноя 2011, 21:54

Re: AddForceAtPosition плечо силы

Сообщение 1max1 04 апр 2021, 13:02

Да, смещение есть.

Значит так работает физика...
Как я уже сказал, это логично. Приведу пример с ключом и гайкой, допустим ты крутишь гайку обычным ключом на 12, прикладываешь туда условно 100 ед. силы и за 1 секунду гайка делает полный оборот, длина окружности оборота равна 2 * PI * длина ключа. Соответственно теперь берем ключ, у которого длина 2 метра (условно), прикладываем туже силу, гайка крутится легче, но длина оборота уже больше, при этом скорость вращения не будет меняться, что там 1 секунда на оборот, что здесь.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: AddForceAtPosition плечо силы

Сообщение Alkos26Rus 04 апр 2021, 13:36

BlindGuard писал(а):
1max1 писал(а):Ради эксперимента, приложи большую силу на один движок и посмотри будет ли смещение.

Да, смещение есть.

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


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


Конечно смещение будет передано телу и в первом и во втором случае но во втором случае это смещение будет намного меньше а в основном вся сила передастся во вращение, чем больше рычаг тем больше сила смещения стремится к нулю. Сделай простой опыт, у тебя уже есть 2 движка, определи их локальные позиции по центру масс, и при полете смещай один из движков например вправо и ты должен увидеть как начнется вращение и чем дальше от ЦМ тем акцентированее вращение, двигать будет только тот движок который остался у центра масс. Так должно быть в реале, но как движок юнити это смоделирует, хз, но должно быть так.
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1642
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: AddForceAtPosition плечо силы

Сообщение TeslaGan 04 апр 2021, 19:09

человек все правильно говорит. возьмем 2 рычага. сила воздействия будет одинаковая по значению, но разная по направлению. в результате перемещения тела не будет, т.к. левый рычаг будет уравновешивать правый. помимо силы, у нас есть момент силы. и он как раз вращает тело. когда же плечи рычагов отличаются, у нас ось вращения сместится в сторону длинного плеча(из-за момента силы). силы рычагов при этом так же не будут уравновешены. в итоге наша система должна будет перемещаться спирально в сторону поворачиваясь вокруг новой оси вращения(пример такой спирали - как люди расписывают ручку). если прям совсем все строго надо. могу сделать расчеты.
по факту, если спирального перемещения нету, сделайте лог значений, что дают ваши двигатели
TeslaGan
UNITрон
 
Сообщения: 315
Зарегистрирован: 01 авг 2015, 18:00

Re: AddForceAtPosition плечо силы

Сообщение BlindGuard 04 апр 2021, 23:49

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

Сори, но основываясь на чем вы написали что ось вращения обеъкта будет смещаться? Мы рассматриваем однородный предмет в невесомости, его осью вращения (мы сейчас говорим только о вращении, без перемещения) будет центр масс, какие бы силы небыли приложены. Но в остальном с вашим видением солидарен - если рычаги не уравновешены, должно наблюдаться и вращение, и перемещение. При использовании addforceatposition перемещения при таких вводных нет. Буду за рабочей машиной - постараюсь выложить ролик/схему.
Лучше без точно сформулированной цели двигаться вперед, чем без цели стоять на месте, и уж наверняка гораздо лучше, чем без цели пятиться. (с) Эмиель Регис Рогеллек Терзиефф-Годфрой
Аватара пользователя
BlindGuard
UNец
 
Сообщения: 17
Зарегистрирован: 15 ноя 2011, 21:54

Re: AddForceAtPosition плечо силы

Сообщение TeslaGan 05 апр 2021, 10:21

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

ну как же. у вас моменты отличаются. честно, до конца не помню, пускай мы и решали подобные задачи, но было это в 2009г в универе... у нас есть 2 точки: центр масс и центр моментов сил. т.к. плечи отличаются, значит цмс сместится. т.к. тело однородно - ось вращения сместится в сторону цмс(но не помню какое отношение)...
p.s. по такой же механике у нас корабли не переворачиваются. есть 2 силы: одна - сила тяготения, она прикладывается к центру масс, который смещен вниз из-за киля. вторая - сила архимеда, которая прикладывается к центру объема, выталкиваемого объекта. одна тянет корабль вниз, вторая - наверх. точка вращения при этом будет где-то между.

p.p.s. пока писал сообщение выше вспомнил термин центр момента инерции(или что-то подобное)... вокруг которого наше тело и будет вращаться. пример: маятник. мы его можем описать уравнениям, и если напишем все силы действующие на систему, окажется что центр момента инерции совпадает с точкой подвеса
TeslaGan
UNITрон
 
Сообщения: 315
Зарегистрирован: 01 авг 2015, 18:00

Re: AddForceAtPosition плечо силы

Сообщение TeslaGan 07 апр 2021, 14:46

сегодня решил проверить модель в юнити. м.б. оказало влияние что вы использовали глобальные координаты, а не локальные.
Синтаксис:
Используется csharp
    public Rigidbody target;

    public Transform truster1;
    public Transform truster2;
    float speed = 10;
    void FixedUpdate()
    {
        target.AddForceAtPosition(new Vector3(0, 0, speed), truster1.localPosition);
        target.AddForceAtPosition(new Vector3(0, 0, -speed), truster2.localPosition);
    }

вращается она правильно. все работает как надо, вращается вокруг оси, которая сместилась, из-за смещения одного плеча и не улетает. и тут становится понятно, что физику надо повторять. решил проверить почему же так, решил задачку по старинке, на листочке, и... у нас движение имеет цикличность. разложим силы на оси x и z(по y будет 0). половину периода сила сонаправлена с осью, половину - противоположна. если проинтегрировать суммы сил по времени, станет понятно что в результате мы получим 0. т.е. система будет стабильна, и каждое время Т, равное периоду, будет возвращаться в исходное положение. прирост же силы, за счет увеличения плеча будет тратится на смещение оси вращения. подобную картинку можно наблюдать, если мы будем увеличивать мощьность одного двигателя. и при любых числах, мы ВСЕГДА будем приходить в исходную точку(в зависимости от массы и разницы в силах период и радиус обращения будут смещаться) если хотите чтобы тело начало смещаться, нам нужна сила извне. например потеря массы во внешний мир или толчок другого тела. если интересно, могу листик со своими каракулями показать, как я все это считал...
TeslaGan
UNITрон
 
Сообщения: 315
Зарегистрирован: 01 авг 2015, 18:00

Re: AddForceAtPosition плечо силы

Сообщение Alkos26Rus 07 апр 2021, 15:48

TeslaGan писал(а):сегодня решил проверить модель в юнити. м.б. оказало влияние что вы использовали глобальные координаты, а не локальные.
Синтаксис:
Используется csharp
    public Rigidbody target;

    public Transform truster1;
    public Transform truster2;
    float speed = 10;
    void FixedUpdate()
    {
        target.AddForceAtPosition(new Vector3(0, 0, speed), truster1.localPosition);
        target.AddForceAtPosition(new Vector3(0, 0, -speed), truster2.localPosition);
    }

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

Первый раз вижу что AddForceAtPosition используют для локальной позиции, это не корректно. Фактически получается что приложенная сила осуществляется где то на нулевых координатах сцены со смещением. Эту функцию используют например для реализации взрыва, когда снаряд разорвался в какой то глобальной позиции по отношениию к цели, но не как не в локальной позиции.
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1642
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: AddForceAtPosition плечо силы

Сообщение TeslaGan 07 апр 2021, 16:11

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

действительно. интуиция подсказывала что эта функция должна была давать точку приложения силы. теперь буду знать.
в любом случае все считалось на основе сферического коня. на основе численных методов...
TeslaGan
UNITрон
 
Сообщения: 315
Зарегистрирован: 01 авг 2015, 18:00


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 32