Страница 1 из 1

AddForceAtPosition плечо силы

СообщениеДобавлено: 04 апр 2021, 10:16
BlindGuard
Салют, народ. Есть небольшая непонятка по поводу функции 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);
        }


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

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

СообщениеДобавлено: 04 апр 2021, 11:00
1max1
Рычаг же длиннее будет, хоть толкать легче, но расстояние по дуге нужно преодолеть больше. Я за физику не шарю, но вроде бы всё логично.

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

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


Так в том то и дело. Рычаг длиннее, значит результат работы движка больше.
Мы, к примеру, делаем крен влево. Значит левый движок толкает левую часть корабля вниз, а правый движок толкает правую часть корабля наверх, получаем вращение против часовой стрелки. Движения при этом компенсированы, т.к силы равны и точки приложения равноудалены. Но если я правый движок вынесу дальше от центра масс, то засчет того что его плечо больше, он будет активнее толкать правую сторону наверх, чем второй движок толкает левую вниз. Значит у нас вращение будет не совсем адекватным, а главное - корабль будет смещаться - компенсация уже не работает.
Но на деле никакого смещения не происходит, куда бы я не выносил движок. Это вроде не норм.

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

СообщениеДобавлено: 04 апр 2021, 12:16
1max1
Ради эксперимента, приложи большую силу на один движок и посмотри будет ли смещение.

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

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

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

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

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

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


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

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

СообщениеДобавлено: 04 апр 2021, 13:02
1max1
Да, смещение есть.

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

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

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

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

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


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


Конечно смещение будет передано телу и в первом и во втором случае но во втором случае это смещение будет намного меньше а в основном вся сила передастся во вращение, чем больше рычаг тем больше сила смещения стремится к нулю. Сделай простой опыт, у тебя уже есть 2 движка, определи их локальные позиции по центру масс, и при полете смещай один из движков например вправо и ты должен увидеть как начнется вращение и чем дальше от ЦМ тем акцентированее вращение, двигать будет только тот движок который остался у центра масс. Так должно быть в реале, но как движок юнити это смоделирует, хз, но должно быть так.

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

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

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

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

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

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

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

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

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

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

СообщениеДобавлено: 07 апр 2021, 14:46
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. т.е. система будет стабильна, и каждое время Т, равное периоду, будет возвращаться в исходное положение. прирост же силы, за счет увеличения плеча будет тратится на смещение оси вращения. подобную картинку можно наблюдать, если мы будем увеличивать мощьность одного двигателя. и при любых числах, мы ВСЕГДА будем приходить в исходную точку(в зависимости от массы и разницы в силах период и радиус обращения будут смещаться) если хотите чтобы тело начало смещаться, нам нужна сила извне. например потеря массы во внешний мир или толчок другого тела. если интересно, могу листик со своими каракулями показать, как я все это считал...

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

СообщениеДобавлено: 07 апр 2021, 15:48
Alkos26Rus
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 используют для локальной позиции, это не корректно. Фактически получается что приложенная сила осуществляется где то на нулевых координатах сцены со смещением. Эту функцию используют например для реализации взрыва, когда снаряд разорвался в какой то глобальной позиции по отношениию к цели, но не как не в локальной позиции.

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

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

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