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

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

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

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);

Readln (t, Vertices.Z); .

// Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΡŽΡ‚ΡΡ

Vertices.X := Vertices.X / 3;

Vertices.Y := Vertices.Y / 3;

Vertices.Z := Vertices.Z / 3;

Vertices.normVector := wrkVec;

Vertices.Color := $00808080; // Π¦Π²Π΅Ρ‚ - сСрСбристый

Inc (Vertices);

Readln (t, Vertices.X);

Readln (t, Vertices.Y);

Readln (t, Vertices.Z);

Vertices.X := Vertices.X / 3;

Vertices.Y := Vertices.Y / 3;

Vertices.Z := Vertices.Z / 3;

Vertices.normVector := wrkVec;

Vertices.Color := $00808080;

Inc (Vertices);

Readln (t, Vertices.X);

Readln (t, Vertices.Y);

Readln (t, Vertices.Z) ;

Vertices.X := Vertices.X / 3;

Vertices.Y := Vertices.Y / 3;

Vertices.Z := Vertices.Z / 3;

Vertices.normVector := wrkVec;

Vertices.Color := $00808080;

Inc (Vertices);

end;


CloseFile (t); FD3DVB.Unlock;

Result := FD3DDevice.SetVertexShader(D3DFVF_CUSTOMVERTEX);

end;


ПослС считывания Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΏΠΎΠ²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌ Π΅Π΅ Π²ΠΎΠΊΡ€ΡƒΠ³ собствСнных осСй:


procedure TfrmD3D.FormCreate(Sender: TObject);

var

hRet : HRESULT;

matView, matProj : TD3DMatrix;

matWrkl, matWrk2 : TDSDMatrix;

begin

Randomize; // Π›Π°Π½Π΄ΡˆΠ°Ρ„Ρ‚ гСнСрируСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΠΎ-Π½ΠΎΠ²ΠΎΠΌΡƒ

ShowCursor (False); // УстанавливаСм полноэкранный Ρ€Π΅ΠΆΠΈΠΌ

hRet := InitD3D;

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

hRet := InitVB;

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

SetupLights;

// ΠŸΠΎΠ²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌ самолСт

SetRotateXMatrix(matWrkl, Pi / 2);

SetRotateZMatrix(matWrk2, Pi);

SetTranslateMatrix (matAirplan, 7.0, 2.0, 5.0);

// ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° трансформаций для самолСта

matAirplan := MatrixMul (matAirplan, MatrixMul (matWrk2, matWrkl));

GenLand; // Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ Π»Π°Π½Π΄ΡˆΠ°Ρ„Ρ‚ ΠΏΠ΅ΠΉΠ·Π°ΠΆΠ°

SetViewMatrix(matView, D3DVector(16, 2.5, 5),

D3DVector(0, 0, 5), D3DVector(0, 1, 0));

FD3DDevice.SetTransform(D3DTS_VIEW, matView);

SetProjectionMatrix(matProj, 1, 1, 1, 15);

FD3DDevice.SetTransform(D3DTS_PROJECTION, matProj);

end;


Π›Π°Π½Π΄ΡˆΠ°Ρ„Ρ‚ рисуСтся Π½Π° основС Π΄Π°Π½Π½Ρ‹Ρ… массива, ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΠΊΠ°ΠΌ:


arocedure TfrmDSD.DrawArea(const x, Ρƒ : Integer);

var

Vertices : ATCustomVertex;

b egin

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

Vertices.X := x * Step;

Vertices.Y := Land[x, Ρƒ - 1].h;

Vertices.Z := (y - 1) * Step;

Vertices.normVector := Land[x, Ρƒ - 1].VecNormal;

Vertices.Color := Land[x, Ρƒ - 1].Color;

Inc (Vertices);

Vertices.X := x * Step;

Vertices.Y := Landfx, y].h;

Vertices.Z := Ρƒ * Step;

Vertices.normVector := Land[x, y].VecNormal;

Vertices.Color := Landfx, y].Color;

Inc (Vertices);

Vertices.X := (x + 1) * Step;

Vertices.Y := Landfx + 1, Ρƒ - 1].h;

Vertices.Z := (y - 1) * Step;

Vertices.normVector := Land[x + 1, Ρƒ - 1].VecNormal;

Vertices.Color := Land[x + 1, Ρƒ - 1].Color;

Inc (Vertices);

Vertices.X := (x + 1) * Step;

Vertices.Y := Land[x +1, y].h;

Vertices.Z := Ρƒ * Step;

Vertices.normVector := Land[x + 1, y].VecNormal;

Vertices.Color := Land[x + 1, y].Color;

FD3DVB.Unlock;

FD3DDevice.DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2) ;

end;


function TfrmD3D.Render : HRESULT;

var

hRet : HRESULT;

i, j :Integer;

begin

// Π­ΠΊΡ€Π°Π½ ΠΎΠΊΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ Π³ΠΎΠ»ΡƒΠ±ΠΎΠ²Π°Ρ‚Ρ‹ΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ

FD3DDevice.Clear(0, nil, D3DCLEARJTARGET or D3DCLEAR_ZBUFFER,

$00000FFF, 1.0, 0);

FD3DDevice.BeginScene; with FD3DDevice do begin

SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);

// Π’Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΈ Π»Π°Π½Π΄ΡˆΠ°Ρ„Ρ‚Π° ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ ΠΏΠΎ часовой стрСлкС

SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);

// Π’Π΅Ρ€ΡˆΠΈΠ½Ρ‹ Π»Π°Π½Π΄ΡˆΠ°Ρ„Ρ‚Π° сгСнСрированы Π² ΠΌΠΈΡ€ΠΎΠ²ΠΎΠΉ систСмС ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚

SetTransform(D3DTS_WORLD, IdentityMatrix);

end;


// Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΠΊΠΈ Π»Π°Π½Π΄ΡˆΠ°Ρ„Ρ‚Π°

for j := 2 to NumZ - 1 do

for i := 1 to NumX - 5 do DrawArea(i,j);

with FD3DDevice do begin

// УстанавливаСтся ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° трансформаций самолСта

SetTransform(D3DTS_WORLD, matAirplan);

// Π’Π΅Ρ€ΡˆΠΈΠ½Ρ‹ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΡ‚ΠΈΠ² часовой стрСлки

SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);

// Π”Π°Π½Π½Ρ‹Π΅ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ, начиная с Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΎΠΉ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹

DrawPrimitive(D3DPT_TRIANGLELIST, 4, 20661 div 3);

end;


FD3DDevice.EndScene;

Result := FDSDDevice.Present(nil, nil, 0, nil) ;

end;


ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ нарисован самолСт, Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ трансформациСй ΠΌΠΈΡ€ΠΎΠ²ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ остаСтся ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° трансформаций нашСй ΠΌΠΎΠ΄Π΅Π»ΠΈ, поэтому ΠΏΠ΅Ρ€Π΅Π΄ рисованиСм Π»Π°Π½Π΄ΡˆΠ°Ρ„Ρ‚Π° Π·Π°Π΄Π°Π΅ΠΌ здСсь ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ идСнтичности.

ΠŸΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ пСрСрисовкС ΠΊΠ°Π΄Ρ€Π° Π»Π°Π½Π΄ΡˆΠ°Ρ„Ρ‚ цикличСски сдвигаСтся, Π° самолСт поворачиваСтся Π²ΠΎΠΊΡ€ΡƒΠ³ своСй оси Π½Π° нСбольшой ΡƒΠ³ΠΎΠ»:


procedure MoveLand; // ЦикличСскоС Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΠΉΠ·Π°ΠΆΠ°

var

i, j : Integer;

TempLand : array [l..NumX] of LandParam; // Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ массив begin

// Π—Π°ΠΏΠΎΠΌΠ½ΠΈΠ»ΠΈ строку массива Π»Π°Π½Π΄ΡˆΠ°Ρ„Ρ‚Π°

for i := 1 to NuraX do TempLand[i] := Land[i,NumZ];

// Π‘Π΄Π²ΠΈΠ³Π°Π΅ΠΌ Π»Π°Π½Π΄ΡˆΠ°Ρ„Ρ‚

for j := NumZ downto 2 do

for i := 1 to NumX do Land[i,j] := Landfi,j-1]; // ΠšΡ€ΡƒΠ³ΠΎΠ²ΠΎΠ΅ появлСниС послСднСй строки массива

for i := 1 to NumX do Land[i,l] := TempLand[i];

end;


procedure TfrmDSD.ApplicationEventslIdle(Sender: TObject;

var Done: Boolean);

var

matWrk : TD3DMatrix;

begin

if FActive then begin

Render; // Нарисовали ΠΊΠ°Π΄Ρ€

MoveLand; // ΠŸΠ΅Ρ€Π΅Π΄Π²ΠΈΠ½ΡƒΠ»ΠΈ Π»Π°Π½Π΄ΡˆΠ°Ρ„Ρ‚

SetRotateYMatrix(matWrk, 0.1); // ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° для нСбольшого ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π°

matAirplan := MatrixMul (matAirplan, matWrk); // ΠŸΠΎΠ²ΠΎΡ€ΠΎΡ‚ самолСта

end;


Done := False;

end;


Для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π² ΠΊΠΎΠ΄Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ я ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π° Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π΄Π²Π° Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… источника свСта, ΠΈ, самоС Π³Π»Π°Π²Π½ΠΎΠ΅, Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π²Π΅Ρ€ΡˆΠΈΠ½ с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ Π½ΠΎΡ€ΠΌΠ°Π»ΠΈ ΠΈ Ρ†Π²Π΅Ρ‚Π° позволяСт Π²ΠΎΡΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΡƒΡ…ΠΈΡ‰Ρ€Π΅Π½ΠΈΠΉ. Π’ самом Π΄Π΅Π»Π΅, Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹, ΠΈ Ρ‚Π°ΠΊΠΎΠΉ способ ΠΎΠΊΡ€Π°ΡˆΠΈΠ²Π°Π½ΠΈΡ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² являСтся самым простым ΠΈ быстрым.

Однако Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ сильно пСрСрасходуСм ΠΏΠ°ΠΌΡΡ‚ΡŒ, вСдь Π΄Π²Π΅ тысячи Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ² ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΎΠΊΡ€Π°ΡˆΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΎΠ΄Π½ΠΈΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ, Π° для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΌΡ‹ Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½Ρ‹ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Ρ†Π²Π΅Ρ‚. ΠŸΡ€ΠΈ использовании ΠΆΠ΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π° ΠΏΠ°ΠΌΡΡ‚ΡŒ сильно экономится, Π½ΠΎ ΠΌΡ‹ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Ρ‚ΠΎΠ³Π΄Π° сглаТиваниС Ρ†Π²Π΅Ρ‚ΠΎΠ² для Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ² Π»Π°Π½Π΄ΡˆΠ°Ρ„Ρ‚Π°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…09 подсказываСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅. Π—Π΄Π΅ΡΡŒ Π½Π° Ρ„ΠΎΠ½Π΅ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Π»Π°Π½Π΄ΡˆΠ°Ρ„Ρ‚Π°, Ρ‡Ρ‚ΠΎ ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Π³ΠΎΡ€Π΄ΠΎ ΠΏΠ°Ρ€ΠΈΡ‚ ΠΎΡ€Π΅Π» (рис. 9.10).





Π’ΠΊΡ€Π°Ρ‚Ρ†Π΅ ΡΡƒΡ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ словами: Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π΄Π²Π° Π±ΡƒΡ„Π΅Ρ€Π° Π²Π΅Ρ€ΡˆΠΈΠ½ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ², ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ†Π²Π΅Ρ‚ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°:


type

TCUSTOMVERTEXLand = packed record

X, Y, Z : Single;

normVector : TD3DVector;

Color : DWORD;

end;


TCUSTOMVERTEXEagle = packed record

X, Y, Z :


Single;

normVector : TD3DVector;

end;


const

D3DFVF_CUSTOMVERTEXLand = D3DFVF_XYZ or D3DFVF_NORMAL or

D3DFVFJJIFFUSE; D3DFVF CUSTOMVERTEXEagle = D3DFVF_XYZ or D3DFVF_NORMAL;

ΠŸΡ€ΠΈ воспроизвСдСнии ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΈ источников, задавая Π² качСствС Ρ‚Π°ΠΊΠΎΠ²Ρ‹Ρ… Π±ΡƒΡ„Π΅Ρ€Ρ‹, содСрТащиС Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ². ΠŸΡ€ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ сущСствСнно экономится ΠΏΠ°ΠΌΡΡ‚ΡŒ.

ОсобоС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π½Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊ Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ заполняСтся Π±ΡƒΡ„Π΅Ρ€ Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΌΠΎΠ΄Π΅Π»ΠΈ. РСкомСндованная мною ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π² качСствС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π½Π° языкС C++. Для ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ этого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° я Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Π°ΠΉΠ» ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π» Π² ΠΊΠΎΠ΄ Π½Π° языкС Pascal. Π­Ρ‚ΠΎ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅ слоТно, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ большая Π΅Π³ΠΎ Ρ‡Π°ΡΡ‚ΡŒ прСдставляСт собой массивы Π΄Π°Π½Π½Ρ‹Ρ…. Волько имя массива, содСрТащСго Π΄Π°Π½Π½Ρ‹Π΅ Π²Π΅Ρ€ΡˆΠΈΠ½, ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π° Avertices, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ появилось ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Vertices.

ΠŸΠ΅Ρ€Π²Ρ‹Π΅ 13 строк Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ. Π’Π°ΠΊΠΆΠ΅ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ послСдниС строки ΠΊΠΎΠ΄Π°, начиная со строки GLint GenSoobjectListΠΎ. Π’ ΠΎΡΡ‚Π°Π²ΡˆΠ΅ΠΌΡΡ Ρ„Π°ΠΉΠ»Π΅ ΡƒΠ±ΠΈΡ€Π°ΡŽΡ‚ΡΡ всС символы f, ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ запятой ΠΈ Ρ„ΠΈΠ³ΡƒΡ€Π½ΠΎΠΉ скобкС. Π”Π°Π»Π΅Π΅ всС Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π½Π° ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅.

ПослСднСС, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ - ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ синтаксис описания массиюв. НапримСр, такая строка

tatic GLint face_indicies[1200][9]

замСняСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ:


ace_indicies : array [0..1199, 0..8] of integer

Π’ΠΈΠΏ GLfloat замСняСтся Ρ‚ΠΈΠΏΠΎΠΌ single, ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ†Π΅Π»ΠΎΠΌΡƒ.

Π’ΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» с Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ include ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΊ Π³ΠΎΠ»ΠΎΠ²Π½ΠΎΠΌΡƒ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ Ρ€ΠΎΠ΅ΠΊΡ‚Π° (Π² ΡΠ΅ΠΊΡ†ΠΈΡŽ const), Π° ΠΊΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±ΡƒΡ„Π΅Ρ€Π° становится рактичСски ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΌ, Π² зависимости ΠΎΡ‚ ΠΌΠΎΠ΄Π΅Π»ΠΈ мСняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ чисо, Π·Π°Π΄Π°ΡŽΡ‰Π΅Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΡ„Π΅Ρ€Π°. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, ΠΈ это число ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΎΠΏΠΈΡ€Π°ΡŽΡ‰Π΅ΠΌΡΡ Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ массива normals. Π’Π°ΠΊΠΆΠ΅, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΡ‚Ρ€Π΅-уСтся ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±Π½Ρ‹ΠΉ ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒ:


unction TfrmD3D.InitVBEagle : HRESULT;

var

Vertices : ~TCustomVertexEagle;

hRet : HRESULT;

i, j : Integer;

vi : Integer; // ИндСкс Π²Π΅Ρ€ΡˆΠΈΠ½ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ²

ni : Integer; // ИндСкс Π½ΠΎΡ€ΠΌΠ°Π»Π΅ΠΉ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ²

begin

hRet := FDSDDevice.CreateVertexBuffer(10500 *

SizeOf(TCustomVertexEagle), 0, D3DFVF_CUSTOMVERTEXEagle, D3DPOOL_DEFAULT, FD3DVBEagle);

if Failed(hRet) then begin

Result := hRet;

Exit;

end;


hRet := FD3DVBEagle.Lock(0, 10500 * SizeOf(TCustomVertexEagle),

PByte(Vertices), 0) ;

if Failed(hRet) then begin

Result := hRet;

Exit;

end;


// Π¦ΠΈΠΊΠ» заполнСния Π±ΡƒΡ„Π΅Ρ€Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈΠ· массивов

for i := 0 to sizeof(face_indicies) div sizeof(face__indicies[0]) - 1 do for j := 0 to 2 do begin

vi := face_indicies[i][j]; // ИндСкс фасСта

ni := face_indicies[i] [j+3]; // ИндСкс Π½ΠΎΡ€ΠΌΠ°Π»ΠΈ фасСта

// Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌ, умноТая Π½Π° 5

Vertices.X := Avertices[vi][0] * 5;

Vertices.Y := Avertices[vi][1] * 5;

Vertices.Z := Avertices[vi][2] * 5;

Vertices.normVector.X := normals[ni] [0] ;

Vertices.normVector.Y := normals[ni][1];

Vertices.normVector.Z := normals[ni][2];

Inc(Vertices);

end;


Result := FDSDVBEagle.Unlock;

end;


ΠŸΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· устанавливаСтся ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π», Π° ΠΏΡ€ΠΈ воспроизвСдСнии Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ, ΠΎΠΊΡ€Π°ΡˆΠΈΠ²Π°Π½ΠΈΠ΅ производится исходя ΠΈΠ· Ρ†Π²Π΅Ρ‚ΠΎΠ²ΠΎΠΉ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹, Π»ΠΈΠ±ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ установлСнный ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»:


with FDSDDevice do begin

SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);

SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);

// Для Π»Π°Π½Π΄ΡˆΠ°Ρ„Ρ‚Π° Ρ†Π²Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² задаСтся Ρ†Π²Π΅Ρ‚ΠΎΠ²ΠΎΠΉ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ Π²Π΅Ρ€ΡˆΠΈΠ½

SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR1);

SetTransform(D3DTS_WORLD, IdentityMatrix); // Π’Ρ‹ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ источник,

// ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ для освСщСния Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠΎΠ΄Π΅Π»ΠΈ

LightEnable(2, False);

SetStreamSource(0, FD3DVBLand, SizeOf(TCustomVertexLand));

SetVertexShader(D3DFVF_CUSTOMVERTEXLand);