C++ (Qt)float brakeInertia = ... // величина "гашения" задаваемая юзеромvec3 force = ... // текущий вектор силы задаваемый юзеромvec3 cur_speed = body->getLinearSpeed(); // текущая скорость объекта // вектор силы инерции (синий = черный - зеленый)vec3 interia = cur_speed - force * dot(cur_speed, force) / force.lengthSquare(); // применяем brakeInteria if (brakeInertia > inertia.length()) // полное подавление interia = -interia;else inertia = -interia.normalized() * brakeInteria; // частичное подавление
C++ (Qt)float brakeInertia = ... // величина "гашения" задаваемая юзером // сила // мощность (работа в единицу времени) // процент от величины ... // ??? vec3 force = ... // текущий вектор силы задаваемый юзером // здесь должен быть суммарный вектор всех сил, действующих на объект // с учетом сил тяжести и т.п. vec3 cur_speed = body->getLinearSpeed(); // текущая скорость объекта // m*v^2/2 - кинематическая энергия // вектор силы инерции (синий = черный - зеленый)vec3 interia = cur_speed - force * dot(cur_speed, force) / force.lengthSquare(); // это всё-таки составляющая вектора скорости, никак не сила // применяем brakeInteria if (brakeInertia > inertia.length()) // полное подавление interia = -interia;else inertia = -interia.normalized() * brakeInteria; // частичное подавление // что здесь происходит - совсем не ясно // здесь считается дополнительная сила? // что значит полное подавление? // наверное, должно быть как-то так: // если brakeInteria дополнительная сила vec3 demp_force = -interia.normalized() * brakeInteria; // если brakeInteria процент от действующей силы (0..100) vec3 demp_force = -interia.normalized() * brakeInteria * force.lenght() / 100; // общая сила, действующая на объект vec3 total_force = force + demp_force; // далее считаем кинематические характеристики на следующем шаге // если brakeInteria мощность, то компонента скорости перпендикулярная действию силы // на следующем шаге по времени, исходя из закона сохранения энергии, будет равна float under_root = interia.lengthSquare() - 2 / M * brakeInteria * dt // M - масса объекта, dt - шаг по времени vec3 orthogonal_velocity = under_root >= 0 : interia.normalized() * sqrt( under_root ); : -interia.normalized() * sqrt( -under_root );
C++ (Qt)float brakeInertia = ... // величина "гашения" задаваемая юзером
C++ (Qt)brakeInertia = user_value * dt;
C++ (Qt)vec3 a = inertia / dt;
C++ (Qt)vec3 F = body->getMass() * a;
C++ (Qt)body->m_linearSpeed += body->m_force / body->getMass() * dt;