Давно хотел сделать свою леталку, раньше тестировал всякие механики по ленивому через физический движок, там и делать то особо нечего тупа добавляешь силу торка и оно само крутится.
Немного погуглив выяснил что такой способ не самый прямой и раньше делали без физдвижков, т.е. писали свои какие то вычисления. Хочется запрототипировать что то похожее на анриле/на юнити и накопился ряд вопросов.
Делают ли свою физику для этого ?
Как выводить эти все формулы ?
Эти формулы вычисляются каждый кадр ?
Надо ли писать свой класс кватерниона или всё проще ?
В юнити можно поворачивать объекты разными методами, но вроде всё сводится к высчитыванию кватерниона. Поворот градусах/с или его сила или момент(пока не уверен) задаётся по осям.
По идее должны быть старые книги по gamedev на эту тему, может есть что ?
Резерв для ссылок
Нашёл онлайн калькуляор от микрософт https://math.microsoft.com/en
В летальных (да и по сути в любых) физиках обычно есть 2 основных вектора: force и torque.
По ним вычисляются линейная и угловая, скорости и позиции. Т.е. делать тоже почти ничего не надо.
Про кватернионы, и другие недосформированные вопросы гадать (что ты имел ввиду) не стану.
Угол поворота руля и ускорение.
// steering angle driven movement
angle = angle + steering_angle * steering_factor;
dir = {cos(angle), sin(angle)};
vel = vel + accel * dt * dt * 0.5f;
pos = pos + vel * dt * dir;
rot = angle;
fake.pdf
> angle = angle + steering_angle * steering_factor;
вот что то похожее на это видел, только там был торк по осям, сопротивление и инерция
torque переводят как крутящий момент, из него можно получить градусы в секунду/радианы не уверен что лучше в игровых движках видел и то и то.
т.е. всё же мне нужна какая то простая физика
На яв, пич, ролл перепиши и всё. steering_factor это угол наклона стика (множитель). steering_angle это константный угол. Чем сильнее заваливается стик, тем сильнее поворот по этой оси.
fake.pdf
> угол наклона стика
Я забыл уточнить что у меня стик не планируется, и проект тупо по фану в основном, мб в конкурс войти если успею, не решил ещё.
Будет множитель от мышиных координат в окне относительно центра окна, или может как то ещё переделаю.
Наверное надо переносить тему в физику потому что я хочу именно физику без коллизий, и без ничего от физ движка, но с симуляцией инерции, сопротивления, мб ещё массы. Получается, что расчет выходит не от угла, а от силы как в физдвижке и на его основе вычисляется уже угол.
Гуглю что же такое аксель
В физике: постепенное увеличение скорости при движении какого либо тела, вследствие беспрестанного действия на него посторонней силы. Словарь иностранных слов, вошедших в состав русского языка. Чудинов А.Н., 1910
Из курса физики 9 класса известно, что движение бывает равномерным и неравномерным. При неравномерном движении за равные промежутки времени материальная точка проходит разные расстояния, мгновенная скорость её движения также изменяется. Мера быстроты изменения скорости называется ускорением.
Формулу ускорения легко получить, если учесть, что скорость — это быстрота изменения координаты, а ускорение — это быстрота изменения скорости:
a→=v→–v0→ta→=v→–v0→t\overrightarrow a={\overrightarrow v – \overrightarrow {v_0} \over t}
где:
a→a→\overrightarrow a — вектор ускорения;
v0→v0→\overrightarrow {v_0} — вектор начальной скорости;
v→v→\overrightarrow v — вектор скорости в момент времени ttt;
ttt — время изменения скорости от v0→v0→\overrightarrow {v_0} до v→v→\overrightarrow v.
так это всё же сила или не сила, по идее сила ))
Нет, ускорение — это не сила , ускорение — это результат силы, приложенной к объекту. Второй закон движения Ньютона позволяет нам рассчитать величину ускорения, возникающего в результате приложенной силы, используя следующее уравнение: a = F m. a = ускорение, в метрах в секунду в квадрате (м/с 2 )
Про импульс что бы не перепутать
Импульсом (количеством движения) тела называют физическую векторную величину, являющуюся количественной характеристикой поступательного движения тел. Импульс обозначается р. Импульс тела равен произведению массы тела на его скорость,
Значит мы прикладываем не аксел, а именно силу крутящего момента ? Или это всё же акселерация ?
В простом виде:
3. Каждый шаг физики (Единицу времени) к позиции добавляется скорость (velocity)
position += velocity; rotation += torque; // вращение аналогично
2. Перед вычислением новой позиции вычисляется новое ускорение: к скорости прибавляется ускорение
velocity += acceleration; // Или с учетом массы: velocity += acceleration / mass;
1. Само ускорение является суммой всех сил (forces), воздействующих на тело
let acceleration = 0; acceleration += force_1; acceleration += force_2; acceleration += force_3;
0. А силы уже берутся из воздуха, гравитаций, мидихлориан, и вкусного покушать.
timchin
> rotation.z += 45;
не, такое не годится, потому что поворот должен иметь инерцию.
endeavour_pr
> rotation.z += 45;
только в качестве примера. Разумеется, нужно применять все предыдущие 4 пункта. Уточнение про вращение добавлено из необходимости акцентировать внимание на том, что работа с поворотами может быть запутанной, но зачастую движки предлагают простые в обращении обертки.
also.
Описания сил, скоростей, и прочих физических штук действительно сложны, особенно при учете всех параметров, которые воздействуют на тело в реальном мире.
В симуляции же можно создавать очень простые модели.
Простейший код, вращающий тело по оси z:
rotation.z += torque.z;
Теперь меняем torque:
torque.z += mouse_speed;
... и вы восхитительны.
timchin
Если ты такое не реализовывал тогда забей, ничем не поможешь только шуму наделаешь.
timchin
> Уточнение про вращение добавлено из необходимости акцентировать внимание на том, что работа с поворотами может быть запутанной, но зачастую движки предлагают простые в обращении обертки.
За частую, там используется класс кватерниона, в анриле и в юнити так, во многих других так же. На выходе из формул можно посчитать градус или радиан и применить его для вычисления кватерниона, там да сложно по этому я не знаю надо ли его переписывать что бы оптимизировать матоперации, но пока речь про то как посчитать физику так что бы на входе были силы, а на выходе поворот, пока так для упрощения абстракции.
endeavour_pr
> На выходе из формул можно посчитать градус или радиан и применить его для вычисления кватерниона, там да сложно
Если все тела сферически симметричны (или в случае 2D), то там все аналогично перемещению: суммируешь угловое ускорение, умножаешь на dt, делишь на момент инерции (который в сферическом случае скаляр) и переводишь в кватернион поворота. Для тел с произвольной геометрией, там да, гораздо сложнее, качественно реализовать эффект Джанибекова не так просто.
Раз никто лучше в треде не предложил, вот мой вариант:
struct rotational_state { vec3 local_inertia_moment; vec3 world_rotational_moment; quat orientation; void tick(vec3 world_torque, float dt) { world_rotational_moment += dt * world_torque; vec3 local_rotational_moment = orientation.inverse( ) * world_rotational_moment; vec3 local_angular_velocity = local_rotational_moment / local_inertia_moment; vec3 axis = local_angular_velocity.norm( ); float angle = dt * local_angular_velocity.length( ); orientation = quat::aa( axis, angle) * orientation; } };
Моё личное прозрение того эффекта возникло, когда я осознал — момент импульса, по закону сохранения, в мировых координатах всегда постоянный; а вот момент инерции — "проворачивается" вместе с телом, и из-за этого вектор угловой скорости, в мировых координатах, будет меняться вслед за ним.
}:+()___ [Smile]
> Если все тела сферически симметричны
3D, симметрично
Имбирная Ведьмочка
Спасибо, позже надо будет все коды посмотреть, сравнить и вникнуть, а то у меня там ещё есть другие
Тема в архиве.