/// <summary>
        /// Creates a perspective matrix
        /// </summary>
        /// <param name="fov">Field of view</param>
        /// <param name="aspect">Aspect ratio</param>
        /// <param name="n">Near plane</param>
        /// <param name="f">Far plane</param>
        /// <returns></returns>
        protected static Matrix PerspectiveMatrix(float fov, float aspect, float n, float f)
        {
            fov = MathF.Radians(fov);

            var a = (f + n) / (f - n);
            var b = (2 * n * f) / (f - n);

            var yScale = MathF.Cot(fov / 2);
            var xScale = yScale / aspect;

            var m = new Matrix(new[]
            {
                new[] { xScale, 0f, 0f, 0f },
                new[] { 0f, yScale, 0f, 0f },
                new[] { 0f, 0f, a, 1f },
                new[] { 0f, 0f, b, 0f }
            });

            return(m);
        }