Теперь вы имеете возможность следить за движением и вращением твердого тела. Они появляются, когда сторонние силы начинают действовать на тело. Для упрощения будем полагать, что возможны только такие силы: приложенная к телу, сопротивление воздуха, тяжести и пружина.
Приложенная сила — это такая сила, которая действует непосредственно, как, например, сила взрыва, толкание персонажем объекта или любой другой тип силы, не относящийся к перечисленным ранее. Как вы можете представить, сила тяжести притягивает объект вниз (или вверх, если захотите), в то время как сопротивление воздуха замедляет движение твердого тела. Пружинная сила (сила сжатия пружины) используется для присоединения твердых тел друг к другу или какой-нибудь точке трехмерного мира.
Как я замечал в последних двух разделах, для хранения сил используются векторы. Каждая сила определяется направлением приложения силы и величиной прилагаемой силы. Величина силы хранится в виде ускорения (в метрах в секунду3 для объекта массой 1). Для углового вращения это значение измеряется в радианах в секунду. Длина вектора силы определяет величину силы. Так, например, для силы тяжести, которая ускоряет объект приблизительно на 9.8 м/с2 в отрицательном направлении оси у (вниз), принимая во внимание массу, вы можете создать вектор:
D3DXVECTOR3 vecGravity = D3DXVECTOR3(0.0f, -9.8f, 0.0) * Mass;
А как насчет приложенной силы, ускоряющей тело (массой 1) на 10 метров в секунду в положительном направлении оси х?
D3DXVECTOR3 vecApplied = D3DXVECTOR3(10.0f, 0.0f, 0.0f);
А как же вычисляется сопротивление воздуха? Вы определяете сопротивление воздуха не как остальные силы; вместо этого, она создается из другой силы. Я имею ввиду, что сопротивление воздуха противодействующая сила, которая вычисляется умножением скорости тела на небольшое число (отрицательное число, если быть точным). Для моделирования сопротивления воздуха в вашей системе твердых тел вы можете создать два вектора, представляющие собой противодействующие силы. Эти силы используются для замедления движения, вызванного линейной скоростью и угловым моментом.
Положив, что скорость вашего твердого тела хранится в векторе vecVelocity, а угловой момент в vecMomentum, вы можете создать два вектора (силы и момента) для дальнейшего использования.
D3DXVECTOR3 vecLinearDamping = vecVelocity * LinearDamping; D3DXVECTOR3 vecAngularDamping = vecMomentum * AngularDamping;
Вещественные переменные LinearDamping и AngularDamping отрицательны. Чем больше значения этих переменных4, тем большее сопротивление воздуха действует на тело и тем больше оно замедляется. Обычно я использую значения -0.5 и -0.4 для LinearDamping и AngularDamping соответственно.
3. Автор подразумевает, но явно не показывает, что прикладываемая сила определяет ускорение в метрах в секунду за секунду. - Примеч. науч. ред.
4. Очевидно — больше по модулю. - Примеч. науч. ред.
После вычисления векторов, которые представляют силы, противодействующие линейному и вращательному движению, вы можете применять их, как делали это ранее. На самом деле вы можете просто добавить векторы уесЬіпеагБатрщ; и уесА^шагБатрщ; к результирующей силе и суммарному моменту.
Хмм, знаете что? Каким то образом я умудрился пропустить объяснение пружинных сил. Это была не ошибка, просто я хотел отложить их рассмотрение до этого момента, чтобы я мог лучше объяснить их. Пружины соединяют твердые тела между собой, гарантируя, что тела, представляющие собой кости персонажа, соединены между собой в правильных точках.
⇐Обработка движения твердых тел || Оглавление || Соединение твердых тел с помощью пружин⇒