Π ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΠ΅ΡΠ΅ΠΉΠ΄Π΅ΠΌ ΠΊ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌΡ ΠΏΡΠΈΠΌΠ΅ΡΡ, ΠΏΡΠΎΠ΅ΠΊΡΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° ΠΡ 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);