Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Если понравится — у меня уже есть наброски продолжения статьи

procedure TCamera3D.Apply(aWidth, aHeight: Single);
begin
Aspect := aWidth / aHeight;
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(FieldOfView, Aspect, zNear, zFar);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
glRotatef(Pitch, -1, 0, 0);
glRotatef(Yaw, 0, 1, 0);
with Position do
glTranslatef(-x, -y, -z);
glLightfv(GL_LIGHT0, GL_POSITION, @LightPosition); // in current GL_MODELVIEW projection
end;
procedure gluPerspective(fovy, aspect, zNear, zFar: double);
var m: TM4x4; sn,cs,c,dz,ar: Double;
begin
if aspect = 0 then Exit;
dz:=zFar- zNear;
if dz = 0 then Exit;
ar:=fovy*g2r2; //Pi/360
SinCos(ar,sn,cs);
if sn=0 then Exit;
c:=cs/sn; //cotangent
FillChar(m, SizeOf(m), 0);
m[0,0]:=c/aspect;
m[1,1]:=c;
m[2,2]:=-(zFar+zNear)/dz;
m[2,3]:=-1;
m[3,2]:=-2*zNear*zFar/dz;
glMultMatrixf(@m);
end;
// такой поворот имеет вырожденные точки сверху и снизу
procedure TCamera3D.MoveForvard(V:Single);
var i:Integer; ah,av: Single; rz,rh,rv,dr:TV3;
begin
ah:=Yaw*g2r; // horizontal angle in XZ plane
av:=Pitch*g2r; // vertical angle
// polar to decart from -Z
dr.x:=cos(av)*sin(ah);
dr.y:=sin(av);
dr.z:=-cos(av)*cos(ah);
Position:=Position+dr*V;
end;

Андроиды в дельфинарии