d3d_transform_set_identity() Устанавливает преобразование в тождество (без преобразования).Поймите, что вращение и масштабирование, которые касаются начала мира, не касаются объекта, который должен быть нарисован. Если объект находиться не в начале, то он может переместиться в другое место - не в то, что нужно. Чтобы, например, вращать объект вокруг своей оси x, мы должны сначала перевести его в начало, затем его вращать и, наконец, перевести его в свою позицию. Необходимы некоторые функции для установки преобразований.
d3d_transform_set_translation(xt,yt,zt) Устанавливает преобразование в перевод над указанным вектором.
d3d_transform_set_scaling(xs,ys,zs) Устанавливает преобразование в масштабирование с указанными суммами.
d3d_transform_set_rotation_x(angle) Устанавливает преобразование во вращение вокруг оси х с указанной суммой.
d3d_transform_set_rotation_y(angle) Устанавливает преобразование во вращение вокруг оси y с указанной суммой.
d3d_transform_set_rotation_z(angle) Устанавливает преобразование во вращение вокруг оси z с указанной суммой.
d3d_transform_set_rotation_axis(xa,ya,za,angle) Устанавливает преобразование во вращение вокруг оси указанного вектора с помощью указанной суммы.
d3d_transform_add_translation(xt,yt,zt) Добавляет перевод над указанным вектором.
d3d_transform_add_scaling(xs,ys,zs) Добавляет масштабирование с указанными суммами.
d3d_transform_add_rotation_x(angle) Добавляет вращение вокруг оси x с указанной суммой.
d3d_transform_add_rotation_y(angle) Добавляет вращение вокруг оси y с указанной суммой.
d3d_transform_add_rotation_z(angle) Добавляет вращение вокруг оси z с указанной суммой.
d3d_transform_add_rotation_axis(xa,ya,za,angle) Добавляет вращение вокруг оси указанного вектора с помощью указанной суммы.
Следующие примеры могут пояснить это подробнее. Допустим, что у Вас есть спрайтspr, который Вы хотите нарисовать в позиции (100,100,10). Для этого Вы можете использовать следующие коды.
{
d3d_transform_set_translation(100,100,10);
draw_sprite(spr,0,0,0);
d3d_transform_set_identity();
}
Отметьте, что поскольку мы используем перевод, то мы должны теперь нарисовать спрайт в позиции (0,0). (Это предполагает, что текущий образец объекта имеет глубину 0! Если Вы не уверены, то устанавливайте первоначальную глубину.) Если мы должны использовать это в своём FPS, то мы не захотим видеть спрайт. Причина в том, что он всё ещё параллелен плоскости xy. Мы захотим вращать его свыше 90 градусов вдоль оси x (или оси y). Итак, нам нужно добавить вращение. Запомните порядок: мы должны сначала вращать спрайт, а затем его перевести. Итак, мы можем использовать следующие коды.
{
d3d_transform_set_identity();
d3d_transform_add_rotation_x(90);
d3d_transform_add_translation(100,100,10);
draw_sprite(spr,0,0,0);
d3d_transform_set_identity();
}
Иногда, Вы захотите временно сохранить текущее преобразование, например, чтобы добавить дополнительное преобразование, а затем восстановить старое (это часто случается при рисовании иерархических моделей). С этой целью Вы можете загрузить текущее преобразование в стек, и позже - выгрузить его из стека, чтобы сделать это текущее преобразование снова. Для этого существуют следующие функции:
d3d_transform_stack_clear() Очищает стек преобразований.
d3d_transform_stack_empty() Возвращает, когда стек преобразования пуст.
d3d_transform_stack_push() Выталкивает текущее преобразование в стек. Возвращает, если преобразование находилось в размещённом стеке, чтобы выгрузить его оттуда (если Вы забываете выгрузить преобразования, то Вы в некоторых моментах можете испытать недостаток памяти для размещаемого стека).
d3d_transform_stack_pop() Выгружает верхнее преобразование из стека и делает его текущим. Возвращает, если было преобразование в стеке.
d3d_transform_stack_top() Делает верхнее преобразование текущим, но не удаляет это из стека. Возвращает, если в стеке произошло преобразование.
d3d_transform_stack_discard() Удаляет верхнее преобразование из стека, но не делает его текущим. Возвращает, если в стеке произошло преобразование.
Использование преобразований является мощным механизмом. Но будьте осторожны и всегда устанавливайте преобразования в тождество, как только Вы их создадите.