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