unit typeCamera; interface uses typeVector, dglOpenGL; type TCamera = class(TObject) private FPosition: T3DVector; FForward: T3DVector; FUp: T3DVector; protected function GetCameraOrientation: TMatrix4f; public constructor Create; procedure ApplyTransformation; procedure MoveForward(amount: double); inline; procedure MoveUp(amount: double); inline; procedure MoveRight(amount: double); inline; procedure Rotate(degAngles: double); inline; property Position: T3DVector read FPosition write FPosition; property &Forward: T3DVector read FForward write FForward; property Up: T3DVector read FUp write FUp; end; implementation uses typeMatrix; { TCamera } type t = array[0..15] of single; procedure TCamera.ApplyTransformation; begin gluLookAt(FPosition.X, FPosition.Y, FPosition.Z, FPosition.X + FForward.X, FPosition.Y + FForward.Y, FPosition.Z + FForward.Z, FUp.X, FUp.Y, FUp.Z); end; constructor TCamera.Create; begin FPosition := T3DVector.Create(0); FUp := T3DVector.Create(0, 1, 0); FForward := T3DVector.Create(0, 0, -1); end; function TCamera.GetCameraOrientation: TMatrix4f; var x, z: T3DVector; begin z := T3DVector.Create(FForward.X, FForward.y, FForward.z); x := T3DVector.Cross(z, FUp); result[0, 0] := x.X; result[1, 0] := x.Y; result[2, 0] := x.Z; result[3, 0] := 0; result[0, 1] := FUp.X; result[1, 1] := FUp.Y; result[2, 1] := FUp.Z; result[3, 1] := 0; result[0, 2] := z.x; result[1, 2] := z.y; result[2, 2] := z.z; result[3, 2] := 0; result[0, 3] := 0; result[1, 3] := 0; result[2, 3] := 0; result[3, 3] := 1; end; procedure TCamera.MoveForward(amount: double); begin FPosition.X := FPosition.X + (FForward.X * amount); FPosition.Y := FPosition.Y + (FForward.Y * amount); FPosition.Z := FPosition.Z + (FForward.Z * amount); end; procedure TCamera.MoveRight(amount: double); var cross: T3DVector; begin cross := T3DVector.Cross(FUp, FForward); FPosition.X := FPosition.X + (Cross.X * amount); FPosition.Y := FPosition.Y + (Cross.Y * amount); FPosition.Z := FPosition.Z + (Cross.Z * amount); end; procedure TCamera.MoveUp(amount: double); begin FPosition.X := FPosition.X + (FUp.X * amount); FPosition.Y := FPosition.Y + (FUp.Y * amount); FPosition.Z := FPosition.Z + (FUp.Z * amount); end; procedure TCamera.Rotate(degAngles: double); var rotMatrix: T4DMatrix; begin rotMatrix := T4DMatrix.CreateRotateY(degAngles); FForward := rotMAtrix * FForward; end; end.