ΠΠ°Π΄Π΅ΡΡΡ, Π½Π΅ΡΠΏΠ΅ΡΠ½Π°Ρ ΡΠ°Π±ΠΎΡΠ° Ρ ΡΡΠΈΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΌ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ Π²Π°ΠΌ Ρ ΠΎΡΠΎΡΠΎ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ Ρ ΠΌΠ°ΡΡΠΈΡΠ°ΠΌΠΈ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΠΈΠΌΠΈ Π²ΠΈΠ΄ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠΈ.
ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ
ΠΠΎΠ½ΡΡΡ ΠΈ ΡΠΈΠ»ΠΈΠ½Π΄ΡΡ, ΡΡΠ΅ΡΠ° ΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΠ³ΡΠ°Π½Π½ΠΈΠΊΠΈ - Π²ΡΠ΅ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΠ΅ Π³Π΅ΠΎΠΌΠ΅ΡΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠΈΠ³ΡΡΡ Π»Π΅Π³ΠΊΠΎ ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΡΡ ΠΈ ΠΌΠΎΠ³ΡΡ ΡΠΊΡΠ°ΡΠΈΡΡ Π²Π°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΡΠΈΠΌΠ΅Ρ - ΠΏΡΠΎΠ΅ΠΊΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° ΠΡ 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;
ΠΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΌΠ°ΡΡΠΈΡ Ρ ΠΏΠΎΠ΄ΠΎΠ±ΡΠ°Π» Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΡΠΎΠΉΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ Π½Π°ΠΌΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠ° Ρ ΠΎΡΡΠΌΠΈ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°Ρ.