Помогите мне, пожалуйста, выполнить задание с 3D моделью куба.
Задание такое, надо сделать так, чтобы каждая грань куба могла "жить" отдельно от самой фигуры.
Вот то, что у меня уже написано:
- Код: Выделить всё
public
{ public declarations }
end;
type T3DPoint = record
x,y,z:Double;
end;
var
F_3DGraf: TF_3DGraf;
Points3D:array of T3DPoint;
XAng,YAng,ZAng:Double;
M:array [0..2,0..2] of Double;
implementation
{$R *.lfm}
{ TF_3DGraf }
procedure TF_3DGraf.Button1Click(Sender: TObject);
begin
XAng:=StrToFloat(Edit1.Text)*3.14/180;
YAng:=StrToFloat(Edit2.Text)*3.14/180;
ZAng:=StrToFloat(Edit3.Text)*3.14/180;
SetLength(Points3D,24);
Points3D[0].x:=-50;Points3D[0].y:=-50;Points3D[0].z:=50;
Points3D[1].x:=50;Points3D[1].y:=-50;Points3D[1].z:=50;
Points3D[2].x:=50;Points3D[2].y:=50;Points3D[2].z:=50;
Points3D[3].x:=-50;Points3D[3].y:=50;Points3D[3].z:=50;
Points3D[4].x:=-50;Points3D[4].y:=-50;Points3D[4].z:=-50;
Points3D[5].x:=50;Points3D[5].y:=-50;Points3D[5].z:=-50;
Points3D[6].x:=50;Points3D[6].y:=50;Points3D[6].z:=-50;
Points3D[7].x:=-50;Points3D[7].y:=50;Points3D[7].z:=-50;
Points3D[8].x:=50;Points3D[8].y:=-50;Points3D[8].z:=50;
Points3D[9].x:=50;Points3D[9].y:=-50;Points3D[9].z:=-50;
Points3D[10].x:=50;Points3D[10].y:=50;Points3D[10].z:=-50;
Points3D[11].x:=50;Points3D[11].y:=50;Points3D[11].z:=50;
Points3D[12].x:=-50;Points3D[12].y:=-50;Points3D[12].z:=50;
Points3D[13].x:=-50;Points3D[13].y:=-50;Points3D[13].z:=-50;
Points3D[14].x:=-50;Points3D[14].y:=50;Points3D[14].z:=-50;
Points3D[15].x:=-50;Points3D[15].y:=50;Points3D[15].z:=50;
Points3D[16].x:=-50;Points3D[16].y:=-50;Points3D[16].z:=50;
Points3D[17].x:=-50;Points3D[17].y:=-50;Points3D[17].z:=-50;
Points3D[18].x:=50;Points3D[18].y:=-50;Points3D[18].z:=-50;
Points3D[19].x:=50;Points3D[19].y:=-50;Points3D[19].z:=50;
Points3D[20].x:=-50;Points3D[20].y:=50;Points3D[20].z:=50;
Points3D[21].x:=-50;Points3D[21].y:=50;Points3D[21].z:=-50;
Points3D[22].x:=50;Points3D[22].y:=50;Points3D[22].z:=-50;
Points3D[23].x:=50;Points3D[23].y:=50;Points3D[23].z:=50;
Canvas.Brush.Color := clBtnFace;
Canvas.Rectangle(0,0,Width,Height);
Canvas.Pen.Color:=RGBToColor(0,0,0);
Canvas.Pen.Width:=4;
Canvas.Brush.Color := clGreen;
Canvas.Polygon([Point(trunc(Points3D[4].x)+200, trunc(Points3D[4].y)+200),Point(trunc(Points3D[5].x)+200,trunc(Points3D[5].y)+200),
Point(trunc(Points3D[6].x)+200, trunc(Points3D[6].y)+200), Point(trunc(Points3D[7].x)+200, trunc(Points3D[7].y)+200)]);
Canvas.Brush.Color := clRed;
Canvas.Polygon([Point(trunc(Points3D[0].x)+200, trunc(Points3D[0].y)+200),Point(trunc(Points3D[1].x)+200,trunc(Points3D[1].y)+200),
Point(trunc(Points3D[2].x)+200, trunc(Points3D[2].y)+200), Point(trunc(Points3D[3].x)+200, trunc(Points3D[3].y)+200)]);
Canvas.Brush.Color := clBlue;
Canvas.Polygon([Point(trunc(Points3D[8].x)+200, trunc(Points3D[8].y)+200),Point(trunc(Points3D[9].x)+200,trunc(Points3D[9].y)+200),
Point(trunc(Points3D[10].x)+200, trunc(Points3D[10].y)+200), Point(trunc(Points3D[11].x)+200, trunc(Points3D[11].y)+200)]);
Canvas.Brush.Color := clLtGray;
Canvas.Polygon([Point(trunc(Points3D[12].x)+200, trunc(Points3D[12].y)+200),Point(trunc(Points3D[13].x)+200,trunc(Points3D[13].y)+200),
Point(trunc(Points3D[14].x)+200, trunc(Points3D[14].y)+200), Point(trunc(Points3D[15].x)+200, trunc(Points3D[15].y)+200)]);
Canvas.Brush.Color := clPurple;
Canvas.Polygon([Point(trunc(Points3D[16].x)+200, trunc(Points3D[16].y)+200),Point(trunc(Points3D[17].x)+200,trunc(Points3D[17].y)+200),
Point(trunc(Points3D[18].x)+200, trunc(Points3D[18].y)+200), Point(trunc(Points3D[19].x)+200, trunc(Points3D[19].y)+200)]);
Canvas.Brush.Color := clYellow;
Canvas.Polygon([Point(trunc(Points3D[20].x)+200, trunc(Points3D[20].y)+200),Point(trunc(Points3D[21].x)+200,trunc(Points3D[21].y)+200),
Point(trunc(Points3D[22].x)+200, trunc(Points3D[22].y)+200), Point(trunc(Points3D[23].x)+200, trunc(Points3D[23].y)+200)]);
Button2.Enabled:=true;
end;
procedure TF_3DGraf.Button2Click(Sender: TObject);
begin
Timer1.Enabled:=not Timer1.Enabled;
end;
procedure TF_3DGraf.Timer1Timer(Sender: TObject);
var x1,y1,z1:Double;
i,j:longint;
ordP:array of longint;
begin
SetLength(ordP,length(Points3D));
M[0,0]:=cos(zAng)*cos(yAng);
M[0,1]:=cos(zAng)*sin(yAng)*sin(xAng)+sin(zAng)*cos(xAng);
M[0,2]:=-cos(zAng)*sin(yAng)*cos(xAng)+sin(zAng)*sin(xAng);
M[1,0]:=-sin(zAng)*cos(yAng);
M[1,1]:=-sin(zAng)*-sin(yAng)*-sin(xAng)+cos(zAng)*cos(xAng);
M[1,2]:=-sin(zAng)*-sin(yAng)*cos(xAng)+cos(zAng)*sin(xAng);
M[2,0]:=sin(yAng);
M[2,1]:=-cos(yAng)*sin(xAng);
M[2,2]:=cos(yAng)*cos(xAng);
for i:=0 to length(Points3D)-1 do ordP[i]:=0;
for i:=0 to length(Points3D)-1 do
begin
x1:=Points3D[i].x*M[0,0]+Points3D[i].y*M[0,1]+Points3D[i].z*M[0,2];
y1:=Points3D[i].x*M[1,0]+Points3D[i].y*M[1,1]+Points3D[i].z*M[1,2];
z1:=Points3D[i].x*M[2,0]+Points3D[i].y*M[2,1]+Points3D[i].z*M[2,2];
Points3D[i].x:=x1;Points3D[i].y:=y1;Points3D[i].z:=z1;
for j:=0 to i-1 do
if Points3D[i].z>Points3D[j].z then ordP[i]:=ordP[i]+1
else ordP[j]:=ordP[j]+1;
end;
Canvas.Brush.Color := clBtnFace;
Canvas.Rectangle(0,0,Width,Height);
Canvas.Pen.Color:=RGBToColor(0,0,0);
Canvas.Pen.Width:=4;
for i:=0 to length(Points3D)-1 do
for j:=0 to length(Points3D)-1 do
if i=ordP[j]
then begin
if (j=0)or(j=1)or(j=2)or(j=3)
then begin
Canvas.Brush.Color := clRed;
Canvas.Polygon([Point(trunc(Points3D[0].x)+200, trunc(Points3D[0].y)+200),Point(trunc(Points3D[1].x)+200,trunc(Points3D[1].y)+200),
Point(trunc(Points3D[2].x)+200, trunc(Points3D[2].y)+200), Point(trunc(Points3D[3].x)+200, trunc(Points3D[3].y)+200)]);
end;
if (j=4)or(j=5)or(j=6)or(j=7)
then begin
Canvas.Brush.Color := clGreen;
Canvas.Polygon([Point(trunc(Points3D[4].x)+200, trunc(Points3D[4].y)+200),Point(trunc(Points3D[5].x)+200,trunc(Points3D[5].y)+200),
Point(trunc(Points3D[6].x)+200, trunc(Points3D[6].y)+200), Point(trunc(Points3D[7].x)+200, trunc(Points3D[7].y)+200)]);
end;
if (j=8)or(j=9)or(j=10)or(j=11)
then begin
Canvas.Brush.Color := clBlue;
Canvas.Polygon([Point(trunc(Points3D[8].x)+200, trunc(Points3D[8].y)+200),Point(trunc(Points3D[9].x)+200,trunc(Points3D[9].y)+200),
Point(trunc(Points3D[10].x)+200, trunc(Points3D[10].y)+200), Point(trunc(Points3D[11].x)+200, trunc(Points3D[11].y)+200)]);
end;
if (j=12)or(j=13)or(j=14)or(j=15)
then begin
Canvas.Brush.Color := clLtGray;
Canvas.Polygon([Point(trunc(Points3D[12].x)+200, trunc(Points3D[12].y)+200),Point(trunc(Points3D[13].x)+200,trunc(Points3D[13].y)+200),
Point(trunc(Points3D[14].x)+200, trunc(Points3D[14].y)+200), Point(trunc(Points3D[15].x)+200, trunc(Points3D[15].y)+200)]);
end;
if (j=16)or(j=17)or(j=18)or(j=19)
then begin
Canvas.Brush.Color := clPurple;
Canvas.Polygon([Point(trunc(Points3D[16].x)+200, trunc(Points3D[16].y)+200),Point(trunc(Points3D[17].x)+200,trunc(Points3D[17].y)+200),
Point(trunc(Points3D[18].x)+200, trunc(Points3D[18].y)+200), Point(trunc(Points3D[19].x)+200, trunc(Points3D[19].y)+200)]);
end;
if (j=20)or(j=21)or(j=22)or(j=23)
then begin
Canvas.Brush.Color := clYellow;
Canvas.Polygon([Point(trunc(Points3D[20].x)+200, trunc(Points3D[20].y)+200),Point(trunc(Points3D[21].x)+200,trunc(Points3D[21].y)+200),
Point(trunc(Points3D[22].x)+200, trunc(Points3D[22].y)+200), Point(trunc(Points3D[23].x)+200, trunc(Points3D[23].y)+200)]);
end;
end;
end;
end.