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

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

Жанры

Графика DirectX в Delphi

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

Шрифт:

FromX, FromY, FromZ : Single;

AtX, AtY, AtZ : Single;

WorldUpX, WorldUpY, WorldUpZ : Single;

fFOV, fAspect, fNearPlane, fFarPlane : Single;

Инициализируются эти переменные значениями, такими же, как в предыдущих примерах, лишь точка зрения отодвинута на единицу:

procedure TfrmDSD.FormCreate(Sender: TObject);

var

hRet : HRESULT;

begin

hRet := InitD3D;

if Failed (hRet) then ErrorOut (4nitD3D'f hRet);

hRet := InitVB;

if Failed (hRet) then ErrorOut ('InitVertex', hRet);

//

Включаем источники света и инициализируем материалы

SetupLights;

MaterialRed := InitMaterial(1, 0, 0, 1);

MaterialBlue := InitMaterial(0, 0,1, 1);

MaterialGreen := InitMaterial(0, 1, 0, 1) ;

MaterialYellow := InitMaterial(1, 1, 0, 1);

FromX := 0.0; // Вектор "From"

FromY := 0.0;

FromZ := -6.0;

AtX := 0.0; // Вектор "At"

AtY := 0.0;

AtZ := 0.0;

WorldUpX := 0.0; // Вектор "WorldUp"

WorldUpY := 1.0;

WorldUpZ := 0.0;

fFOV := 1.0; // Угол обзора по оси Y

fAspect := 1.0; // Угол обзора по оси X

fNearPlane := 1.0; // Передняя плоскость отсечения

fFarPlane := 20; // Задняя плоскость отсечения

end;

Для повышения красочности на сцене присутствует два источника света:

procedure TfrmDSD.SetupLights;

var

LightO : TD3DLight8;

Lightl : TD3DLight8;

begin

LightO := InitDirectionalLight(D3DVector(-1, -1, -1), 1, 1, 1, 0);

FDSDDevice.SetLight (0, LightO);

Lightl := InitDirectionalLight(D3DVector(0, 0, 1), 1, 1, 1, 0);

FDSDDevice.SetLight (1, Lightl);

FD3DDevice.LightEnable (0, True);

FD3DDevice.LightEnable (1, True);

end;

При воспроизведении объектов сцены параметры матриц вида и проекций опираются на текущие значения управляющих переменных:

procedure TfrmDSD.DrawScene;

var

matView, matProj : TD3DMatrix;

matRotate, matTranslate : TDSDMatrix;

matRotateX, matRotateY : TD3DMatrix;

matScale : TD3DMatrix;

begin

// Цилиндр по оси X

SetRotateZMatrix(matRotate, Pi / 2);

SetTranslateMatrix(matTranslate, 1.0, 0.0, 0.0);

with FD3DDevice do begin

SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);

SetTransform(D3DTS_WORLD, MatrixMul(matTranslate, matRotate));

SetMaterial(MaterialRed); // Красного цвета

DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 50 * 2 - 2);

end;

// Конус стрелки по оси Z

SetRotateYMatrix(matRotate, Pi / 2);

SetTranslateMatrix(matTranslate, 2.0, 0.0, 0.0);

SetScaleMatrix(matScale, 1.0, 0.5, 0.5);

with FDSDDevice do begin

SetTransform(D3DTS_WORLD, MatrixMul(matScale,

MatrixMul(matTranslate, matRotate)));

DrawPrimitive(D3DPT_TRIANGLEFAN, 100, 49); //

Сам конус

DrawPrimitive(D3DPT_TRIANGLEFAN, 151, 50); // Донышко конуса

end;

// Цилиндр по оси Y

SetTranslateMatrix(matTranslate, 0.0, 1.0, 0.0);

with FDSDDevice do begin

SetTransform(D3DTS__WORLD, matTranslate);

SetMaterial(MaterialGreen); // Цвет - зеленый

DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 50 * 2 - 2);

end;

// Конус стрелки по оси Y SetRotateXMatrix(matRotate, -Pi / 2);

SetTranslateMatrix(matTranslate, 0.0, 2.0, 0.0);

SetScaleMatrix(matScale, 0.5, 1.0, 0.5);

with FD3DDevice do begin

SetTransform(D3DTS_WORLD, MatrixMul(matScale,

MatrixMul(matTranslate, matRotate)));

DrawPrimitive(D3DPT_TRIANGLEFAN, 100, 49);

DrawPrimitive(D3DPT_TRIANGLEFAN, 151, 50);

end;

// Цилиндр по оси Z

SetRotateXMatrix(matRotate, Pi / 2) ;

SetTranslateMatrix(matTranslate, 0.0, 0.0, 1.0);

with FD3DDevice do begin

SetTransform(D3DTS_WORLD, MatrixMul(matTranslate, matRotate));

SetMaterial(MaterialBlue); // Синего цвета

DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 50 * 2 - 2);

end;

// Конус стрелки по оси Z

SetTranslateMatrix(matTranslate, 0.0, 0.0, 2.0);

SetScaleMatrix(matScale, 0.5, 0.5, 1.0); with FD3DDevice do begin

SetTransform(D3DTS_WORLD, MatrixMul(matScale, matTranslate));

DrawPrimitive(D3DPT_TRIANGLEFAN, 100, 49);

DrawPrimitive(D3DPT_TRIANGLEFAN, 151, 50);

end;

// Чайник, вращающийся вокруг осей X и Y

SetRotateXMatrix(matRotateX, Angle);

SetRotateYMatrixfmatRotateY, Angle);

SetTranslateMatrix(matTranslate, 0.0, -1.5, 0.0);

SetScaleMatrix(matScale, 0.5, 0.5, 0.5); // Уменьшаем в два раза

with FD3DDevice do begin

SetTransform(D3DTS_WORLD, MatrixMul(matRotateX, MatrixMul(matRotateY, MatrixMul(matScale, matTranslate))));

SetMaterial(MaterialYellow);

// Вершины модели перечисляются против часовой стрелки

SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);

DrawPrimitive(D3DPT_TRIANGLELIST, 100 + 51 * 2, 6322);

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

Сын Тишайшего

Яманов Александр
1. Царь Федя
Фантастика:
попаданцы
альтернативная история
фэнтези
5.20
рейтинг книги
Сын Тишайшего

"Искажающие реальность" Компиляция. Книги 1-14

Атаманов Михаил Александрович
Искажающие реальность
Фантастика:
боевая фантастика
космическая фантастика
киберпанк
рпг
5.00
рейтинг книги
Искажающие реальность Компиляция. Книги 1-14

Школа. Первый пояс

Игнатов Михаил Павлович
2. Путь
Фантастика:
фэнтези
7.67
рейтинг книги
Школа. Первый пояс

Невеста на откуп

Белецкая Наталья
2. Невеста на откуп
Фантастика:
фэнтези
5.83
рейтинг книги
Невеста на откуп

Убивать чтобы жить 2

Бор Жорж
2. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 2

Вперед в прошлое!

Ратманов Денис
1. Вперед в прошлое
Фантастика:
попаданцы
5.00
рейтинг книги
Вперед в прошлое!

Аргумент барона Бронина 4

Ковальчук Олег Валентинович
4. Аргумент барона Бронина
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Аргумент барона Бронина 4

Измена. (Не)любимая жена олигарха

Лаванда Марго
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. (Не)любимая жена олигарха

Измена. Право на обман

Арская Арина
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на обман

Бастард Императора. Том 7

Орлов Андрей Юрьевич
7. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 7

Жаба с кошельком

Донцова Дарья
19. Любительница частного сыска Даша Васильева
Детективы:
иронические детективы
8.26
рейтинг книги
Жаба с кошельком

Бастард Императора. Том 11

Орлов Андрей Юрьевич
11. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 11

Академия чаросвет. Тень

Ярошинская Ольга
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Академия чаросвет. Тень

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

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