procedure TfrmDSD.MoveMan;
begin
// ΠΠΎΠ²ΠΎΡΠΎΡ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°Ρ,
// Π²ΡΠ°ΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ΅ΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π²ΠΎΠΊΡΡΠ³ ΡΠ²ΠΎΠ΅ΠΉ ΠΎΡΠΈ
SetRotateZMatrix (matRot, Angle);
// ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ, Π·Π°Π΄Π°ΡΡΠ°Ρ Π²ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΡΡΠ΅ΠΉ
AngleFoot := AngleFoot + StepFoot;
if (AngleFoot > Pi / 4) or (AngleFoot < -Pi / 4}
then StepFoot := -StepFoot; // ΠΠΎΠ³ΠΈ Π²ΡΠ°ΡΠ°ΡΡΡΡ Π² ΠΏΡΠΎΡΠΈΠ²ΠΎΡΠ°Π·Π΅
SetRotateXMatrix (rotLeftFoot, AngleFoot);
SetRotateXMatrix (rotRightFoot, -AngleFoot); // ΠΠΎΠ²ΠΎΡΠΎΡ Π»Π΅Π²ΠΎΠΉ Π½ΠΎΠ³ΠΈ, Π² ΡΡΠΈ ΡΡΠ°ΠΏΠ°
matLeftFoot := MatrixMul(matRot,
MatrixMul(transFoot2, MatrixMul(rotLeftFoot, transFootl))); // ΠΠΎΠ²ΠΎΡΠΎΡ ΠΏΡΠ°Π²ΠΎΠΉ Π½ΠΎΠ³ΠΈ
matRightFoot := MatrixMul(matRot,
MatrixMul(transFoot2,
MatrixMul(rotRightFoot, transFootl))); // ΠΠΎΠ²ΠΎΡΠΎΡ Π»Π΅Π²ΠΎΠΉ ΡΡΠΊΠΈ
matLeftHand := MatrixMul(matRot,
MatrixMul(transHand2,
MatrixMul(rotRightFoot, transHandl))); // ΠΠΎΠ²ΠΎΡΠΎΡ ΠΏΡΠ°Π²ΠΎΠΉ ΡΡΠΊΠΈ
matRightHand := MatrixMul(matRot,
MatrixMul(transHand2, MatrixMul(rotLeftFoot, transHandl)));
end;
Π Π°Π±ΠΎΡΠΈΠ΅ ΠΌΠ°ΡΡΠΈΡΡ, ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡΠΌΠΈ Π² ΡΠΎΡΠΊΠΈ ΠΊΡΠ΅ΠΏΠ»Π΅Π½ΠΈΡ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΡΡΠ΅ΠΉ, ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΡΡΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·, Π² Π½Π°ΡΠ°Π»Π΅ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ:
SetTranslateMatrix(transFootl, Π, Π, 0.25);
SetTranslateMatrix(transFoot2, Π, Π, -0.25);
SetTranslateMatrix(transHandl, 0.25, 0.0, -0.23);
SetTranslateMatrix(transHand2, -0.25, 0.0, 0.23);
ΠΡΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ Ρ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΈΠ» Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π² Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΌ Π² ΡΠ°ΡΡΠ΅ΡΠ΅ Π½Π° ΡΠΎ, ΡΡΠΎ ΡΠ΅Π»ΠΎΠ²Π΅ΡΠΊΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ Π»Π΅Π³ΠΊΠΎ ΡΠΏΡΠ°Π²Π»ΡΡΡ, ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Ρ Π΅Π³ΠΎ Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅. ΠΠΎ Π΅ΡΠ»ΠΈ Π½Π° ΡΡΠ΅Π½Π΅ ΠΏΡΠΈΡΡΡΡΡΠ²ΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Π° ΠΌΠΎΠ΄Π΅Π»Ρ, Π΄Π»Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠΊΡΠ°ΡΠΈΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Ρ ΠΌΠ°ΡΡΠΈΡΠ°ΠΌΠΈ. Π ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅, Π² ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΌΠ°ΡΡΠΈΡΠ° matRot, ΡΠ²ΡΠ·Π°Π½Π½Π°Ρ Ρ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°Ρ, ΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΠΎΠ±ΡΠ΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ: ΠΌΠΎΠ΄Π΅Π»Ρ ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ Π²ΡΠ°ΡΠ°ΡΡ ΠΈ ΠΎΡΡΠ°Π²ΠΈΡΡ Π½Π΅ΠΏΠΎΠ΄Π²ΠΈΠΆΠ½ΠΎΠΉ, Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°ΡΡ ΡΠΎΡΠΊΡ Π·ΡΠ΅Π½ΠΈΡ Π½Π°Π±Π»ΡΠ΄Π°ΡΠ΅Π»Ρ. ΠΡΡΠ΅ΠΊΡ Π²ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΎΡΡΠ°Π½Π΅ΡΡΡ, Π° ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ ΡΠΌΠ΅Π½ΡΡΠΈΡΡΡ.
Π ΡΠ΅ΠΏΠ΅ΡΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ ΠΊ ΡΠ°Π·Π±ΠΎΡΡ Π·Π°ΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° - ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° ΠΡ 21. ΠΠ°ΠΊ Ρ ΡΠΆΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΠ», ΡΡΠΎ Π·Π°Π³ΠΎΡΠΎΠ²ΠΊΠ° ΡΡΠ΅Ρ ΠΌΠ΅ΡΠ½ΠΎΠΉ ΠΈΠ³ΡΡ: ΠΈΠ³ΡΠΎΠΊ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ Π²Π½ΡΡΡΡ ΠΊΠΎΠΌΠ½Π°ΡΡ, Π½Π°ΡΠ΅Π»Π΅Π½Π½ΠΎΠΉ Π΄Π²ΠΈΠΆΡΡΠΈΠΌΠΈΡΡ ΡΠ΅Π»ΠΎΠ²Π΅ΡΠΊΠ°ΠΌΠΈ .
ΠΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ³ΡΠΎΠΊΠ° ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΎ ΠΈΠ· ΡΠ΅ΠΊΡΡΡΡ, Π½Π°ΠΊΠ»Π°Π΄ΡΠ²Π°Π΅ΠΌΡΡ Π½Π° ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΈ, ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΎΠΊΡΡΠΆΠ°ΡΡΠ΅Π³ΠΎ ΠΌΠΈΡΠ° Π·Π°Π³ΡΡΠΆΠ°Π΅ΡΡΡ ΠΈΠ· ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°.DirectX.
type
// Π€ΠΎΡΠΌΠ°Ρ Π²Π΅ΡΡΠΈΠ½ Π΄Π»Ρ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΎΠ² ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ
TNormDiffTextVertex = packed record
X, Y, Z : Single;
nX, nY, nZ : Single;
DColor : DWORD;
U, V : Single;
end;
// Π€ΠΎΡΠΌΠ°Ρ Π²Π΅ΡΡΠΈΠ½ Π΄Π»Ρ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΎΠ² ΡΠ΅Π»ΠΎΠ²Π΅ΡΠΊΠΎΠ²
TNormVertex = packed record
X, Y, Z : Single;
nX, nY, nZ : Single;
end;
// ΠΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ
TTriangle '= record
NumTexture : Integer; // ΠΠΎΠΌΠ΅Ρ ΡΠ΅ΠΊΡΡΡΡΡ
DIFFUSE : DWORD; // ΠΠΈΡΡΡΠ·Π½Π°Ρ ΡΠΎΡΡΠ°Π²Π»ΡΡΡΠ°Ρ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠ°
end;
const
// FVF-ΡΠ»Π°Π³ Π΄Π»Ρ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΎΠ² ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ
D3DFVF_NORMDIFFTEXTVERTEX = D3DFVF_XYZ or D3DFVF_NORMAL or
D3DFVF_DIFFUSE or D3DFVFJTEX1; // FVF-ΡΠ»Π°Π³ Π΄Π»Ρ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΎΠ² ΡΠ΅Π»ΠΎΠ²Π΅ΡΠΊΠΎΠ²
D3DFVFJSIORMVERTEX = D3DFVF_XYZ or D3DFVFJTORMAL;
// ΠΠΌΡ ΡΠ°ΠΉΠ»Π° Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ ΠΌΠΈΡΠ°
WorldFile = 'Data/World.txt';
// ΠΠΌΡ ΡΠ°ΠΉΠ»Π° Ρ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠ°ΠΌΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ², Π΄Π»Ρ Π²ΡΠ²ΠΎΠ΄Π° FPS
NumbersFile = 'Data/Numbers.txt';
// ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΎΠ² Π² ΠΎΠΏΠΈΡΠ°Π½ΠΈΠΈ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ
NumTriangles = 58;
($1 legoman.pas) // ΠΠ°Π½Π½ΡΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ
var
frmD3D: TfrmD3D;
Frames : Integer =0; // Π‘ΡΠ΅ΡΡΠΈΠΊ ΠΊΠ°Π΄ΡΠΎΠ²
FpsOut : String = ''; // ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ FPS
// ΠΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½Π°Ρ ΠΌΠ°ΡΡΠΈΡΠ°, Π΄Π»Ρ Π²ΡΠ²ΠΎΠ΄Π° ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² FPS
LetTrans : TDSDMatrix;
// ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΎΠ±ΡΠ°Π·Π° ΡΠ΅ΠΊΡΡΡΡΡ
TexPointer : Pointer;
// Π₯Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ ΠΎΠ±ΡΠ°Π·Π° ΡΠ΅ΠΊΡΡΡΡΡ
wrkTexWidth, wrkTexHeight :
Integer;
// Π€Π»Π°Π³, Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ Π»ΠΈ FPS
flgFPS : BOOL = True;
// Π£Π³ΠΎΠ» Π·ΡΠ΅Π½ΠΈΡ ΠΏΠΎ Π²Π΅ΡΡΠΈΠΊΠ°Π»ΠΈ
Lookupdown : Single = 0.0;
// ΠΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΠΉ Π²Π΅ΠΊΡΠΎΡ Π΄Π»Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ
ZVector : TD3DVector;
// Π£Π³ΠΎΠ» Π·ΡΠ΅Π½ΠΈΡ ΠΏΠΎ Π³ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»ΠΈ ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ³ΡΠΎΠΊΠ°
RotY, XPos, ZPos : Single;
// ΠΠ°ΡΡΠΈΠ² ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΌΠΈΡΠ°
World : Array [0..NumTriangles - 1] of TTriangle;
// ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΡΡΡΠΎΠΉΡΡΠ² Π²Π²ΠΎΠ΄Π°
DInput : IDIRECTINPUT8 = nil;
DIMouse : IDIRECTINPUTDEVICE8 = nil;
DIKeyboard : IDirectlnputDeviceS;
KeyBuffer : TDIKeyboardState;
// Π£Π³ΠΎΠ» ΠΏΠΎΠ²ΠΎΡΠΎΡΠ° ΠΊΡΠ°ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅Π»ΠΎΠ²Π΅ΡΠΊΠ°
Angle : Single = 0.0;
// Π£Π³ΠΎΠ» ΠΏΠΎΠ²ΠΎΡΠΎΡΠ° ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΡΡΠ΅ΠΉ ΡΠ΅Π»ΠΎΠ²Π΅ΡΠΊΠΎΠ²
AngleFoot : Single = 0.0;
StepFoot : Single = 0.1;
// Π’Π΅ΡΡΠΎΠ²Π°Ρ ΡΠΎΡΠΊΠ° Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΡΠΎΠ»ΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΉ Ρ ΠΏΡΠ΅ΠΏΡΡΡΡΠ²ΠΈΡΠΌΠΈ
TestPointX, TestPointY : DWORD;
Π ΡΠ°ΠΉΠ»Π΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ ΠΈΠ΄ΡΡ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅:
ΡΡΡΠΎΠΊΠ° ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡ; Π½ΠΎΠΌΠ΅Ρ ΡΠ΅ΠΊΡΡΡΡΡ; ΡΠ²Π΅Ρ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠ°; ΡΡΠΈ ΡΡΡΠΎΠΊΠΈ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ Π²Π΅ΡΡΠΈΠ½ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΠΊΠ»ΡΡΠ°ΡΡ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅; Π½ΠΎΡΠΌΠ°Π»Ρ ΠΈ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠ΅ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²Π΅ΡΡΠΈΠ½Ρ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠ°.
*
ΠΠΎΡ ΡΡΠΎ Π·Π°ΠΏΠΈΡΠ°Π½ΠΎ Π² ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ Π΄Π»Ρ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠ°:
// ΠΠΎΡΠΎΠ»ΠΎΠΊ
4
$00FF0000
-3.0 1.0 3.0 0.0 -1.0 0.0 0.0 0.0
-3.0 1.0 -3.0 0.0 -1.0 0.0 0.0 12.0
1.0 3.0 0.0 -1.0 0.0 12.0 0.0
ΠΠΎΠ» ΠΈ ΠΏΠΎΡΠΎΠ»ΠΎΠΊ ΠΊΠΎΠΌΠ½Π°ΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΡΠΎΠ±ΠΎΠΉ ΠΊΠ²Π°Π΄ΡΠ°ΡΡ Ρ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠ°ΠΌΠΈ ΡΠΎΡΠ΅ΠΊ ΡΠ³Π»ΠΎΠ² ΠΏΠΎ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ (-3; -3) ΠΈ (3; 3). ΠΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠ° Y Π΄Π»Ρ Π²ΡΠ΅Ρ Π²Π΅ΡΡΠΈΠ½ ΠΏΠΎΠ»Π° Π½ΡΠ»Π΅Π²Π°Ρ, Π΄Π»Ρ Π²Π΅ΡΡΠΈΠ½ ΠΏΠΎΡΠΎΠ»ΠΊΠ° - Π΅Π΄ΠΈΠ½ΠΈΡΠ½Π°Ρ. ΠΡΠΈ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΠΈ Π΄Π°Π½Π½ΡΡ ΠΏΡΠ΅Π΄ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ Π½Π° ΡΠ»ΡΡΠ°ΠΉ ΠΎΡΡΡΡΡΡΠ²ΠΈΡ ΡΠ°ΠΉΠ»Π° Π΄Π°Π½Π½ΡΡ ΠΈΠ»ΠΈ ΠΏΡΠΈΡΡΡΡΡΠ²ΠΈΡ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΏΡΠΈ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠΈ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΎΠ²:
procedure TfrmD3D.SetupWorld;
var
t : TextFile;
i, j : Integer;
Vertices : /4TNormDiffTextVertex;
wrkStr : tring;
begin
if FileExists(WorldFile) then begin AssignFile(t, WorldFile);
try
Reset(t); FD3DVB.Lock(0, NumTriangles * 3 * SizeOf(TNormDiffTextVertex),
PByte(Vertices), 0) ;
for i := 0 to NumTriangles - 1 do begin
// Π‘ΡΡΠΎΠΊΠ° ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡ, Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ
ReadLn (t, wrkStr) ;
ReadLn (t, World[i].NumTexture); // Π’Π΅ΠΊΡΡΡΡΠ° ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠ°
ReadLn (t, World[i].DIFFUSE); // Π¦Π²Π΅Ρ Π²Π΅ΡΡΠΈΠ½ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠ°
for j := 0 to 2 do begin // Π’ΡΠΈ Π²Π΅ΡΡΠΈΠ½Ρ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠ°
ReadLn (t, Vertices.X, Vertices.Y, Vertices.Z,
Vertices.nX, Vertices.nY, Vertices.nZ,
Vertices.U, Vertices.V);
Vertices.DColor := World[i].DIFFUSE;
Inc(Vertices);
end;
end;
FD3DVB.Unlock;
except // ΠΠ°Π½Π½ΡΠ΅ Π½Π° ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊ Π·Π°Π΄Π°Π½Ρ Π½Π΅Π²Π΅ΡΠ½ΠΎ
raise EAbort.Create ('Can''t read file: ' + WorldFile);
end;
CloseFile(t) ;
end else raise EAbort.Create ('Can''t read file: ' + WorldFile);
end;
ΠΡΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ, ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡΡ Π² ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΉ ΡΠ°ΠΉΠ».
ΠΠΎΠΌΠΈΠΌΠΎ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΎΠ², ΠΎΠ±ΡΠ°Π·ΡΡΡΠΈΡ ΡΡΠ΅Π½Ρ ΠΊΠΎΠΌΠ½Π°ΡΡ, Π½Π° ΡΡΠ΅Π½Π΅ ΠΏΡΠΈΡΡΡΡΡΠ²ΡΡΡ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΈ ΡΡΠΎΡΡΠ΅Π³ΠΎ Π² ΠΊΠΎΠΌΠ½Π°ΡΠ΅ ΡΡΠΈΠΊΠ° ΠΈ ΠΏΠΈΡΠ°ΠΌΠΈΠ΄Ρ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° ΡΠ²Π΅ΡΠ°, ΠΏΡΠΈΠΊΡΠ΅ΠΏΠ»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊ ΠΏΠΎΡΠΎΠ»ΠΊΡ. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΈ ΠΏΠΎΠ»Π° ΠΈ ΠΏΠΎΡΠΎΠ»ΠΊΠ° ΠΎΠΊΡΠ°ΡΠ΅Π½Ρ ΠΊΡΠ°ΡΠ½ΡΠΌ ΡΠ²Π΅ΡΠΎΠΌ, Π° ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΈ ΠΏΡΠ΅ΠΏΡΡΡΡΠ²ΠΈΠΉ, ΡΡΠ΅Π½ ΠΈ ΡΡΠΈΠΊΠ° - ΡΠΈΠ½ΠΈΠΌ. ΠΠΎΠ·ΠΆΠ΅ Ρ ΠΏΠΎΡΡΠ½Ρ ΡΠΌΡΡΠ» ΡΡΠΎΠ³ΠΎ ΠΎΠΊΡΠ°ΡΠΈΠ²Π°Π½ΠΈΡ.
ΠΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ ΠΈΠ³ΡΠΎΠΊΠ° Π·Π°Π΄Π°ΡΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ xpos ΠΈ Zpos, ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ RotY ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΡΠ³ΠΎΠ» ΠΏΠΎΠ²ΠΎΡΠΎΡΠ° Π³ΠΎΠ»ΠΎΠ²Ρ Π½Π°Π±Π»ΡΠ΄Π°ΡΠ΅Π»Ρ Π²ΠΎΠΊΡΡΠ³ ΡΠ²ΠΎΠ΅ΠΉ ΠΎΡΠΈ, Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Lookupdown - Π½Π°ΠΊΠ»ΠΎΠ½ Π³ΠΎΠ»ΠΎΠ²Ρ ΠΏΠΎ Π²Π΅ΡΡΠΈΠΊΠ°Π»ΠΈ. Π‘ΡΠ°Π·Ρ ΠΏΠΎΡΠ»Π΅ Π·Π°ΠΏΡΡΠΊΠ° ΠΈΠ³ΡΠΎΠΊ "ΡΠ°ΡΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ" Π² ΡΠΎΡΠΊΠ΅ (0, 0, 0), Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π²Π·Π³Π»ΡΠ΄Π° ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ ΠΎΡΠΈ X.
Π’Π΅ΠΊΡΡΡΡΡ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΎΠ² Π·Π°Π΄Π°ΡΡΡΡ ΠΎΠ±ΡΡΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π½ΠΎ ΡΠ΅ΠΊΡΡΡΡΡ, Π½Π°ΠΊΠ»Π°Π΄ΡΠ²Π°Π΅ΠΌΡΠ΅ Π½Π° ΠΊΠ²Π°Π΄ΡΠ°ΡΡ Π²ΡΡ ΠΎΠ΄ΠΎΠ² ΠΈΠ· ΡΠ΅ΠΊΡΠΎΡΠ°, ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΡΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ:
procedure TfrmD3D.FormCreate(Sender: TObject);
var
hRet : HRESULT;
matView, matProj : TD3DMatrix;
wrkMat : TDSDMatrix; // ΠΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½Π°Ρ ΠΌΠ°ΡΡΠΈΡΠ° ΡΠ°Π·Π²ΠΎΡΠΎΡΠ° ΡΠ΅Π»ΠΎΠ²Π΅ΡΠΊΠΎΠ²
begin
// ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Π½ΠΎΡΠΊΡΠ°Π½Π½ΠΎΠ΅, ΠΊΡΡΡΠΎΡ ΠΎΡΠΊΠ»ΡΡΠ°Π΅ΠΌ
ShowCursor (False);
Randomize;
hRet := InitDSD;
if Failed (hRet) then ErrorOut ('InitD3D', hRet);
hRet := InitVB;
if Failed (hRet) then ErrorOut ('InitVertex', hRet);
try
InitVBLetter; // Π‘ΡΠΈΡΡΠ²Π°ΡΡΡΡ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΈ ΡΠΈΡΡ
except // ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΠ°ΠΉΠ» ΡΠ΄Π°Π»Π΅Π½
on E : EAbort do ErrorOut (PChar(E.Message), S_FALSE);
end;
InitMan; // ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π±ΡΡΠ΅ΡΠ° Π²Π΅ΡΡΠΈΠ½ ΡΠ΅Π»ΠΎΠ²Π΅ΡΠΊΠΎΠ²
try
SetupWorld; // Π‘ΡΠΈΡΡΠ²Π°Π΅ΠΌ Π΄Π°Π½Π½ΡΠ΅ ΠΌΠΈΡΠ°
// ΠΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΠΉ Π²Π΅ΠΊΡΠΎΡ Π΄Π»Ρ Π²ΠΈΠ΄ΠΎΠ²ΠΎΠΉ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΠΈ
ZVector := D3DVector(0, 1, 0);
// ΠΠ°ΡΡΠΈΡΠ° ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΠΉ Π±ΡΠΊΠ² ΠΏΡΠΈ Π²ΡΠ²ΠΎΠ΄Π΅ FPS
LetTrans := IdentityMatrix;
LetTrans._42 := 0.5;
LetTrans._43 := 0.9;
// ΠΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠ΅Π»ΠΎΠ²Π΅ΡΠΊΠΎΠ²
transManl := IdentityMatrix;
transMan2 := IdentityMatrix;
transMan2._41 := 3.1; // Π‘ΠΈΠ½ΠΈΠΉ ΡΠ΅Π»ΠΎΠ²Π΅ΡΠ΅ΠΊ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅ΡΡΡ ΠΏΠΎ ΠΎΡΠΈ X
transManS := IdentityMatrix;
// ΠΠ΅Π»Π΅Π½ΡΠΉ ΡΠ΅Π»ΠΎΠ²Π΅ΡΠ΅ΠΊ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ Π² ΠΏΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
transMan3._41:= ΠΠ°ΠΏΠΠ ΠΎΠ·Π₯;
transMan3._43 := ManSPosZ;
// Π Π°Π·Π²ΠΎΡΠΎΡ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΡΠ΅Π»ΠΎΠ²Π΅ΡΠΊΠΎΠ²
SetRotateYMatrix (wrkMat, -Pi / 2);
SetRotateXMatrix (matWrkl, -Pi / 2) ;
matWrk2 := MatrixMul (wrkMat, Matwrkl);
matWrk3 := matWrk2;
// ΠΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΌΠ°ΡΡΠΈΡΡ Π΄Π»Ρ ΠΏΠΎΠ²ΠΎΡΠΎΡΠ° ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΡΡΠ΅ΠΉ
SetTranslateMatrix(transFootl, 0, 0, -0.1);
SetTranslateMatrix(transFoot2, 0, 0, 0.1);
SetTranslateMatrix(transHandl, 0.25, 0.0, -0.2);
SetTranslateMatrix(transHand2, -0.25, 0.0, 0.2);
SetupLights;
// ΠΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ, Π² Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ
SetViewMatrix(matView, D3DVector(0, 0, 0), D3DVector(0, 0, 1),
ZVector);
FDSDDevice.SetTransform(D3DTS_VIEW, matView);
SetProjectionMatrixfmatProj, 1, 1, 0.01, 6) ;
FDSDDevice.SetTransform(D3DTS_PROJECTION, matProj);
// ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ΅ΠΊΡΡΡΡ
try
InitTexture (FD3DTextures [0], 'data/0.bmp');
InitTexture (FD3DTextures [1], 'data/1.bmp1);
InitTexture (FD3DTextures [2], 'data/2.bmp');
InitTexture (FD3DTextures [3], 'data/3.bmp');
InitTexture (FD3DTextures [4], 'data/4.bmp');
InitTexture (FDSDTextures [5], 'data/5.bmp');
BukupTexture (FD3DTextures [6], 'data/6.bmp1);
except
on E : EAbort do ErrorOut (PChar(E.Message), S_FALSE) ;
end;
OnCreateDevice; // ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΡΡΠΎΠΉΡΡΠ² Π²Π²ΠΎΠ΄Π°
end;
ΠΡΠ΅Π³ΠΎ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½ΠΎ ΡΡΠΈ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° ΡΠ²Π΅ΡΠ°: Π΄Π²Π° Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½Π½ΡΡ ΠΈ ΠΎΠ΄ΠΈΠ½ ΡΠΎΡΠ΅ΡΠ½ΡΠΉ, ΡΠ°ΡΠΏΠΎΠ»Π°Π³Π°ΡΡΠΈΠΉΡΡ ΠΏΠΎΠ΄ ΠΏΠΎΡΠΎΠ»ΠΊΠΎΠΌ Π² ΡΠ΅Π½ΡΡΠ΅ ΠΊΠΎΠΌΠ½Π°ΡΡ:
procedure TfrmD3D.SetupLights;
var
LightO : TD3DLight8;
Lightl : TD3DLight8;
Light2 : TD3DLight8;
begin
// ΠΠ°ΠΏΡΠ°Π²Π»Π΅Π½Π½ΡΠ΅ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΈ ΡΠ²Π΅ΡΡΡ Π²ΠΎ Π²Π·Π°ΠΈΠΌΠ½ΠΎ ΠΏΡΠΎΡΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΡΡ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡΡ
LightO := InitDirectionalLight(D3DVector(-0.5, -0.5, -1) , 0.5,
0.5, 0.5, 0); Lightl := InitDirectionalLight(VectorNormalize(DSDVector(0.5, 0.5, D),
0.5, 0.5, 0.5, 0); // Π’ΠΎΡΠ΅ΡΠ½ΡΠΉ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ
ZeroMemory(@Light2, SizeOf(Light2));
with Light2 do begin
JType := D3DLIGHT_POINT;
Diffuse.r := 0.5;
Diffuse.g := 0.5;
Diffuse.b := 0.5;
Specular := Diffuse;
Ambient := Diffuse;
Position := DSDVector(0.0, 1.0, 0.0);
Attenuation0 := 1.0;
Attenuationl := 0.0;
Attenuation2 := 0.0;
Range := 2.5;
end;
with FD3DDevice do begin SetLight(0, LightO);
SetLight(l, Lightl);
SetLight(2, Light2);
LightEnable(0, True);
LightEnable(1, True);
LightEnable (2, True);
end;
end;