Чтение онлайн

на главную - закладки

Жанры

Графика DirectX в Delphi

Краснов Михаил

Шрифт:

Матрицы сдвига по осям X, Y и Z выглядят так:

Если умножить вектор (X, У, Z, W) на матрицу сдвига по оси X, в результате получится вектор (X + W o a, Y, Z, W). Умножение вектора координат всех точек объектов на матрицу сдвига приводит к перемещению объекта по нужной оси.

Три матрицы сдвига можно объединить в одну, дающую возможность осуществлять сдвиг одновременно по нескольким осям. Последняя строка такой матрицы имеет

ненулевые значения в столбцах, соответствующих нужным осям.

Возвращаясь в Direct3D, поясню: у объекта устройства есть метод, позволяющий задать матрицу, на которую будут умножаться векторы координат вершин непосредственно перед отображением в пространстве. И пока в качестве такой матрицы указана матрица сдвига, все воспроизводимые объекты будут сдвигаться в пространстве.

Аналогично сдвигу, операции поворота описываются матрицами. Для поворота на угол а вокруг оси X вектор координат вершины надо умножить на такую матрицу:

Если же надо повернуть на угол (3 вокруг оси Y, то пользуются такой матрицей:

И последняя ситуация с поворотом: угол у, поворот вокруг оси Z:

Чтобы осуществить одновременный поворот по нескольким осям либо скомбинировать поворот и сдвиг, надо применить в качестве трансформаций произведение нужных матриц. При этом важен порядок, в котором мы перемножаем матрицы, он определяет последовательность трансформаций системы координат.

Операции с объектами осуществляются в трехмерном пространстве, описываемом матрицей, которую будем называть мировой матрицей. Помимо мировой матрицы требуется указать видовую матрицу, соответствующую позиции глаза наблюдателя и направлению, в котором он смотрит. В принципе, ее можно задавать точно так же, как и мировую, используя матрицы сдвига и поворота.

Последняя матрица, которая нужна для получения проекции трехмерной сцены на экране, так и называется - матрицей проекции. Значения элементов этой матрицы задают правила, согласно которым будет осуществляться проецирование: положение задней и передней отсекающих плоскостей, искажения, имитирующие перспективу (рис. 9.1).

Объекты, или части объектов, располагающиеся за пределами области видимости, на экран проецироваться не будут, и мы их не увидим.

Итак, мы бросили беглый взгляд на сухой теоретический материал, из которого вынесли тяжелое подозрение, что впереди нас ожидает бурелом кодирования математических формул. Отчасти это правда. Direct3D оставил

программисту тяготы перемножения матриц, ожидая от него три результирующие матрицы трансформаций. Однако мы воспользуемся модулем Dxcutiis, который содержит набор полезных функций. Автор переноса на Delphi кода этих функций указан в заголовке модуля.

В списке подключаемых модулей первого примера этой главы, проекте каталога Ex01, как раз и добавлен указанный модуль. Пример очень простой, в пространстве вращаются два объекта: разноцветный треугольник и желтый квадрат (рис. 9.2).

Чтобы при вращении примитивов мы могли видеть обе их стороны, режим отсечения отключается, а для использования окрашенных примитивов запрещена работа с источником света:

with FDBDDevice do begin

SetRenderState(D3DRS_CULLMODE, D3DCULL_HONE);

SetRenderState(D3DRS_LIGHTING, DWORD (False)); end;

Буфер вершин запирается один раз. Семь вершин содержат координаты треугольника и квадрата. Если бы они выводились не трансформируемыми, то накладывались бы друг на друга:

Vertices.X := 0.0; // Первая вершина треугольника

Vertices.Y := 1.0;

Vertices.Z := 0.0;

Vertices.Color := $00FF0000;

Inc(Vertices);

Vertices.X := 1.0; // Вторая вершина треугольника

Vertices.Y := -1.0;

Vertices.Z := 0.0;

Vertices.Color := $0000FF00;

Inc(Vertices);

Vertices.X := -1.0; // Третья вершина треугольника

Vertices.Y := -1.0;

Vertices.Z := 0.0;

Vertices.Color := $000000FF;

Inc(Vertices);

Vertices.X := -1.0; // Первая вершина квадрата

Vertices.Y := -1.0;

Vertices.Z := 0.0;

Vertices.Color := $00FFFF00;

Inc(Vertices);

Vertices.X := -1.0; // Вторая вершина квадрата

Vertices.Y := 1.0;

Vertices.Z := 0.0;

Vertices.Color := $00FFFF00;

Inc(Vertices);

Vertices.X := 1.0; // Третья вершина квадрата

Vertices.Y := -1.0;

Vertices.Z := 0.0;

Vertices.Color := $00FFFF00;

Inc(Vertices);

Vertices.X := 1.0; // Четвертая вершина квадрата

Vertices.Y := 1.0;

Vertices.Z := 0.0;

Vertices.Color := $00FFFF00;

При каждой перерисовке кадра вызывается процедура:

procedure TfrmD3D.DrawScene;

var

matView, matProj : TDSDMatrix; // Матрицы 4x4

matRotate, matTranslate : TDSDMatrix;

begin

// Получить матрицу поворота вокруг оси X

SetRotateXMatrix(matRotate, Angle); // Матрица сдвига по оси X, на единицу влево

SetTranslateMatrix(matTranslate, -1.0, 0.0, 0.0); // Устанавливаем мировую матрицу трансформаций FDSDDevice.SetTransform(D3DTS_WORLD,

MatrixMul(matRotate, matTranslate)); // Выводится треугольник

Поделиться:
Популярные книги

Стеллар. Трибут

Прокофьев Роман Юрьевич
2. Стеллар
Фантастика:
боевая фантастика
рпг
8.75
рейтинг книги
Стеллар. Трибут

Его огонь горит для меня. Том 2

Муратова Ульяна
2. Мир Карастели
Фантастика:
юмористическая фантастика
5.40
рейтинг книги
Его огонь горит для меня. Том 2

На границе империй. Том 9. Часть 4

INDIGO
17. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 4

Наследник

Кулаков Алексей Иванович
1. Рюрикова кровь
Фантастика:
научная фантастика
попаданцы
альтернативная история
8.69
рейтинг книги
Наследник

Совершенно несекретно

Иванов Дмитрий
15. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Совершенно несекретно

Ваше Сиятельство 2

Моури Эрли
2. Ваше Сиятельство
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Ваше Сиятельство 2

Прометей: каменный век II

Рави Ивар
2. Прометей
Фантастика:
альтернативная история
7.40
рейтинг книги
Прометей: каменный век II

Единственная для темного эльфа 3

Мазарин Ан
3. Мир Верея. Драконья невеста
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Единственная для темного эльфа 3

Жандарм

Семин Никита
1. Жандарм
Фантастика:
попаданцы
альтернативная история
аниме
4.11
рейтинг книги
Жандарм

Долгий путь домой

Русич Антон
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
6.20
рейтинг книги
Долгий путь домой

Прогрессор поневоле

Распопов Дмитрий Викторович
2. Фараон
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Прогрессор поневоле

Наследие Маозари 6

Панежин Евгений
6. Наследие Маозари
Фантастика:
попаданцы
постапокалипсис
рпг
фэнтези
эпическая фантастика
5.00
рейтинг книги
Наследие Маозари 6

Я еще не барон

Дрейк Сириус
1. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я еще не барон

Лолита

Набоков Владимир Владимирович
Проза:
классическая проза
современная проза
8.05
рейтинг книги
Лолита