Вход/Регистрация
Графика DirectX в Delphi
вернуться

Краснов Михаил

Шрифт:

procedure TfrmDSD.Timer;

begin

if R_hand_move then begin // Правая рука поднимается

if R_hand_up_angle < Pi / 2 then begin // He достигнут предел

R_hand_up_angle := R_hand_up_angle + INCR; // Верхняя часть руки

R_hand_down_angle := R_hand_down_angle - INCR; // Нижняя часть

end // Предел достигнут, движется только нижняя часть руки

else if (R_hand_up_angle >= Pi / 2) and (R_hand_down_angle < 0.0)

then R_hand_down_angle := R_hand_down_angle + INCR;

end else // Правая рука опускается или уже опущена

if R_hand_up_angle > 0.0 then begin

R_hand_up_angle := R_hand_up_angle - INCR; if R_hand_down_angle < 0.0

then R_hand_down_angle := R_hand_down_angle + INCR;

end;

if L_hand_move then begin // Левая рука поднимается

if L_hand_up_angle > -Pi / 2 then begin

L_hand_up_angle := L_hand_up_angle - INCR;

L_hand_down_angle := L__hand_down_angle + INCR;

end else if (L_hand_up_angle <= Pi / 2) and (L_hand_down_angle > 0.0)

then L_hand_down_angle := L_hand_down_angle - INCR;

end else if L__hand__up_angle < 0.0 then begin

L_hand_up_angle := L_hand_up_angle + INCR;

if L_hand_down_angle > 0.0

then L_hand_down_angle := L_hand_down_angle - INCR;

end;

if R_foot_move then begin // Правая нога поднимается

if R_foot_up_angle < Pi / 2 then begin

R_foot_up_angle := R_foot__up_angle + INCR;

R_foot_down_angle := R_foot_down_angle - INCR;

end else if (R_foot_up_angle >= Pi / 2) and (R_foot_down_angle < 0.0)

then R_foot_down_angle := R_foot_down_angle + INCR;

end else if R_foot_up_angle > 0.0 then begin

R_foot_up_angle := R_foot_up_angle - INCR; if R_foot_down_angle < 0.0

then R_foot_down_angle := R_foot_down_angle + INCR;

end;

if L_foot_move then begin // Движение левой ноги

if L_foot_up_angle < Pi / 2 then begin

L_foot_up_angle := L_foot_up_angle + INCR;

L_foot_down_angle := L_foot_down_angle - INCR;

end else

if (L_foot_up_angle >= Pi / 2) and (L_foot_down_angle < 0.0)

then L_foot_down_angle := L_foot_down_angle + INCR;

end else

if L_foot_up_angle > 0.0 then begin

L_foot_up_angle := L_foot_up_angle - INCR;

if L_foot_down_angle < 0.0

then L_foot_down_angle := L_foot_down_angle + INCR;

end;

end;

Из этого примера мы также можем вынести для себя механизм удобной навигации в пространстве. Матрица проекций задается один раз, при инициализации:

procedure TfrmD3D.FormCreate(Sender: TObject);

var

hRet : HRESULT;

matView, matProj : TDSDMatrix;

begin

hRet := InitD3D;

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

hRet := InitVB;

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

SetupLights;

MaterialRed := InitMaterial(1, 0, 0, 1);

MaterialBlue := InitMaterial(0, О, 1,1);

MaterialGreen := InitMaterial(О, 1, 0, 1) ;

MaterialYellow := InitMaterial(1, 1, 0, 1) ;

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

SetViewMatrix(matView, D3DVector(2, 1, 5),

D3DVector(0, 0, 0), D3DVector(0, -1, 0));

FD3DDevice.SetTransform(D3DTS_VIEW, matView);

// Матрица проекций задается один раз

SetProjectionMatrix(matProj, 1, 1, 1, 20);

FD3DDevice.SetTransform(D3DTS_PROJECTION, matProj);

end;

Положение точки зрения и параметры матриц я подобрал с помощью пройденного нами примера с осями координат.

При движении курсора мыши с нажатой кнопкой видовая матрица пересчитывается в соответствии с положением курсора:

procedure TfrmDSD.FormMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

Down := True; // Кнопка нажата, флаг устанавливается

оХ := X; // Запомнили положение курсора

oY := Y;

end;

procedure TfrmD3D.FormMouseUp(Sender: TObject; Button: TMouseButton;

Shift:. TShiftState; X, Y: Integer);

begin

Down : = False; // Кнопка отпущена, флаг сбрасывается

end;

  • Читать дальше
  • 1
  • ...
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: