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

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

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

type

TCUSTOMVERTEX = packed record

X, Y, Z, RHW : Single;

Color : DWORD; // Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅

end;


ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ FVF-Ρ„Π»Π°Π³ задаСтся Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… мСстах ΠΊΠΎΠ΄Π°, Π²Π²ΠΎΠ΄ΠΈΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΡƒΡŽ константу, Ρ…Ρ€Π°Π½ΡΡ‰ΡƒΡŽ Π½ΡƒΠΆΠ½ΡƒΡŽ Π½Π°ΠΌ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ:


const

D3DFVF_COSTOMVERTEX = D3DFVF_XYZRHW or D3DFVF_DIFFUSE;

ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ эти константы, Π±Π΅Π·Ρ€Π°Π·Π»ΠΈΡ‡Π΅Π½, Π½ΠΎ порядок пСрСчислСния ΠΏΠΎΠ»Π΅ΠΉ Π² записи Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ графичСской систСмой. ΠŸΡ€ΠΈ считывании Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌΠΈ ΠΈΠ΄ΡƒΡ‚ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π²Π΅Ρ€ΡˆΠΈΠ½, Π·Π° Π½ΠΈΠΌΠΈ слСдуСт Ρ†Π²Π΅Ρ‚ (диффузная ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ).

Π˜Ρ‚Π°ΠΊ, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ прибавляСтся Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ константа, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π±ΡƒΠ΄Π΅ΠΌ Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠΊΠ° ΠΊΠ°ΠΊ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ρ€Π΅ΠΆΠΈΠΌΠ° ΠΎΠΊΡ€Π°ΡˆΠΈΠ²Π°Π½ΠΈΡ Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ².

ΠŸΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ массива Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΏΠΎΠ»Π΅ Ρ†Π²Π΅Ρ‚Π° заполняСтся случайным Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ:


for i := 0 to MAXPOINTS - 1 do

with VPoints [i] do begin

Z := 0.0;

RHW := 0.0;

Color := D3DCOLOR_XRGB(random (256), random (256), random (256));

end;


Π’ ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΌ ΠΊΠΎΠ΄ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½Π΅ содСрТит Π½ΠΈΡ‡Π΅Π³ΠΎ для нас Π½ΠΎΠ²ΠΎΠ³ΠΎ, поэтому Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒ Π΅Π³ΠΎ здСсь Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ (ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…14) ΠΎΠΊΡ€Π°ΡˆΠΈΠ²Π°Π½ΠΈΠ΅ Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для создания Ρ‡Π΅Ρ€Π½ΠΎ-Π±Π΅Π»ΠΎΠ³ΠΎ изобраТСния. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ вСсьма занятный: ΠΈΠ· ΠΎΠ±Π»Π°ΠΊΠ° хаотичСски Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‰ΠΈΡ…ΡΡ Ρ‚ΠΎΡ‡Π΅ΠΊ выстраиваСтся упорядочСнный ΠΎΠ±Ρ€Π°Π· (рис. 7.7).





Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‚ 20 898 ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ². ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΈΡ… Π·Π°Π΄Π°ΡŽΡ‚ΡΡ хаотичСски, для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ вычисляСтся шаг смСщСния. ВСкстовый Ρ„Π°ΠΉΠ» содСрТит ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ полоТСния Ρ‚ΠΎΡ‡ΠΊΠΈ. Π—Π° 100 шагов каТдая Ρ‚ΠΎΡ‡ΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ Ρ„ΠΈΠ½ΠΈΡˆΠ½ΠΎΠ³ΠΎ полоТСния:


type

TStep = packed record // Π’ΠΈΠΏ для хранСния скорости Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΏΠΎ осям

StepX, StepY : Single;

end;


var

Steps : Array [0..MAXPOINTS - 1] of TStep; // Π¨Π°Π³ΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ

function TfrmD3D.InitPoints : HRESULT;

var

pVertices : PByte;

hRet : HRESULT;

i : Integer;

t : TextFile;

wrkX, wrkY : Integer;

begin

AssignFile (t, 'points.txt');

Reset (t);

for i := 0 to MAXPOINTS - 1 do begin

ReadLn (t, wrkX, wrkY);

with VPoints [i] do begin

X := random (240);

Y := random (289) ;

// КаТдая Ρ‚ΠΎΡ‡ΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ своСго полоТСния Π·Π° 100 шагов

Steps [i].StepX := (wrkX - X) / 100;

Steps [i].StepY := (wrkY - Y) / 100;

Z := 0.0;

RHW := 0.0;

Color := 0;

end;


end;


CloseFile (t);

...

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ Pointsize управляСт Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Ρ‚ΠΎΡ‡ΠΊΠΈ, ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ установлСно Π² 5.0. ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ Ρ‚ΠΎΡ‡ΠΊΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π΅Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ ΠΈ Ρ‡Π΅Ρ€Π΅Π· 100 шагов Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΡ‚Π°Ρ‚ΡŒ Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Ρ‹ΠΌ:


function TfrmD3D.MovePoints : HRESULT;

var

pVertices : PByte; hRet : HRESULT;

i : Integer;

begin

PointSize := PointSize - 0.04; // УмСньшСниС Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ‚ΠΎΡ‡ΠΊΠΈ.

FD3DDevice.SetRenderState( D3DRS_POINTSIZE, PDWORD(@PointSize)");

for i := 0 to MAXPOINTS - 1 do begin

with VPoints [i] do begin

X := X +- Steps [i].StepX; // ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΡ‡ΠΊΠΈ

Y := Y + Steps [i].StepY;

end;


end;


Π’ Ρ†ΠΈΠΊΠ»Π΅ оТидания сообщСния подсчитываСтся количСство ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ полоТСния Ρ‚ΠΎΡ‡Π΅ΠΊ. Для ΠΈΡ… ΠΏΠ΅Ρ€Π²ΠΎΠΉ сотни вызываСтся функция MovePoints. Π¨ΠΎΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ΠΌ ΠΏΡ€ΠΎΠ±Π΅Π»Π°:


procedure TfrmDSD.FormKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

begin

if Key = VK_ESCAPE then Close else

if Key = VK_SPACE then begin

InitPoints; // Π—Π°Π½ΠΎΠ²ΠΎ разбрасываСм Ρ‚ΠΎΡ‡ΠΊΠΈ

PointSize := 5.0; // Π Π°Π·ΠΌΠ΅Ρ€ Ρ‚ΠΎΡ‡Π΅ΠΊ снова пятикратный

Count := 0; // ΠžΡ‡Π΅Ρ€Π΅Π΄Π½Π°Ρ сотня ΠΊΠ°Π΄Ρ€ΠΎΠ²

end;


end;


Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈΠ· ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…15, построСн ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠΉ схСмС, Π½ΠΎ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ Π½Π° сСкунду ΠΏΠΎΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ всю ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΎΠΊΠ½Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Ρ‚Π΅ΠΌ снова Ρ€Π°Π·Π»Π΅Ρ‚Π΅Ρ‚ΡŒΡΡ (рис. 7.8).





Для задания ΠΎΠ±Ρ€Π°Π·Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ растровоС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 200x146 пиксСлов, Ρ†Π²Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π° опрСдСляСтся Ρ†Π²Π΅Ρ‚ΠΎΠΌ пиксСла растра:



const

MAXPOINTS = 200 * 146;

function Tf Π³Ρ‚Π°ΠžΠ—Πž.InitPoints : HRESULT;

var

pVertices : PByte;

hRet : HRESULT;

i, j, k : Integer;

bmp : TBitMap;

R, G, Π’ : Byte;

begin

bmp := TBitMap.Create;

bmp.LoadFromFile ('Claudia.bmp'); // Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° растра

k := 0;

for i := 0 to 199 do

for j := 0 to 145 do begin

with VPoints [k] do begin

X := random (145);

Y := random (200);

Steps [i, j].StepX := (j - X) / 10;

Steps [i, j].StepY := (i - Y) / 10;

Z := 0.0;

// Π¦Π²Π΅Ρ‚ΠΎΠ²Ρ‹Π΅ вСса пиксСла растра

R := GetRValue (bmp.Canvas.Pixels [j, i]);

G := GetGValue (bmp.Canvas.Pixels [j, i]);

Π’ := GetBValue (bmp.Canvas.Pixels [j, i]) ;

RHW := 0.0;

Color := D3DCOLOR__XRGB(R, G, B); // Π¦Π²Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π°

end;


Inc (k);

end;


bmp.Free ;

...

ΠŸΡ€ΠΈΡ€Π°Ρ‰Π΅Π½ΠΈΡ ΠΏΠΎ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π° 10 шагов Ρ‚ΠΎΡ‡ΠΊΠ° Π΄ΠΎΠ±Ρ€Π°Π»Π°ΡΡŒ Π΄ΠΎ Ρ„ΠΈΠ½ΠΈΡˆΠ°. Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ, достигнув Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ полоТСния, ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡŽΡ‚ Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ дальшС, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ завСтная ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° появляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° ΠΌΠΈΠ³. Π§Π΅Ρ€Π΅Π· ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ 20 ΠΊΠ°Π΄Ρ€ΠΎΠ² Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ двиТСния Ρ‚ΠΎΡ‡ΠΊΠΈ мСняСтся Π½Π° ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΠ΅:


var

Steps : Array [0..199, 0..145] of TStep;

procedure TfrmD3D.ApplicationEventslIdle(Sender: TObject;

var Done: Boolean);

var

hRet : HRESULT;

i, j : Integer;

begin

if FActive then begin

Inc (Frames);

hRet := Render;

if FAILED(hRet) then begin

FActive := False;

ErrorOut ('Render', hRet);

Exit;

end;


ThisTickCount := GetTickCount;

if ThisTickCount - LastTickCount > 25 then begin Caption := Format('%6.2f ,

[frames * 1000 / (ThisTickCount - LastTickCount)]);

Frames := 0; Inc (Count);

// Π¦ΠΈΠΊΠ» двиТСния Ρ‚ΠΎΡ‡Π΅ΠΊ Π² 20 ΠΊΠ°Π΄Ρ€ΠΎΠ²

if Count <= 20 then MovePoints else begin

for i := 0 to 199 do

for j := 0 to 145 do begin

Steps [i, jJ.StepX := -Steps [i, j].StepX;

Steps [i, jJ.StepY := -Steps [i, jj.StepY;

end;


Count := 0;

end;


end;


LastTickCount := GetTickCount;

end;


Done := False;

end;


ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ клиСнтская ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΎΠΊΠ½Π° Π² этих Π΄Π²ΡƒΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… нСквадратная, Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ Π΅Π³ΠΎ ΠΏΠΎΠ΄ΠΎΠ³Π½Π°Π½Ρ‹ для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… ΠΎΠ±Ρ€Π°Π·ΠΎΠ² ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ².

Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ Π½Π°ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ ΠΈΠ· ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΎΡ‡Π΅ΠΊ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ вСсьма слоТныС ΠΎΠ±Ρ€Π°Π·Ρ‹, Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ годится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для простых, ΠΈΠ»ΠΈ тСстовых ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΈ Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. На количСство ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² систСмой Π½Π°Π»ΠΎΠΆΠ΅Π½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅, ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с дСсятками тысяч ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ², ΠΊΠ°ΠΊ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ ΠΈΠ· этого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ сущСствСнному сниТСнию FPS.

ΠžΡ‚Ρ€Π΅Π·ΠΊΠΈ

Для рисования ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΎΠ² Π² Direct3D прСдусмотрСны Π΄Π²Π° Ρ‚ΠΈΠΏΠ° ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ²: нСзависимыС ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΈ ΠΈ связанныС ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΈ. НачнСм постиТСниС этой Ρ‚Π΅ΠΌΡ‹ с ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΈΠ· этой ΠΏΠ°Ρ€Ρ‹ Ρ‚ΠΈΠΏΠ° ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ².

Для построСния нСзависимых ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΎΠ² ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° DrawPrimitive указываСтся константа D3DΠ Π’_LINELISΠ’. По считываСмым ΠΏΠΎΠΏΠ°Ρ€Π½ΠΎ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Π΅Ρ€ΡˆΠΈΠ½Π°ΠΌ строятся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅, нСсвязанныС, ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΈ прямой.

НСслоТный ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ· ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…1Π± являСтся ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠ΅ΠΉ Π½Π° эту Ρ‚Π΅ΠΌΡƒ. На экранС строятся Π΄Π²Π° ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ° красного Ρ†Π²Π΅Ρ‚Π°, ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Ρƒ. ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π²Π΅Ρ€ΡˆΠΈΠ½ хранятся Π² чСтырСхэлСмСнтном массивС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° TCUSTOMVERTEX. ΠœΠ°ΡΡΠΈΠ²Ρ‹ Π·Π°ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: значСния ΠΏΠΎΠ»Π΅ΠΉ ΠΏΠ΅Ρ€Π²Ρ‹Ρ… Π΄Π²ΡƒΡ… элСмСнтов ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Π½Π°Ρ‡Π°Π»ΠΎ ΠΈ ΠΊΠΎΠ½Π΅Ρ† ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ°, послСдниС Π΄Π²Π° элСмСнта массива относятся ΠΊΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΎΡ‚Ρ€Π΅Π·ΠΊΡƒ.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ собствСнно ΠΏΡ€ΠΈ построСнии ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² послСдним Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ пСрСдаСтся Π½Π΅ количСство Π²Π΅Ρ€ΡˆΠΈΠ½, Π° количСство ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ²:


hRet := FD3DDevice. DrawPrimitive (D3DPT_LINELIST, 0, 2) ;


Если Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΡ… ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ°, нСдостаточно, ошибка Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π΅ станСт, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ всС Π½Π΅Π΄ΠΎΡΡ‚Π°ΡŽΡ‰ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒΡΡ Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌΠΈ.

ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π° D3DΠ Π’_LINELISΠ’ являСтся ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠΌ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π° - Π³Ρ€ΡƒΠΏΠΏΡ‹ связанных ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΎΠ². Π’ этом случаС Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹, считываСмыС ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π·Π°Π΄Π°ΡŽΡ‚ характСристики Π²Π΅Ρ€ΡˆΠΈΠ½, ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ соСдиняСмых ΠΎΡ‚Ρ€Π΅Π·ΠΊΠ°ΠΌΠΈ прямой.

Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…17 создаСтся ΠΏΡΡ‚ΠΈΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ (рис. 7.9), Π² построСнии ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡΡ‚ΡŒ связанных ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΎΠ².





Для получСния ΠΏΡΡ‚ΠΈΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° трСбуСтся ΡˆΠ΅ΡΡ‚ΡŒ Ρ‚ΠΎΡ‡Π΅ΠΊ, ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΈ послСднСй ΠΈΠ· Π½ΠΈΡ… ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΆΠΈΠ²ΠΈΡ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ, Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΎΠΏΠΈΡ€Π°ΡŽΡ‚ΡΡ Π½Π° ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‰Π΅Π΅ΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Angle:


for i := 0 to 5 do

with VPoints [i] do begin

X := 150 + cos (Angle +1*2* Pi /5) * Radius;

Y := 150 + sin (Angle +i*2*Pi/5) * Radius;

end;


ΠžΠ±Ρ€Π°Ρ‰Π°ΡŽ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° воспроизвСдСния ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ²:


hRet := FD3DDevice.DrawPrimitive(D3DPT_LINESTRIP, 0, 5);

НадСюсь, ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠ΄ вопросов Ρƒ вас Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΌ стоит ΠΎΠ±ΡΡƒΠ΄ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ Π²ΠΎΡΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ нСсколько нСзависимых Π³Ρ€ΡƒΠΏΠΏ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ². ΠžΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅ воспроизвСдСниС ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ способами: Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ Π² ΠΎΠ΄Π½ΠΎΠΌ Π±ΡƒΡ„Π΅Ρ€Π΅, Π»ΠΈΠ±ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±ΡƒΡ„Π΅Ρ€Ρ‹ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΡ‹ Π²Π΅Ρ€ΡˆΠΈΠ½.

Π Π°Π·Π±Π΅Ρ€Π΅ΠΌ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…18. На экранС Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Π΄Π²Π° ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°: ΠΏΡΡ‚ΠΈΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ ΠΈ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ (рис. 7.10).





Массив vpoints Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ 11 Π²Π΅Ρ€ΡˆΠΈΠ½: ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 6 связаны с ΠΏΡΡ‚ΠΈΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠΌ, ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для построСния ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π°.

ΠšΠ²Π°Π΄Ρ€Π°Ρ‚ ΠΈ ΠŸΠ΅Π½Ρ‚Π°Π³ΠΎΠ½ Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½Ρ‹Π΅ стороны с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ скоростями:


for i := 0 to 5 do // ΠŸΠ΅Ρ€Π²Ρ‹ΠΌΠΈ хранятся ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π²Π΅Ρ€ΡˆΠΈΠ½ ΠŸΠ΅Π½Ρ‚Π°Π³ΠΎΠ½Π°

with VPoints [i] do begin

X := 150 + cos (Angle + i * 2 * Pi / 5) * Radius;

Y := 150 + sin (Angle +i*2*Pi/5) * Radius;

end;


for i := 0 to 4 do // ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π°

with VPoints [6 + i] do begin

// Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ вращСния ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π° ΡƒΠ΄Π²ΠΎΠ΅Π½Π°

X := 150 + cos (- 2 * Angle - i * Pi / 2) * Radius / 2;

Y := 150 + sin (- 2 * Angle - i * Pi / 2) * Radius / 2;

end;


БобствСнно ΠΏΡ€ΠΈ построСнии ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ Drawprimitive обращаСмся Π΄Π²Π°ΠΆΠ΄Ρ‹, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ строим Π΄Π²Π΅ нСзависимыС Ρ„ΠΈΠ³ΡƒΡ€Ρ‹. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°:


hRet := FD3DDevice.DrawPrimitive(D3DPT_LINESTRIP, 0, 5);

if FAILED(hRet) then begin