Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Заметка
Библиотека служебной программы D3DX устарела. Вместо этого рекомендуется использовать DirectXMath вместе с этим заголовком из GitHub.
Библиотека служебной программы D3DX предоставляет интерфейс ID3DXMATRIXStack. Он предоставляет механизм, позволяющий переносить матрицы и выходить из стека матрицы. Реализация стека матриц является эффективным способом отслеживания матриц при обходе иерархии преобразования.
Библиотека служебной программы D3DX использует стек матриц для хранения преобразований в виде матриц. Различные методы интерфейса ID3DXMATRIXStack имеют дело с текущей матрицей или матрицей, расположенной поверх стека. Текущую матрицу можно очистить с помощью метода ID3DXMATRIXStack::LoadIdentity. Чтобы явно указать определенную матрицу для загрузки в качестве текущей матрицы преобразования, используйте метод ID3DXMATRIXStack::LoadMatrix. Затем можно вызвать метод ID3DXMATRIXStack::MultMatrix или метод ID3DXMATRIXStack::MultMatrixLocal для умножения текущей матрицы на указанную матрицу.
Метод ID3DXMATRIXStack::P op позволяет вернуться к предыдущей матрице преобразования и методу ID3DXMATRIXStack::P ush добавляет матрицу преобразования в стек.
Отдельные матрицы в стеке матриц представлены как 4x4 однородные матрицы, определенные библиотекой служебной программы D3DX, D3DXMATRIX структурой.
Библиотека служебной программы D3DX предоставляет стек матриц через объект объектной модели компонента (COM).
Реализация иерархии сцен
Стек матриц упрощает построение иерархических моделей, в которых сложные объекты создаются из ряда простых объектов.
Сцена или преобразование, иерархия обычно представлена структурой данных дерева. Каждый узел в структуре данных дерева содержит матрицу. Определенная матрица представляет изменение систем координат с родительского узла на узел. Например, если вы моделируете человеческую руку, можно реализовать иерархию, показанную на следующей схеме.
В этой иерархии матрица тела помещает тело в мир. Матрица UpperArm содержит поворот плеча, матрица LowerArm содержит поворот локтя, а матрица руки содержит поворот запястья. Чтобы определить, где рука относительно мира, вы умножаете все матрицы из тела вниз по руке вместе.
Предыдущая иерархия слишком упрощена, так как каждый узел имеет только один дочерний элемент. Если вы начинаете моделировать руку более подробно, вы, вероятно, добавите пальцы и палец. Каждую цифру можно добавить в иерархию как дочерние элементы руки, как показано на следующей схеме.
Если вы проходите по полному графику руки в порядке глубины в первую очередь — обход по одному пути, как это возможно, прежде чем перейти к следующему пути , чтобы нарисовать сцену, выполните последовательность сегментированной отрисовки. Например, для отрисовки руки и пальцев вы реализуете следующий шаблон.
- Отправьте матрицу Руки в стек матрицы.
- Нарисуйте руку.
- Отправьте матрицу отпечатков в стек матрицы.
- Нарисуйте пальцем.
- Появляется матрица отпечатков из стека.
- Отправьте матрицу пальца 1 в стек матрицы.
- Нарисуйте первый палец.
- Появляется матрица "Палец 1" из стека.
- Отправьте матрицу пальца 2 в стек матрицы. Вы продолжаете работать таким образом, пока не отрисовываются все пальцы и пальцы.
После завершения отрисовки пальцев вы запустите матрицу "Рука" из стека.
Вы можете следовать этому базовому процессу в коде с помощью следующих примеров. При обнаружении узла во время глубокого поиска структуры данных дерева отправьте матрицу в верхнюю часть стека матрицы.
MatrixStack->Push();
MatrixStack->MultMatrix(pNode->matrix);
По завершении работы с узлом появляется матрица в верхней части стека матрицы.
MatrixStack->Pop();
Таким образом, матрица в верхней части стека всегда представляет собой преобразование мира текущего узла. Поэтому перед рисованием каждого узла необходимо задать матрицу Direct3D.
pD3DDevice->SetTransform(D3DTS_WORLDMATRIX(0), *MatrixStack->GetTop());
Дополнительные сведения о конкретных методах, которые можно выполнить в стеке матриц D3DX, см. в справочном разделе ID3DXMATRIXStack.
Связанные разделы