Читаем Графика DirectX в Delphi полностью

Vertices.normVector := Land[x, у - 1].VecNormal;

Vertices.Color := Land[x, у - 1].Color;

Inc (Vertices);

Vertices.X := x * Step;

Vertices.Y := Landfx, y].h;

Vertices.Z := у * Step;

Vertices.normVector := Land[x, y].VecNormal;

Vertices.Color := Landfx, y].Color;

Inc (Vertices);

Vertices.X := (x + 1) * Step;

Vertices.Y := Landfx + 1, у - 1].h;

Vertices.Z := (y - 1) * Step;

Vertices.normVector := Land[x + 1, у - 1].VecNormal;

Vertices.Color := Land[x + 1, у - 1].Color;

Inc (Vertices);

Vertices.X := (x + 1) * Step;

Vertices.Y := Land[x +1, y].h;

Vertices.Z := у * Step;

Vertices.normVector := Land[x + 1, y].VecNormal;

Vertices.Color := Land[x + 1, y].Color;

FD3DVB.Unlock;

FD3DDevice.DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2) ;

end;


function TfrmD3D.Render : HRESULT;

var

hRet : HRESULT;

i, j :Integer;

begin

// Экран окрашивается голубоватым цветом

FD3DDevice.Clear(0, nil, D3DCLEARJTARGET or D3DCLEAR_ZBUFFER,

$00000FFF, 1.0, 0);

FD3DDevice.BeginScene; with FD3DDevice do begin

SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);

// Треугольники ландшафта перечисляются по часовой стрелке

SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);

// Вершины ландшафта сгенерированы в мировой системе координат

SetTransform(D3DTS_WORLD, IdentityMatrix);

end;


// Выводим квадратики ландшафта

for j := 2 to NumZ - 1 do

for i := 1 to NumX - 5 do DrawArea(i,j);

with FD3DDevice do begin

// Устанавливается матрица трансформаций самолета

SetTransform(D3DTS_WORLD, matAirplan);

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

SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);

// Данные располагаются, начиная с четвертой вершины

DrawPrimitive(D3DPT_TRIANGLELIST, 4, 20661 div 3);

end;


FD3DDevice.EndScene;

Result := FDSDDevice.Present(nil, nil, 0, nil) ;

end;


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

При каждой перерисовке кадра ландшафт циклически сдвигается, а самолет поворачивается вокруг своей оси на небольшой угол:


procedure MoveLand; // Циклическое движение пейзажа

var

i, j : Integer;

TempLand : array [l..NumX] of LandParam; // Вспомогательный массив begin

// Запомнили строку массива ландшафта

for i := 1 to NuraX do TempLand[i] := Land[i,NumZ];

// Сдвигаем ландшафт

for j := NumZ downto 2 do

for i := 1 to NumX do Land[i,j] := Landfi,j-1]; // Круговое появление последней строки массива

for i := 1 to NumX do Land[i,l] := TempLand[i];

end;


procedure TfrmDSD.ApplicationEventslIdle(Sender: TObject;

var Done: Boolean);

var

matWrk : TD3DMatrix;

begin

if FActive then begin

Render; // Нарисовали кадр

MoveLand; // Передвинули ландшафт

SetRotateYMatrix(matWrk, 0.1); // Матрица для небольшого поворота

matAirplan := MatrixMul (matAirplan, matWrk); // Поворот самолета

end;


Done := False;

end;


Для оптимизации в коде программы я матрицу поворота вычисляю один раз.

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

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

Пример проекта каталога Ех09 подсказывает возможное решение. Здесь на фоне того же ландшафта, что и в предыдущем примере, гордо парит орел (рис. 9.10).





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


type

TCUSTOMVERTEXLand = packed record

X, Y, Z : Single;

normVector : TD3DVector;

Color : DWORD;

end;


TCUSTOMVERTEXEagle = packed record

X, Y, Z :


Single;

normVector : TD3DVector;

end;


const

D3DFVF_CUSTOMVERTEXLand = D3DFVF_XYZ or D3DFVF_NORMAL or

D3DFVFJJIFFUSE; D3DFVF CUSTOMVERTEXEagle = D3DFVF_XYZ or D3DFVF_NORMAL;

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

Особое внимание мы должны обратить на то, как в этом примере заполняется буфер вершин модели. Рекомендованная мною импортирующая программа в качестве одного из форматов позволяет использовать код на языке C++. Для подготовки этого примера я результирующий файл преобразовал в код на языке Pascal. Это совершенно не сложно, поскольку большая его часть представляет собой массивы данных. Только имя массива, содержащего данные вершин, пришлось изменить на Avertices, чтобы не появилось конфликтов с переменной Vertices.

Перейти на страницу:

Похожие книги

C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных
Adobe InDesign CS3
Adobe InDesign CS3

Книга посвящена верстке и макетированию в программе Adobe InDesign CS3. Помимо того что в ней описываются возможности программы, рассматриваются также принципы и традиции верстки, приводятся примеры решения типичных задач. Все это позволит читателю не только овладеть богатым инструментарием программы, но и грамотно применять его.Материал книги разделен на логические части: теоретические сведения, инструментарий программы, решение задач, – а также рассчитан на два уровня подготовки читателей – начинающих и опытных пользователей, что выгодно отличает книгу от других изданий. Это позволит применять ее как новичкам для знакомства с программой, так и пользователям со стажем для пополнения своих знаний.

Владимир Гавриилович Завгородний , Владимир Завгородний

Программирование, программы, базы данных / Программное обеспечение / Книги по IT