Михаил Краснов - Графика DirectX в Delphi

Здесь есть возможность читать онлайн «Михаил Краснов - Графика DirectX в Delphi» — ознакомительный отрывок электронной книги совершенно бесплатно, а после прочтения отрывка купить полную версию. В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Графика DirectX в Delphi: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Графика DirectX в Delphi»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Графика DirectX в Delphi — читать онлайн ознакомительный отрывок

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Графика DirectX в Delphi», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

for i ;= 49 downto 0 do begin

theta := 2 * Pi * i / 49;

Vertices.X := sin(theta) * radius;

Vertices.Y := -1;

Vertices.Z := cos(theta) * radius;

Vertices.nX := sin(theta);

Vertices.nY := 0;

Vertices.nZ := cos(theta);

Inc(Vertices);

Vertices.X := sin(theta) * radius;

Vertices.Y := 1;

Vertices.Z := cos(theta) * radius;

Vertices.nX := sin(theta);

Vertices.nY := 0;

Vertices.nZ := cos(theta);

Inc(Vertices);

end;

// Вершина конуса

Vertices.X := 0.0;

Vertices.Y := 0.0;

Vertices.Z := 1.0;

Vertices.nX := 0.0;

Vertices.nY := 0.0;

Vertices.nZ := 1.0;

Inc(Vertices) ;

// Треугольники, образующие конус

for i := 0 to 49 do begin

theta := 2 * Pi * i / 49;

Vertices.X := cos(theta);

Vertices.Y := sin(theta);

Vertices.Z := 0.0;

Vertices.nX := cos(theta);

Vertices.nY := sin(theta);

Vertices.nZ := 1.0;

Inc(Vertices);

end;

// Центр донышка конуса

Vertices.X := 0.0;

Vertices.Y := 0.0;

Vertices.Z := 0.0;

Vertices.nX := 0.0;

Vertices.nY := 0.0;

Vertices.nZ := -1.0;

Inc(Vertices);

// Круг, закрывающий конус

for i := 0 to 49 do begin

theta := 2 * Pi * i / 49;

Vertices.X := sin(theta);

Vertices.Y := cos(theta);

Vertices.Z := 0.0;

Vertices.nX := 0.0;

Vertices.nY := 0.0;

Vertices.nZ := -1.0;

Inc(Vertices);

end;

// Считьшаем данные модели из файла

AssignFile (t, 'teapot.txt');

Reset (t) ;

while not EOF(t) do begin

Readln (t, wX); // Нормаль к треугольнику

Readln (t, wY);

Readln (t, wZ) ;

Readln (t, Vertices.X); // Первая вершина треугольника

Readln (t, Vertices.Y);

Readln (t, Vertices.Z);

Vertices.nX := wX;

Vertices.nY := wY;

Vertices.nZ := wZ;

Inc (Vertices);

Readln (t, Vertices.X); // Вторая вершина треугольника

Readln (t, Vertices.Y);

Readln (t, Vertices.Z);

Vertices.nX := wX;

Vertices.nY := wY;

Vertices.nZ := wZ;

Inc (Vertices);

Readln (t, Vertices.X) ; // Последняя вершина треугольника

Readln (t, Vertices.Y);

Readln (t, Vertices.Z);

Vertices.nX := wX;

Vertices.nY := wY;

Vertices.nZ := wZ;

Inc (Vertices); end;

CloseFile (t); Result := FD3DVB.Unlock;

end;

Цилиндр радиуса 0.1 и высотой 2 строится вокруг оси Y, а конус единичной высоты - вокруг оси Z. О том, как получены точки модели, мы поговорим чуть позже, сейчас же я должен сообщить, что вершины треугольников модели перечисляются против часовой стрелки.

Текущие параметры матриц вида и проекций хранятся в следующих переменных:

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));

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Графика DirectX в Delphi»

Представляем Вашему вниманию похожие книги на «Графика DirectX в Delphi» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «Графика DirectX в Delphi»

Обсуждение, отзывы о книге «Графика DirectX в Delphi» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x