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

Timer; // Пересчет текущих значений углов поворота конечностей

// Икосаэдр головы

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

// Масштабируем единичный многогранник

SetScaleMatrix (matScale, 0.5, 0.5, 0.5);

matWrk := MatrixMul(matScale, matTranslate);

with FDSDDevice do begin

SetTransform(D3DTS_WORLD, matWrk);

SetMaterial(MaterialYellow); // Желтого цвета

DrawPrimitive(D3DPT_TRIANGLELIST, 0, 20);

end;

// Цилиндры левой ноги

SetTranslateMatrixfmatTranslate, -0.2, 0.0, 0.0);

SetRotateXMatrix(matRotateX, L_foot_up_angle);

// Запоминаем положение верхней части

matWrk := MatrixMul(matTranslate, matRotateX);

with FD3DDevice do begin

SetTransform(D3DTS_WORLD, matWrk);

SetMaterial(MaterialBlue); // Ноги - синего цвета

// Цилиндр единичной длины

DrawPrimitive(D3DPT_TRIANGLESTRIP, 60, 98);

end;

// Перемещаемся к концу цилиндра единичной длины

SetTranslateMatrix(matTranslate, 0.0, 1.0, 0.0);

// Поворот нижней части конечности

SetRotateXMatrix(matRotateX, L_foot_down_angle);

// Трансформации осуществляются относительно предыдущего состояния

// системы координат

matWrk := MatrixMul(matWrk, MatrixMul(matTranslate, matRotateX));

with FD3DDevi do begin

SetTransform(D3DTS_WORLD, matWrk);

DrawPrimitive(D3DPT_TRIANGLESTRIP, 60, 98);

end;

// Правая нога

SetTranslateMatrixfmatTranslate, 0.2, 0.0, 0.0);

SetRotateXMatrix(matRotateX, R_foot_up_angle);

// Запоминаем текущее положение верхней части правой ноги

matWrk := MatrixMul(matTranslate, matRotateX);

with FDSDDevice do begin

SetTransform(D3DTS_WORLD, matWrk);

DrawPrimitive(D3DPT_TRIANGLESTRIP, 60, 98);

end;

// Трансформации в новой системе координат

SetTranslateMatrix(matTranslate, 0.0, 1.0, 0.0);

SetRotateXMatrix(matRotateX, R_foot_down_angle);

// Поворот и сдвиг - относительно текущей трансформации

matWrk := MatrixMul(matWrk, MatrixMul(matTranslate, matRotateX));

with FD3DDevice do begin

SetTransform(D3DTS_WORLD, matWrk);

DrawPrimitive(D3DPT_TRLANGLESTRIP, 60, 98);

end;

// Туловище

// Цилиндр с левой стороны туловища

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

SetRotateZMatrix(matRotateZ, 5 * Pi / 6) ;

with FD3DDevice do begin

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

SetMaterial(MaterialGreen); // Текущий цвет - зеленый

DrawPrimitive(D3DPT_TRJANGLESTRIP, 60, 98);

end;

// Цилиндр правой части туловища

SetTranslateMatrix(matTranslate, 0.2, 0.0, 0.0);

SetRotateZMatrix(matRotateZ, -5 * Pi / 6);

FD3DDevice.SetTransform(D3DTS_WORLD,

MatrixMul(matTranslate, matRotateZ));

FD3DDevice.DrawPrimitive(D3DPT_TRIANGLESTRIP, 60, 98);

// Цилиндр верхней части туловища

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

SetScaleMatrix (matScale, 1.0, 2.0, 1.0); // Растягиваем цилиндр

SetRotateZMatrix(matRotateZ, Pi / 2);

FD3DDevice.SetTransform(D3DTS_WORLD, MatrixMul(matRotateZ,

MatrixMul(matTranslate, matScale)));

FD3DDevice.DrawPrimitive(D3DPT TRIANGLESTRIP, 60, 98);

// Цилиндр нижней части туловища

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

SetScaleMatrix (matScale, 1.0, 0.5, 1.0); // Уменьшаем цилиндр

SetRotateZMatrix(matRotateZ, Pi / 2) ;

FD3DDevice.SetTransform(D3DTS_WORLD, MatrixMul(matRotateZ,

MatrixMul(matTranslate, matScale)));

FD3DDevice.DrawPrimitive(D3DPT_TRIANGLESTRIP, 60, 98);

// Левая рука

// Верхняя часть

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

SetRotateZMatrix(matRotateZ, R_hand_up_angle);

matWrk := MatrixMul(matTranslate, matRotateZ);

with FD3DDevice do begin

SetTransform(D3DTS_WORLD, matWrk);

SetMaterial(MaterialRed); // Текущий цвет - красный

// Цилиндр длиной 0.75

DrawPrimitive(D3DPT_TRIANGLESTRIP, 160, 98);

end;

// Сдвигаемся к концу цилиндра

SetTranslateMatrix(matTranslate, 0.0, 0.75, 0.0);

SetRotateZMatrix(matRotateZ, R_hand_down_angle);

matWrk := MatrixMul(matWrk, MatrixMul(matTranslate, matRotateZ));

with FD3DDevice do begin

SetTransform(D3DTS_WORLD, matWrk);

DrawPrimitive(D3DPT_TRIANGLESTRIP, 160, 98);

end;

// Правая рука

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

SetRotateZMatrix(matRotateZ, L_hand_up_angle);

matWrk := MatrixMul(matTranslate, matRotateZ);

with FD3DDevice do begin

SetTransform(D3DTS_WORLD, matWrk);

DrawPrimitive(D3DPT_TRIANGLESTRIP, 160, 98);

end;

SetTranslateMatrix(matTranslate, 0.0, 0.75, 0.0);

SetRotateZMatrix(matRotateZ, L_hand_down_angle);

matWrk := MatrixMul(matWrk, MatrixMul{matTranslate, matRotateZ));

with FDSDDevice do begin

SetTransform(D3DTS_WORLD, matWrk);

DrawPrimitive(D3DPT_TRIANGLESTRIP, 160, 98);

end;

end;

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

procedure TfrmD3D.FormKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

begin

if Key = VKJ3SCAPE then Close else

// Клавиша "влево" - правая рука

if Key = VK_LEFT then R_hand_move := not R_hand_move else

// Клавиша "вправо" - левая рука

if Key = VK_RIGHT then L_hand_move := not L_hand_move else

// Клавиша "вверх" - правая нога

if Key = VK_UP then begin

// Двигается, если не поднята левая нога

if L_foot_up_angle < 1.0 then R_foot_move := not R_foot_move;

end else

// Клавиша "вниз" - левая нога

if Key = VK_DOWN then begin

// Двигается, если не поднята правая нога

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

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

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

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

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

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

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

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

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