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

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

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

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…07 - нСслоТной Π·Π°Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ΅ ΡƒΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ³Ρ€Ρ‹. Π’Π°ΠΌ остаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π·Π²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅, со ΡΡ‚Ρ€Π΅Π»ΡŒΠ±ΠΎΠΉ ΠΈ ΠΊΠΎΠ²Π°Ρ€Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊΠ°ΠΌΠΈ, Π° ΠΏΠΎΠΊΠ° Ρ‡Ρ‚ΠΎ ΡΡŽΠΆΠ΅Ρ‚ ΠΈΠ³Ρ€Ρ‹ совсСм прост: космичСский ΠΊΠΎΡ€Π°Π±Π»ΡŒ мчится Π² пространствС, Π½Π°ΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠΌ сфСрами (рис. 9.8).





Π£ΠΆΠ΅ сСйчас ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚: сущСствуСт полноэкранный Ρ€Π΅ΠΆΠΈΠΌ. Для управлСния ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ космичСского корабля ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Directlnput.

МодСли сфСры ΠΈ космичСского корабля Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ ΠΈΠ· тСкстовых Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΈΡ… я ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΈΠ·ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… ΡƒΡ‚ΠΈΠ»ΠΈΡ‚.

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


type

TSPHERE = packed record // Π—Π°ΠΏΠΈΡΡŒ, относящаяся ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ сфСрС

Z : Single; // ВСкущая ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π° ΠΏΠΎ оси Z

Radius : Single; // Радиус

MaterialSphere : TD3DMaterial8; // Π˜Π½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»

matSphere : TDSDMatrix; // ВСкущая ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° трансформаций сфСры

end;


const

NumSpheres = 60; // ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ сфСр

var

Spheres : Array [0..NumSpheres - 1] of TSPHERE; // Массив сфСр

MaterialXWing : TD3DMaterial8; // ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» космичСского корабля

matXWing : TD3DMatrix; // ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° трансформаций корабля

Π—Π°ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ трансформаций сфСр ΠΈ корабля ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ:


procedure TfrmD3D.FormCreate(Sender: TObject);

var

hRet : HRESULT;

raatView, matProj : TDSDMatrix;

i : Integer; matWrk : TD3DMatrix;

begin

ShowCursor (False);

hRet := OnCreateDevice; // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ

DirectInput if Failed (hRet) then ErrorOut ('InitDirectlnput', hRet);

hRet := InitDSD;

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

hRet := InitVB;

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

SetupLights;

// Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ массива сфСр

for i := 0 to NumSpheres - 1 do with Spheres [i] do begin

// ПолоТСниС ΠΏΠΎ оси Z, расстояниС Π΄ΠΎ космичСского корабля

Z := random * 80 - 40;

Radius := random * 0.1+0.1; // Π Π°Π·ΠΌΠ΅Ρ€ сфСры

SetScaleMatrix(matSphere, Radius, Radius, Radius);

// Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° трансформаций

SetTranslateMatrix (matWrk, random * 20 - 10, random * 20 - 10, Z);

// ΠžΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ инициализация ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ трансформаций сфСры

matSphere := MatrixMul (matSphere, matWrk);

// Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π° сфСры

MaterialSphere := InitMaterial(random * 0.5+0.5, random * 0.5+0.5,

random * 0.5 + 0.5, 0) ;

end;


// ΠšΠΎΡΠΌΠΈΡ‡Π΅ΡΠΊΠΈΠΉ ΠΊΠΎΡ€Π°Π±Π»ΡŒ - золотистого Ρ†Π²Π΅Ρ‚Π° MaterialXWing := InitMaterial(1.О, 1.0, 0.0, 0); // ΠŸΠΎΠ²ΠΎΡ€ΠΎΡ‚ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΏΠΎ оси X SetRotateXMatrix(matXWing, -Pi /2);

// Видовая ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° ΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ†ΠΈΠΉ устанавливаСтся ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·

SetViewMatrixfmatView, D3DVector(0, 0, -5), D3DVector(0, О, О), D3DVector(0, I, 0));

FD3DDevice.SetTransform(D3DTS_VIEW, matview);

SetProjectionMatrixdnatProj, 1, 1, 1, 100);

FD3DDevice.SetTransform(D3DTS_PROJECTION, matProj);

end;


ΠŸΡ€ΠΈ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠΈ сфСры Π² пространствС ΠΈ ΠΏΡ€ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π΅Π΅ полоТСния Π½Π΅ обращаСмся ΠΊ опСрациям пСрСмноТСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ†, Π° измСняСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ элСмСнтов Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΎΠΉ строки ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ трансформации сфСры:


procedure TfrmD3D.DrawScene;

var

i : Integer;

begin

// РисуСм космичСский ΠΊΠΎΡ€Π°Π±Π»ΡŒ

with FDSDDevice do begin

SetMaterial(MaterialXWing); // УстанавливаСм ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»

// ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° трансформаций рассчитана Ρ€Π°Π½ΡŒΡˆΠ΅

SetTransform(D3DTS_WORLD, matXWing);

// МодСль корабля нарисована ΠΏΠΎ часовой стрСлкС

SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);

// Π’Ρ‹Π²ΠΎΠ΄ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ² ΠΌΠΎΠ΄Π΅Π»ΠΈ DrawPrimtive(D3DPT_TRIANGLELIST, 0, 2498);

// Π‘Ρ„Π΅Ρ€Π° нарисована ΠΏΡ€ΠΎΡ‚ΠΈΠ² часовой стрСлки

SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);

end;


// Π’Ρ‹Π²ΠΎΠ΄ массива сфСр

for i := 0 to NumSpheres - 1 do begin

with FDSDDevice do begin

SetMaterial(Spheres [i].MaterialSphere);

SetTransform(D3DTS_WORLD, Spheres [i].matSphere);

DrawPrimitive(D3DPT_TRIANGLELIST, 7494, 110);

end;


with Spheres [i] do begin

// Π”Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ сфСры Π² пространствС

Z := Z - 0.3;

// He ΠΏΠ΅Ρ€Π΅ΠΌΠ½ΠΎΠΆΠ°Π΅ΠΌ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹, мСняСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта

Spheres [i].matSphere._43 := Z;

// Π‘Ρ„Π΅Ρ€Π° ΡƒΠ»Π΅Ρ‚Π΅Π»Π° Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ экрана

if Z < -20 then begin

// Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ X сфСры

matSphere._41 := random * 20 - 10;

// Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π£ сфСры

matSphere._42 := random * 20-10;

Z := 50 + random (10); // НовоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Z

matSphere. 43 := Z;

// Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ Π½ΠΎΠ²Ρ‹ΠΉ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» сфСры MaterialSphere := InitMaterial (random * 0.5 -t- 0.5,

random * 0.5 + 0.5, random * 0.5 + 0.5, 0);

end;


end;


end;


end;


Для максимального ускорСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния ΠΈΠ· ΠΊΠΎΠ΄Π° ΡƒΠ΄Π°Π»Π΅Π½Ρ‹ всС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΡΡ‚ΠΈ выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ обновлСния ΠΊΠ°Π΄Ρ€Π°. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π½Π° сцСнС присутствуСт Ρ‚Ρ€ΠΈ источника свСта для освСщСния корабля с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… сторон.

ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ курсора ΠΌΡ‹ΡˆΠΈ ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ значСния элСмСнтов ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ трансформаций космичСского корабля, ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚Ρ‹Ρ… ΠΊΠ½ΠΎΠΏΠΊΠ°Ρ… ΠΌΡ‹ΡˆΠΈ происходит ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚ корабля Π²ΠΎΠΊΡ€ΡƒΠ³ оси Y:


function TfrmDSD.ReadlmmediateData : HRESULT;

var

hRet : HRESULT;

dims2 : TDIMOUSESTATE2;

matRotateY : TD3DMatrix;

begin

ZeroMemory(@dims2, SizeOf(dims2));

hRet := DIMouse.GetDeviceState(SizeOf(TDIMOUSESTATE2), @dims2) ;

if Failed (hRet) then begin

hRet := DIMouse.Acquire;

while hRet = DIERR__INPUTLOST do

hRet := DIMouse.Acquire;

end;


// НаТата лСвая ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΌΡ‹ΡˆΠΈ, Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ корабля

if dims2.rgbButtons[0] = 128 then begin

SetRotateYMatrix(matRotateY, 0.1);

matXWing := MatrixMul (matXWing, matRotateY);

end;


// ΠŸΡ€Π°Π²Π°Ρ ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΌΡ‹ΡˆΠΈ, Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΡƒΡŽ сторону

if dims2.rgbButtons[1] = 128 then begin

SetRotateYMatrix(matRotateY, -0.1);

matXWing := MatrixMul (matXWing, matRotateY);

end;


// Π”Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ курсора ΠΌΡ‹ΡˆΠΈ, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ корабля ΠΏΠΎ осям X ΠΈ Y

matXWing._41:= matXWing._41 + 0.01 * dims2.1X;

matXWing._42 := matXWing._42 -0.01 * dims2.1Y;

Result := DI_OK;

end;


Одной ΠΈΠ· классичСских Π·Π°Π΄Π°Ρ‡ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ являСтся гСнСрация Π»Π°Π½Π΄ΡˆΠ°Ρ„Ρ‚ΠΎΠ², ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ наш ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈΠ· ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…08, являСтся ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠ΅ΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° эту Ρ‚Π΅ΠΌΡƒ. Π—Π΄Π΅ΡΡŒ Π½Π° Ρ„ΠΎΠ½Π΅ Π³ΠΎΡ€Π½ΠΎΠ³ΠΎ Π»Π°Π½Π΄ΡˆΠ°Ρ„Ρ‚Π° Π»Π΅Ρ‚ΠΈΡ‚ пассаТирский Π»Π°ΠΉΠ½Π΅Ρ€, тСрпящий, ΠΏΠΎ-Π²ΠΈΠ΄ΠΈΠΌΠΎΠΌΡƒ, катастрофу, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π»Π΅Ρ‚ΠΈΡ‚ с Π²Ρ‹ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹ΠΌΠΈ шасси ΠΈ вращаСтся Π²ΠΎΠΊΡ€ΡƒΠ³ своСй оси (рис. 9.9).





Π€ΠΎΡ€ΠΌΠ°Ρ‚ Π²Π΅Ρ€ΡˆΠΈΠ½ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρƒ, Π²Π΅ΠΊΡ‚ΠΎΡ€ Π½ΠΎΡ€ΠΌΠ°Π»ΠΈ ΠΈ Ρ†Π²Π΅Ρ‚, порядок ΠΈΡ… слСдования строго ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½. Π’Ρ€ΠΎΠΉΠΊΡƒ чисСл Π½ΠΎΡ€ΠΌΠ°Π»ΠΈ я объСдинил Π² Π²Π΅ΠΊΡ‚ΠΎΡ€ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· сообраТСний ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ:


type

TCUSTOMVERTEX = packed record

X, Y, Z : Single;

normVector : TDSDVector; // ΠΠΎΡ€ΠΌΠ°Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Ρ†Π²Π΅Ρ‚Ρƒ

Color : DWORD;

end;


const

D3DFVF_CUSTOMVERTEX = D3DFVF_XYZ or D3DFVF_NORMAL or D3DFVF_DIFFUSE;

type

LandParam = packed record // ОписаниС ΠΎΠΏΠΎΡ€Π½Ρ‹Ρ… Ρ‚ΠΎΡ‡Π΅ΠΊ сСтки Π»Π°Π½Π΄ΡˆΠ°Ρ„Ρ‚Π°

Color : DWORD; // Π¦Π²Π΅Ρ‚ Ρ‚ΠΎΡ‡ΠΊΠΈ

h : Single; // Высота

VecNormal : TD3DVector; // ΠΠΎΡ€ΠΌΠ°Π»ΡŒ ΠΊ Π²Π΅Ρ€ΡˆΠΈΠ½Π΅

end;


const

RandPoint =400; // ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Ρ…ΠΎΠ»ΠΌΠΎΠ² ΠΈ Π³ΠΎΡ€ Π»Π°Π½Π΄ΡˆΠ°Ρ„Ρ‚Π°

FlatLand =3; // Π‘Ρ‚Π΅ΠΏΠ΅Π½ΡŒ сглаТивания Π²ΠΎΠ·Π²Ρ‹ΡˆΠ΅Π½Π½ΠΎΡΡ‚Π΅ΠΉ

Numx = 77; // Π Π°Π·ΠΌΠ΅Ρ€ Π»Π°Π½Π΄ΡˆΠ°Ρ„Ρ‚Π° ΠΏΠΎ оси X

NumZ =60; // ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Ρ‚ΠΎΡ‡Π΅ΠΊ ΠΏΠΎ оси Z

Step =0.2; // ΠœΠ°ΡΡˆΡ‚Π°Π±Π½Ρ‹ΠΉ ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒ для ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ»ΠΎΡ‰Π°Π΄ΠΊΠΈ var

matAirplan : TD3DMatrix; // ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° трансформаций для самолСта

Land : array f1..NurnX,1..NumZ] of LandParara; // Массив Π»Π°Π½Π΄ΡˆΠ°Ρ„Ρ‚Π°

Для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π»Π°Π½Π΄ΡˆΠ°Ρ„Ρ‚Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎΠΉ сСтки ΠΏΡ€ΠΈΠΏΠΎΠ΄Π½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΡƒΡŽ высоту. Π—Π°Ρ‚Π΅ΠΌ, Π² нСсколько ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΎΠ², значСния высот всСх ΡƒΠ·Π»ΠΎΠ² сСтки ΡƒΡΡ€Π΅Π΄Π½ΡΡŽΡ‚ΡΡ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²ΠΎΠΊΡ€ΡƒΠ³ ΠΏΠΈΠΊΠΎΠ² ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ΡΡ ΠΏΠ»Π°Π²Π½Ρ‹Π΅ Π²ΠΎΠ·Π²Ρ‹ΡˆΠ΅Π½Π½ΠΎΡΡ‚ΠΈ. Для ΠΈΠΌΠΈΡ‚Π°Ρ†ΠΈΠΈ Π³ΠΎΡ€Π½ΠΎΠ³ΠΎ ΠΏΠ΅ΠΉΠ·Π°ΠΆΠ° Ρ†Π²Π΅Ρ‚ Π²Π΅Ρ€ΡˆΠΈΠ½ задаСтся Π² зависимости ΠΎΡ‚ Π΅Π΅ высоты.

ΠŸΡ€ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π»Π°Π½Π΄ΡˆΠ°Ρ„Ρ‚Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция, Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‰Π°Ρ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒ ΠΊ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΡƒ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ²:


procedure GenLand;

var

i, j, k : Integer;

x, z : Integer;

begin

// Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ Π²ΠΎΠ·Π²Ρ‹ΡˆΠ΅Π½Π½ΠΎΡΡ‚Π΅ΠΉ

for i := 1 to RandPoint do begin

x := random(NumX - 3) + 1;

z := random(NumZ - 3) + 1;

Land[x,z].h := random(500);

end;


// УсрСдняСм высоты сосСдних Ρ‚ΠΎΡ‡Π΅ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠ»Π°Π²Π½Ρ‹Π΅ Ρ…ΠΎΠ»ΠΌΡ‹

for k := 1 to FlatLand do

for i:= 2 to NumX. do

for j := 2 to NumZ do

Land[i,j].h := (Land[i,j].h +

Land[(i + 1) mod NumX,j].h +

Land[i - 1, j].h +

Land[i, (j + 1) mod NumZ].h +

Land[i, j - 1].h) / 5;

// ΠŸΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠΌ Π΄Π°Π½Π½Ρ‹Π΅ ΠΊ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΌΡƒ Π²ΠΈΠ΄Ρƒ, Π·Π°Π΄Π°Π΅ΠΌ Ρ†Π²Π΅Ρ‚ Π²Π΅Ρ€ΡˆΠΈΠ½

for i := 1 to NumX do

for j := 1 to NumZ do

with Land[i,j] do begin

h := h / 100; if h > 0.85 then h := 0.85;

if h > 0.4 // ВысокиС Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ ΠΎΠΊΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌ Π±Π΅Π»Ρ‹ΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ

then Land[i,j].Color := $00FFFFFF else

if h > 0.2 // Π’ΠΎΡ‡ΠΊΠΈ Ρ‡ΡƒΡ‚ΡŒ Π½ΠΈΠΆΠ΅ - ΠΊΠΎΡ€ΠΈΡ‡Π½Π΅Π²Ρ‹ΠΌ

then Land[i,j].Color := $00804000 else

if h > 0.1 // Π’Π΅Ρ€ΡˆΠΈΠ½Ρ‹ Π΅Ρ‰Π΅ Π½ΠΈΠΆΠ΅ - ΠΆΠ΅Π»Ρ‚Ρ‹Π΅

then Land[i,j].Color := $00FFFF00

// Π’ΠΎΡ‡ΠΊΠΈ Π½Π° Ρ€Π°Π²Π½ΠΈΠ½Π΅ - Π·Π΅Π»Π΅Π½Ρ‹Π΅

else Land[i,j].Color := $0000FF00;

end;


// РассчитываСм Π½ΠΎΡ€ΠΌΠ°Π»ΠΈ ΠΊ Π²Π΅Ρ€ΡˆΠΈΠ½Π°ΠΌ

for i := 1 to NumX - 1 do

for j := 1 to NumZ do

CalcNormals (D3DVector (i * Step, Landfi, j - 1].h, (j - 1) * Step),

D3DVector (i * Step, Land[i, j].h, j * Step),

DSDVector ((i + 1) * Step, Landfi + 1, j - l].h,

(j - 1) * Step), Land[i, j].VecNormal);

end;


Π”Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΈΠ· тСкстового Ρ„Π°ΠΉΠ»Π°. Π’ Π±ΡƒΡ„Π΅Ρ€Π΅ Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ отводятся для построСния ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π° Π»Π°Π½Π΄ΡˆΠ°Ρ„Ρ‚Π°:


function TfrmDSD.InitVB : HRESULT;

var

Vertices : ^TCustomVertex;

hRet : HRESULT;

t : TextFile;

wrkVec : TD3DVector;

begin

FDSDDevice.CreateVertexBuffer(20665 * SizeOf(TCustomVertex), 0,

DSD FVF_CUSTOMVERTEX,

D3DPOOL_DEFAULT, FD3DVB);

FD3DDevice.SetStreamSource(0, FD3DVB, SizeOf(TCustomVertex));

FD3DVB.Lock(0, 20665 * SizeOf(TCustomVertex), PByte(Vertices), 0);

Inc (Vertices); // ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ отводятся для построСния

Inc (Vertices); // ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π° Π»Π°Π½Π΄ΡˆΠ°Ρ„Ρ‚Π°

Inc (Vertices);

Inc (Vertices);

AssignFile (t, 'Boeing.txt1);

Reset (t);

while not EOF(t) do begin

Readln (t, wrkVec.X); // Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ Π²Π΅ΠΊΡ‚ΠΎΡ€ Π½ΠΎΡ€ΠΌΠ°Π»ΠΈ

Readln (t, wrkVec.Y);

Readln (t, wrkVec.Z);

// Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°

Readln (t, Vertices.X);

Readln (t, Vertices.Y);