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

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

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

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;