public void MakeFrustum()
        {
            Matrix3d viewProjection = (RenderContext11.World * RenderContext11.View * RenderContext11.Projection);

            inverseWorld = RenderContext11.World;
            inverseWorld.Invert();

            // Left plane 
            frustum[0].A = (float)(viewProjection.M14 + viewProjection.M11);
            frustum[0].B = (float)(viewProjection.M24 + viewProjection.M21);
            frustum[0].C = (float)(viewProjection.M34 + viewProjection.M31);
            frustum[0].D = (float)(viewProjection.M44 + viewProjection.M41);

            // Right plane 
            frustum[1].A = (float)(viewProjection.M14 - viewProjection.M11);
            frustum[1].B = (float)(viewProjection.M24 - viewProjection.M21);
            frustum[1].C = (float)(viewProjection.M34 - viewProjection.M31);
            frustum[1].D = (float)(viewProjection.M44 - viewProjection.M41);

            // Top plane 
            frustum[2].A = (float)(viewProjection.M14 - viewProjection.M12);
            frustum[2].B = (float)(viewProjection.M24 - viewProjection.M22);
            frustum[2].C = (float)(viewProjection.M34 - viewProjection.M32);
            frustum[2].D = (float)(viewProjection.M44 - viewProjection.M42);

            // Bottom plane 
            frustum[3].A = (float)(viewProjection.M14 + viewProjection.M12);
            frustum[3].B = (float)(viewProjection.M24 + viewProjection.M22);
            frustum[3].C = (float)(viewProjection.M34 + viewProjection.M32);
            frustum[3].D = (float)(viewProjection.M44 + viewProjection.M42);

            // Near plane 
            frustum[4].A = (float)(viewProjection.M13);
            frustum[4].B = (float)(viewProjection.M23);
            frustum[4].C = (float)(viewProjection.M33);
            frustum[4].D = (float)(viewProjection.M43);

            // Far plane 
            frustum[5].A = (float)(viewProjection.M14 - viewProjection.M13);
            frustum[5].B = (float)(viewProjection.M24 - viewProjection.M23);
            frustum[5].C = (float)(viewProjection.M34 - viewProjection.M33);
            frustum[5].D = (float)(viewProjection.M44 - viewProjection.M43);

            // Normalize planes 
            for (int i = 0; i < 6; i++)
            {
                frustum[i].Normalize();
            }
            RenderContext11.MakeFrustum();
        }
        private static double SetupMatrixForPlanetGeometry(RenderContext11 renderContext, int planetID, Vector3d centerPoint, bool makeFrustum)
        {
            var radius = GetAdjustedPlanetRadius(planetID);

            double rotationCurrent = 0;
            if (planetID == (int)SolarSystemObjects.Earth)
            {
                rotationCurrent = Coordinates.MstFromUTC2(SpaceTimeController.Now, 0) / 180.0 * Math.PI;
            }
            else
            {
                rotationCurrent = (((jNow - 2451545.0) / planetRotationPeriod[planetID]) * Math.PI * 2) % (Math.PI * 2);
            }

            if (planetID == (int)SolarSystemObjects.Moon)
            {
                rotationCurrent -= Math.PI / 2;
            }

            var matLocal = renderContext.World;
            var matNonRotating = renderContext.World;
            var translation = planet3dLocations[planetID] - centerPoint;

            var orientationAtEpoch = GetPlanetOrientationAtEpoch(planetID);

            matLocal.Scale(new Vector3d(radius, radius, radius));
            matLocal.Multiply(Matrix3d.RotationY(-rotationCurrent));
            matLocal.Multiply(orientationAtEpoch);

            if (planetID == (int)Earth3d.MainWindow.viewCamera.Target)
            {
                EarthMatrix = Matrix3d.Identity;
                EarthMatrix.Multiply(Matrix3d.RotationY(-rotationCurrent));
                EarthMatrix.Multiply(orientationAtEpoch);

                EarthMatrixInv = EarthMatrix;
                EarthMatrixInv.Invert();
            }

            matLocal.Multiply(Matrix3d.Translation(translation));
            renderContext.World = matLocal;
            renderContext.WorldBase = renderContext.World;
            renderContext.NominalRadius = GetPlanetRadiusInMeters(planetID);

            if (makeFrustum)
            {
                Earth3d.MainWindow.MakeFrustum();
            }
            matNonRotating.Scale(new Vector3d(radius, radius, radius));
            matNonRotating.Multiply(orientationAtEpoch);
            matNonRotating.Multiply(Matrix3d.Translation(translation));
            renderContext.WorldBaseNonRotating = matNonRotating;
            return rotationCurrent;
        }