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

var

matTranslate, matScale : TDSDMatrix;

begin

// Вычисляем текущее положение источника

Light.Position := DSDVector(0.0, cos (Angle) * 2, 0.0);

with FDSDDevice do begin

// Возвращаем мировую систему координат

SetTransform(D3DTS_WORLD, IdentityMatrix);

// Устанавливаем источник света в новом положении

SetLight(0, Light);

DrawPrimitive(D3DPT_TRIANGLELIST, 0, 864); // Вывод тора

end;

// Источник света будет внутри сферы

Light.Position := D3DVector(0.О, 0.0, 0.0);

// Матрица трансформаций для сферы

SetTranslateMatrix(matTranslate, 0.0, cos (Angle) * 2, 0.0);

SetScaleMatrix(matScale, 0.1, 0.1, 0.1);

with FDBDDevice do begin

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

SetLight(0, Light);

DrawPrimitive(D3DPT_TRIANGLELIST, 864 * 3, 1200);

end;

end;

Позже мы подробнее поговорим о полях структуры, связанной с источником света, а сейчас попробуем построить модель комнаты, чтобы убедиться, что использование точечного источника света значительно повышает реализм изображений. В проекте каталога Ех02 рисуется комната, в ее центре находится конус, вокруг которого вращается сфера (рис. 10.2).

Матрицы трансформаций полностью заполняются один раз, в начале работы приложения:

procedure TfrmD3D.FormCreate(Sender: TObject);

var

hRet : HRESULT;

matView, matProj : TD3DMatrix;

matRotate, matTranslate, matScale : TD3DMatrix;

begin

hRet := InitDSD;

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

hRet := InitVB;

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

// Голубоватый материал конуса

MaterialConus := InitMaterial(0, 0.5, 1, 0) ;

// Белый материал стен комнаты

MaterialWhite := InitMaterial(1, 1, I, 0);

// Светло-коричневый материал сферы

MaterialSphere := InitMaterial(1, 0.5, 0, 0) ;

// Точка зрения задается один раз

SetViewMatrix(matview, D3DVector(0, 0, 2.577), D3DVector(0, 0, -5),

D3DVector(0, 1, 0));

FD3DDevice.SetTransform(D3DTS_VIEW, matView);

// Матрица проекций

SetProjectionMatrix (matProj, 1, 1, 1, 10);

FD3DDevice.SetTransform(D3DTS_PROJECTION, matProj);

// Инициализация источников света

SetupLights;

// Поворот конуса вокруг оси X

SetRotateXMatrix(matRotate, -Pi / 2);

// Переносим конус, его вершина в центре сцены

SetTranslateMatrixfmatTranslate, 0.0, -1.0, 0.0);

// Масштабируем конус

SetScaleMatrixfmatScale, 0.25, 1.0, 0.2);

// Матрица трансформаций конуса вычисляется один раз

matCone := MatrixMul(matScale, MatrixMul(matTranslate, matRotate));

// Инициализация матрицы трансформаций сферы

matSphere := IdentityMatrix;

// Переносим сферу по оси Y

matSphere._42 := -0.5;

end;

Я ввел в сцену четыре источника света. Три точечных источника предназначены для освещения стен комнаты, конус и сфера освещаются направленным источником света:

procedure TfrmDSD.SetupLights,

var

LightO : TD3DLight8;

Lightl : TD3DLight8;

Light2 : TD3DLight8;

Light3 : TD3DLight8;

begin

ZeroMemory(@LightO, SizeOf(LightO));

with LightO do begin

Type := D3DLIGHT POINT;

Diffuse.r := 0.4; // Поскольку присутствует три источника,

Diffuse.g := 0.4; // их яркость задается небольшой

Diffuse.b := 0.4;

Specular := Diffuse;

Ambient := Diffuse;

Position := D3DVector(0.5, 0.75, 1.5);

AttenuationO := 1.0;

Attenuationl := 1.0;

Attenuation2 := 0.0;

Range := 2.56; end;

ZeroMemory(@Light1, SizeOf(Light1));

with Lightl do begin

_Type := D3DLIGHT_POINT;

Diffuse.r := 0.4;

Diffuse.g := 0.4;

Diffuse.b := 0.4;

Specular := Diffuse;

Ambient := Diffuse;

Position := D3DVector(0.5, 0.3, 0.3);

AttenuationO := 1.0;

Attenuationl := 1.0;

Attenuation2 := 0.0;

Range := 2.5;

end;

ZeroMemory(@Light2, SizeOf(Lightl));

with Light2 do begin

_Type := D3DLIGHT_POINT;

Diffuse.r := 0.4;

Diffuse.g := 0.4;

Diffuse.b := 0.4;

Specular := Diffuse;

Ambient := Diffuse;

Position := DSDVector(0.5, -0.3, 0.3);

AttenuationO := 1.0;

Attenuationl := 1.0;

Attenuation2 := 0.0;

Range := 2.5;

end;

// Один направленный источник света

Lights:=InitDirectionalLight(DSDVector(-0.5, -0.5, -1),

1.0, 1.0, 1.0, 0);

// Источники только инициализируются, но пока не включаются

with FDSDDevice do begin SetLight(0, LightO);

SetLight(1, Lightl);

SetLight(2, Light2);

SetLight(3, Light3);

end;

end;

При рисовании объектов включаем только определенные источники света:

procedure TfrmD3D.DrawScene;

begin

// Стены комнаты - 10 независимых треугольников

with FD3DDevice do begin

// Матрица идентичности возвращает в мировую систему координат

SetTransform(D3DTS_WORLD, IdentityMatrix);

SetMaterial(Materialwhite); // Стены из белого материала

LightEnable(0, True); // Работают только точечные источники

LightEnabled, True);

LightEnable (2, True);

LightEnable(3, False); // Направленный источник выключаем

DrawPrimitive(D3DPT_TRIANGLELIST, 0, 10);

end;

// Конус и сфера освещаются только направленным источником with FDSDDevice do begin

LightEnable(0, False);

LightEnabled, False);

LightEnable(2, False);

LightEnable(3, True);

SetMaterial(MaterialConus); // Синий материал конуса

SetTransform(D3DTS_WORLD, matCone); // Неизменное положение конуса

DrawPrimitive(D3DPTJTRIANGLEFAN, 30, 49); // Сам конус

DrawPrimitive(D3DPT_TRIANGLEFAN, 81, 49); // Основание конуса

end;

// Перемещаем сферу в новое положение

matSphere._41 := cos (Angle) / 2; // Меняем только два элемента

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

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

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

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

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

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

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

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

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