Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π“Ρ€Π°Ρ„ΠΈΠΊΠ° DirectX Π² DelphiΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 56

Автор ΠœΠΈΡ…Π°ΠΈΠ» ΠšΡ€Π°ΡΠ½ΠΎΠ²

НадСюсь, нСспСшная Ρ€Π°Π±ΠΎΡ‚Π° с этим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π²Π°ΠΌ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΌΠΈ Π²ΠΈΠ΄ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ.


ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ

ΠšΠΎΠ½ΡƒΡΡ‹ ΠΈ Ρ†ΠΈΠ»ΠΈΠ½Π΄Ρ€Ρ‹, сфСра ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ ΠΌΠ½ΠΎΠ³ΠΎΠ³Ρ€Π°Π½Π½ΠΈΠΊΠΈ - всС ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ гСомСтричСскиС Ρ„ΠΈΠ³ΡƒΡ€Ρ‹ Π»Π΅Π³ΠΊΠΎ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠΊΡ€Π°ΡΠΈΡ‚ΡŒ Π²Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ - ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…04, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ рисуСтся икосаэдр (рис. 9.6).





Π­Ρ‚ΠΎΡ‚ ΠΌΠ½ΠΎΠ³ΠΎΠ³Ρ€Π°Π½Π½ΠΈΠΊ описан Π΄Π²Π°Π΄Ρ†Π°Ρ‚ΡŒΡŽ нСзависимыми Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°ΠΌΠΈ. ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΈ Π½ΠΎΡ€ΠΌΠ°Π»ΠΈ я ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ вычислил ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ значСния.

Π—Π½Π°Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΡƒΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ, достаточно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅-ΠΌΠ΅Π½Π΅Π΅ интСрСсныС построСния. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ - ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…05, Π³Π΄Π΅ рисуСтся простая модСль Ρ‡Π΅Π»ΠΎΠ²Π΅Ρ‡ΠΊΠ°. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π΄Π²Π΅ гСомСтричСскиС Ρ„ΠΎΡ€ΠΌΡ‹: Ρ†ΠΈΠ»ΠΈΠ½Π΄Ρ€ ΠΈ икосаэдр. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ клавиш пСрСмСщСния курсора конСчностями Ρ‡Π΅Π»ΠΎΠ²Π΅Ρ‡ΠΊΠ° ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ, заставляя Π΅Π³ΠΎ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΈ ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Ρ€ΡƒΠΊΠΈ ΠΈ Π½ΠΎΠ³ΠΈ, Π½ΠΎ нСльзя Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π½ΡΡ‚ΡŒ ΠΎΠ±Π΅ Π½ΠΎΠ³ΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ (рис. 9.7).






Для построСния Π½ΠΎΠ³ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Ρ†ΠΈΠ»ΠΈΠ½Π΄Ρ€Ρ‹ Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹, Ρ€ΡƒΠΊΠΈ строятся Ρ†ΠΈΠ»ΠΈΠ½Π΄Ρ€Π°ΠΌΠΈ Π΄Π»ΠΈΠ½ΠΎΠΉ 0.75 Π΅Π΄ΠΈΠ½ΠΈΡ†. ДвиТСния конСчностСй ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‚ΡΡ ΠΏΠ»Π°Π²Π½ΠΎ:


const

INCR = 0.05; // ΠŸΡ€ΠΈΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ для ΡƒΠ³Π»ΠΎΠ², Π·Π°Π΄Π°Π΅Ρ‚ Ρ‚Π΅ΠΌΠΏ вращСния Ρ†ΠΈΠ»ΠΈΠ½Π΄Ρ€ΠΎΠ²

var

Down : BOOL = False; // Π€Π»Π°Π³, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ, Π½Π°ΠΆΠ°Ρ‚Π° Π»ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΌΡ‹ΡˆΠΈ

ΠΎΠ₯ : Integer; // Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΈ Π² пространствС

ΠΎΠ£ : Integer;

Angle : Single = 0;

sHeight : Single = 0;

// ЛСвая/правая стороны - с Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΎΠ±Π·ΠΎΡ€Π° зритСля

R_hand_up_angle, // Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΡƒΠ³ΠΎΠ» ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π° Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ части ΠΏΡ€Π°Π²ΠΎΠΉ Ρ€ΡƒΠΊΠΈ

R_hand_down_angle, // Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΡƒΠ³ΠΎΠ» ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π° Π½ΠΈΠΆΠ½Π΅ΠΉ части ΠΏΡ€Π°Π²ΠΎΠΉ Ρ€ΡƒΠΊΠΈ

L_hand_up_angle, // Π£Π³Π»Ρ‹ для частСй Π»Π΅Π²ΠΎΠΉ Ρ€ΡƒΠΊΠΈ

L_hand_down_angle,

R_foot_up_angle, // Π£Π³Π»Ρ‹ для частСй ΠΏΡ€Π°Π²ΠΎΠΉ Π½ΠΎΠ³ΠΈ

R_foot_down_angle,

L_foot_up_angle, // Π£Π³Π»Ρ‹ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚ΠΎΠ² Π»Π΅Π²ΠΎΠΉ Π½ΠΎΠ³ΠΈ

L_foot_down_angle : Single;

R_hand_move, // Π€Π»Π°Π³ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΉ конСчностСй

L_hand_move,

R_foot_move,

L_foot_move : BOOL;

Π”Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Π°ΠΆΠ΅Π½ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΡƒΡ‡ΠΈΡ‚, ΠΊΠ°ΠΊ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ комплСксныС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹: части конСчностСй Ρ‡Π΅Π»ΠΎΠ²Π΅Ρ‡ΠΊΠ° ΠΏΡ€ΠΈΠΊΡ€Π΅ΠΏΠ»Π΅Π½Ρ‹ Π΄Ρ€ΡƒΠ³ ΠΊ Π΄Ρ€ΡƒΠ³Ρƒ. Для построСния ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… частСй Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ трансформации, поэтому Π²ΠΎ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Ρ‚Ρ€Π°Π½ΡΡ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ систСмы ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚:


procedure TfrmD3D.DrawScene;

var

matRotateX, matRotateZ : TDSDMatrix;

matScale, matTranslate : TD3DMatrix;

matWrk : TD3DMatrix; // Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ трансформации

begin

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

// ДвигаСтся, Ссли Π½Π΅ поднята правая Π½ΠΎΠ³Π°

if R_foot_up_angle < 1.0 then L_foot_move := not L_foot_move;

end;


end;


ΠŸΡ€ΠΈ установлСнных Ρ„Π»Π°Π³Π°Ρ… значСния ΡƒΠ³Π»ΠΎΠ² ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚ΠΎΠ² ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½Π° Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ INCR:


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;


ПолоТСниС Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΌΠ°Ρ‚Ρ€ΠΈΡ† я ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π°Π» с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ Π½Π°ΠΌΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° с осями ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚.