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

Продолжим рассмотрение нашего примера с вращающимся кубом. В нем еще остались некоторые новые для нас вещи. Рисуемые примитивы накладываются друг на друга в том порядке, в котором они воспроизводятся: нарисованные позже лежат поверх созданных ранее. Это хорошо для двумерных построений, но при переходе в ЗD-пространство нам приходится беспокоиться о том, чтобы положения объектов передавались правильно: более удаленные от глаза наблюдателя объекты могут заслонять воспроизведенные позже, но располагающиеся ближе к камере. Графическая система предлагает решение в виде использования буфера глубины - вспомогательного экрана, предназначенного только для сортировки объектов, располагающихся в пространстве. При подключении этого буфера воспроизведение осуществляется дважды: первый раз в буфер записывается информация о значении расстояния от камеры до точки, второй раз в буфер кадра помещаются данные только о точках, действительно видимых и не заслоняемых другими точками.

Другое название буфера глубины - Z-буфер.

При инициализации Direct3D надо указать, что будет использоваться буфер глубины, и задать его формат. Обычно используется 16-битный формат:

with d3dpp do begin

Windowed := True;

SwapEffect := D3DSWAPEFFECT_DISCARD;

BackBufferFormat := dSddm.Format;

// Будет использоваться буфер глубины

EnableAutoDepthStencil := True;

AutoDepthStencilFormat := D3DFMT_D16; // 16-битный формат

end;

Размеры буфера глубины будут автоматически определяться системой при каждом изменении размеров окна.

При очередной перерисовке кадра теперь должен очищаться не только буфер кадра, но и подключенный буфер глубины. Предпоследний параметр метода clear объекта устройства - значение, которым заполняется буфер глубины. Этим значением должна быть единица, фон экрана бесконечно удален в пространстве:

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

$00FFFFFF, 1.0, 0) ;

Для разрешения работы с буфером глубины надо также задать положительный флаг для соответствующего режима:

SetRenderState(D3DRS_ZENABLE, D3DZBJTRUE);

Флагом для этого состояния может быть и обычная булева константа.

Сейчас нам необходимо перейти к следующему примеру, проекту каталога Ех03, после его запуска на экране появляется вращающийся чайник и стрелки осей координат (рис. 9.4).

Буфер вершин заполняется данными для трех трехмерных объектов: цилиндра, конуса и чайника:

function TfrmD3D.InitVB : HRESULT;

const

radius =0.1; // Радиус цилиндра

var

Vertices : ^TCustomVertex;

hRet : HRESULT;

theta : Single;

i : Integer;

t : TextFile; // Данные модели хранятся в текстовом файле

wX, wY, wZ : Single;

egin hRet := FD3DDevice.CreateVertexBuffer((100 + 51 * 2 + 6322 * 3) *

SizeOf(TCustomVertex), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, FD3DVB);

if Failed(hRet) then begin

Result := hRet;

Exit;

end;

hRet := FDSDDevice.SetStreamSource(0, FD3DVB, SizeOf(TCustomVertex));

if Failed(hRet) then begin

Result := hRet;

Exit;

end;

hRet := FD3DDevice.SetVertexShader(D3DFVF_CUSTOMVERTEX);

if Failed(hRet) then begin

Result := hRet;

Exit; end; hRet := FD3DVB.Lock(0, (100 + 51 * 2 + 6322 * 3)*

SizeOf(TCustomVertex), PByte(Vertices), 0);

if Failed(hRet) then begin

Result := hRet;

Exit;

end;

// 100 вершин цилиндра, по часовой стрелке

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;

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

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

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

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