以下学生時代に作っていたソフトの一部。このころはバリバリだった……
{ * * 表示 * * }
procedure TGameSight.DrawPolygon;
var
ViewPos : array [1..140,1..4] of TriPoint;{視点からの座標}
FaceLight : array [1..140] of single; {明るさの割合}
DrawNr : array [1..140] of integer;
DFace : array [1..140] of wordbool;
DF : integer;
procedure SetViewPos(var Ut : TUnitP);{視点回転}
var
H,I : integer;
AdX,AdY,AdZ,Spd,
Pre,CX,CY,CZ,SX,SY,SZ : single;
begin{Sub Main}
with Ut.Sta do if Burst and (Count <= 15) then
begin
CX := Cos(Turn.X);
SX := Sin(Turn.X);
CY := Cos(Turn.Y);
SY := Sin(Turn.Y);
CZ := Cos(Turn.Z);
SZ := Sin(Turn.Z);
for H := 1 to Ut.AllFace do with Ut.CG[H] do
begin
I := 16 - Count;
if (H mod 2) = 0 then Spd := I * ((H mod 4)+1)
else Spd := 0;
Pre := (Pos[1].X*Pos[1].X + Pos[1].Y*Pos[1].Y + Pos[1].Z*Pos[1].Z);
if Pre = 0 then Pre := 99999999 else Pre := Sqrt(Pre);
AdX := (Pos[1].X / Pre) * Spd;
AdY := (Pos[1].Y / Pre) * Spd;
AdZ := (Pos[1].Z / Pre) * Spd;
for I := 1 to Ut.CG[H].Line do
begin
ViewPos[H,I].X := Ut.CG[H].Pos[I].X + AdX;
ViewPos[H,I].Y := Ut.CG[H].Pos[I].Y + AdY;
ViewPos[H,I].Z := Ut.CG[H].Pos[I].Z + AdZ;
Pre := ViewPos[H,I].Y;
ViewPos[H,I].Y := ViewPos[H,I].Y * CX - ViewPos[H,I].X * SX;
ViewPos[H,I].Z := ViewPos[H,I].Z * CX + Pre * SX;
Pre := ViewPos[H,I].X;
ViewPos[H,I].X := ViewPos[H,I].X * CY - ViewPos[H,I].Z * SY;
ViewPos[H,I].Z := ViewPos[H,I].Z * CY + Pre * SY;
Pre := ViewPos[H,I].X;
ViewPos[H,I].X := ViewPos[H,I].X * CZ - ViewPos[H,I].Y * SZ;
ViewPos[H,I].Y := ViewPos[H,I].Y * CZ + Pre * SZ;
end;
end;
end else
begin
CX := Cos(Turn.X);
SX := Sin(Turn.X);
CY := Cos(Turn.Y);
SY := Sin(Turn.Y);
CZ := Cos(Turn.Z);
SZ := Sin(Turn.Z);
for H := 1 to Ut.AllFace do
for I := 1 to Ut.CG[H].Line do
begin
ViewPos[H,I].Y := Ut.CG[H].Pos[I].Y * CX - Ut.CG[H].Pos[I].X * SX;
ViewPos[H,I].Z := Ut.CG[H].Pos[I].Z * CX + Ut.CG[H].Pos[I].Y * SX;
ViewPos[H,I].X := Ut.CG[H].Pos[I].X * CY - ViewPos[H,I].Z * SY;
ViewPos[H,I].Z := ViewPos[H,I].Z * CY + Ut.CG[H].Pos[I].X * SY;
Pre := ViewPos[H,I].X;
ViewPos[H,I].X := ViewPos[H,I].X * CZ - ViewPos[H,I].Y * SZ;
ViewPos[H,I].Y := ViewPos[H,I].Y * CZ + Pre * SZ;
end;
end; {with if not burst}
end;{Sub Set ViewPos}
procedure Lighting(var Ut : TUnitP);{光からの傾きによる明暗}
var
H : integer;
ABC,XYZ2,XYZ3 : TriPoint;
PY,PZ : single;
const
Sq3 = 1.732050808;
begin
ABC.Z := 1;
with Ut.Sta do
for H := 1 to Ut.AllFace do
begin
XYZ2.X := ViewPos[H,2].X - ViewPos[H,1].X;
XYZ2.Y := ViewPos[H,2].Y - ViewPos[H,1].Y;
XYZ3.X := ViewPos[H,3].X - ViewPos[H,2].X;
XYZ3.Y := ViewPos[H,3].Y - ViewPos[H,2].Y;
PY := XYZ2.X*XYZ3.Y - XYZ2.Y*XYZ3.X;
if (Ut.CG[H].Vector = Both) or (PY = 0) or Burst then DFace[H] := true else
if (PY > 0) then
begin
if (Ut.CG[H].Vector = Plus) then DFace[H] := true
else DFace[H] := false;
end else
begin
if (Ut.CG[H].Vector = Minus) then DFace[H] := true
else DFace[H] := false;
end;
if DFace[H] then
begin
XYZ2.Z := ViewPos[H,2].Z-ViewPos[H,1].Z;
XYZ3.Z := ViewPos[H,3].Z-ViewPos[H,2].Z;
PZ := XYZ2.Z * XYZ3.X - XYZ3.Z * XYZ2.X;
if PY = 0 then PY := 0.00001;
ABC.Y := (PZ / PY);
if (XYZ2.X = 0) then XYZ2.X := 0.00001;
ABC.X := (ABC.Y * XYZ2.Y + XYZ2.Z) / XYZ2.X;
PY := ABC.X*ABC.X + ABC.Y*ABC.Y + ABC.Z*ABC.Z;
if PY = 0 then PY := 0.00001 else PY := sq3 * sqrt(PY);
FaceLight[H] := 1 - ArcCos( (ABC.X + ABC.Y + ABC.Z) / PY ) / PI;
end;
end;{with for to AllFace}
end;{Sub Lighting and Normal}