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; }