Я не хочу бить мертвую лошадь, поэтому я упомяну только те части данных, о которых я не рассказывал ранее. Кроме положения и ориентации кости степень разрешения вращения определяет, насколько ваш меш сохраняет свою начальную форму со временем. Чем меньше значение степени разрешения, тем сильнее может искажаться тело. Чем больше разрешение, тем тело становится устойчивее к искажениям.
Я расскажу о степени разрешения немного позже; а пока, я хочу поговорить о других вещах, таких как вычисление начальной ориентации, размера ограничивающего параллелепипеда каждой кости, локальных точек, формирующих углы ограничивающего параллелепипеда, коэффициента restitution и векторов родительского смещения.
Вы уже читали практически обо всех этих переменных, но я ничего не говорил о вычислении размера ограничивающего параллелепипеда и начальной ориентации каждой кости. Я начну с вычисления ориентации.
Помните, давно, в разделе "Расположение и ориентация твердых тел", я сказал, что можно использовать кватернион для ориентации твердого тела? Если в качестве источника кукольных костей вы используете иерархию фреймов, вам необходимо перейти от матрицы преобразования к кватерниону. Как же это сделать?
Здесь приходит на помощь D3DX! Используя комбинированную матрицу преобразования фрейма, вы можете вызвать функцию D3DXQuatemionRotationMatrix, которая преобразует матрицу в кватернион! Например, у вас есть указатель на фрейм D3DXFRAMEEX pFrame. Для создания кватерниона вы можете использовать следующий код:
// pFrarae = указатель на фрейм
// quatOrientation = результирующий кватернион D3DXQuaternionRotationMatrix(&quatOrientation, \
&m_Frame->matCombined); D3DXQuaternionInverse(&quatOrientation, fcquatOrientation);
Вы заметите, что при преобразовании матрицы в кватернион я добавил вызов функции D3DXQuaternionInverse, которая обращает кватернион. Причиной является то, что кватернионы используют правостороннюю систему координат. Т. к. Direct3D (и мы вместе с ним) использует левостороннюю систему координат, кватернион должен быть соответственно преобразован (обращен).
После того как вы получили начальную ориентацию, с которой можете работать, вы можете вычислить размеры ограничивающего параллелепипеда кости; создайте набор точек, представляющих углы ограничивающего параллелепипеда и точки соединения (точки, присоединяющие кость к родителю); установите массу и коэффициент ограничения; создайте обратный тензор инерции. Исходный код, о котором я говорю, находится в функции cRagdoll::Create. Пожалуйста, проконсультируйтесь с подробно комментированным исходным кодом, чтобы увидеть, как устанавливаются соответствующие данные при создании кукольных костей.
А пока что позвольте мне объяснить, как вычислять размеры ограничивающих параллелепипедов.
⇐Создание класса управления куклой || Оглавление || Вычисление ограничивающего параллелепипеда кости⇒