// PoVSolar - The Solar System in PoV-Ray // (C) 2009 - 20?? by Joerg 'Yadgar' Bleimann // Thanks to: // Lukas Winter for the suggestion of adjusting vectors using geographical coordinates to axial tilt with vrotate() // Christoph Lipka for help with the Phobos mesh2 // Bjoern Jonsson for his image maps of Saturn, its rings and moons // "Reactor" for leading me out of the "media trap" at Saturn's rings // Thomas de Groot for suggesting tilting the moons together with Saturn and its rings // Ben "Tekno Frannansa" Weston for correcting the gradient vector of the Earth day/night texture_map // INCLUDES #include "colors.inc" #include "starry_sky.inc" #include "functions.inc" // VARIABLES #declare sc=1; // 1 POV unit = 13347 kilometres #declare test=0; // Test flag, triggers dummy textures #declare pw=5; // minimum pixel size for small moons and asteroids to be rendered as meshes #declare rs=0; // radiosity flag, 0 = radiosity off #declare lores=0; // flag for low resolution Saturnian rings (dependent on camera distance in the future) global_settings { max_trace_level 5 #if (rs) radiosity { brightness 2.5 always_sample off error_bound 1.2 count 100 } ambient_light 0 #end assumed_gamma 1.5 } #include "functions.inc" // FINISHES #declare F_Standard_Planetary_Surface = finish { #if (!rs) ambient 0.0001 #end diffuse 1 brilliance 0.8 } #declare F_Saturn_Rings = finish { #if (!rs) ambient 0.01 #end diffuse 1 brilliance 0.05 } #declare F_Saturn_Rings_UnlitSide = finish { #if (!rs) ambient 0.01 #end diffuse 1 brilliance 0.05 } // CELESTIAL BODIES OF THE SOLAR SYSTEM DATA // Column 0: orbital semi-major axis (to the Sun or the respective planet) in kilometres // Column 1: radius in x dimension, in kilometres // Column 2: radius in z dimension, in kilometres (if oblateness is given then stated as -1) // Column 3: radius in y dimension, in kilometres (if oblateness is given then stated as -1) // Column 4: axial tilt in degrees (planets: relative to orbit around the Sun, moons: relative to planet's equatorial plane) // Column 5: orbital inclination in degrees (planets: relative to ecliptic, moons: relative to planet's equatorial plane) // Column 6: orbital eccentricity // Column 7: perihelion argument (degrees; if variable (Earth's Moon) then stated als -1) // Column 8: longitude of ascending node (degrees; if variable (Earth's Moon) then stated als -1) // Column 9: oblateness (not taken into account if different radii explicitly stated) // Column 10: declination of north pole (degrees) // Column 11: right ascension of north pole (degrees!) // Column 12: albedo (if irrelevant (Sun) stated as -1) #declare bodies = array [81][12] { { 0, 696000, -1, -1, 7.25, 0, 0, 0, 0, 0.000009, 63.87, 286.125 }, // 0 - Sun { 57909100, 2439.7, -1, -1, 2.11, 7.005, 0.205630, 29.124, 48.331, 0.00059, 61.45, 281.01 }, // 1 - Mercury { 108208930, 6051.8, -1, -1, 177.36, 3.39471, 0.0068, 54.85229, 76.67069, 0.00019, 67.16, 272.76 }, // 2 - Venus { 149597887.5, 6378.14, 6378.14, 6356.8, 23.439281, 0, 0.016710219, 114.20783, -1, 0.0033528, 90, 90 } // 3 - Earth { 384399, 1738.14, 1738.14, 1735.97, 1.5424, 5.145, 0.0549, -1, -1, 0.00125, -1, -1 } // 4 - Moon // relative to ecliptic! { 227939100, 3396.2, 3396.2, 3376.2, 25.19, 1.85, 0.093315, 286.537, 49.562, 0.00589, 52.8865, 317.68143 } // 5 - Mars { 9377.2, 13.4, 11.2, 9.2, 0, 1.093, 0.0151, -1, -1, -1, -1, -1 } // 6 - Phobos (Mars I) { 23460, 7.5, 6.1, 5.2, 0, 0.93, 0.0002, -1, -1, -1, -1, -1 } // 7 - Deimos (Mars II) { 778547200, 71492, 66854, 71492, 3.13, 1.305, 0.048775, 275.066, 100.492, 0.06487, 64.496, 268.057 } // 8 - Jupiter { 181365.84, 125, 73, 64, 0, 0.374, 0.00319, -1, -1, -1, -1, -1 } // 9 - Amalthea (Jupiter V) { 128000, 30, 20, 17, 0, 0.06, 0.0002, -1, -1, -1, -1, -1 } // 10 - Metis (Jupiter XVI) { 221889, 58, 49, 42, 0, 1.076 0.0175, -1, -1, -1, -1, -1 } // 11 - Thebe (Jupiter XIV) { 129000, 10, 8, 7, 0, 0.03, 0.0015, -1, -1, -1, -1, -1 } // 12 - Adrastea (Jupiter XV) { 421700, 1830, 1818.7, 1815, 0, 0.05, 0.0041, -1, -1, -1, -1, -1 } // 13 - Io (Jupiter I) { 670900, 1569, 1569, 1569, 0.1, 0.47, 0.009, -1, -1, -1, -1, -1 } // 14 - Europa (Jupiter II) { 1070400, 2634.1, 2634.1, 2634.1, 0.33, 0.2, 0.0013, -1, -1, -1, -1, -1 } // 15 - Ganymede (Jupiter III) Axial tilt variable - 0 to 0.33 { 1882700, 2410.3, 2410.3, 2410.3, 0, 0.192, 0.0074, -1, -1, -1, -1, -1 } // 16 - Callisto (Jupiter IV) { 7391650, 4, 4, 4, 0, 47.48, 0.2006, -1, -1, -1, -1, -1 } // 17 - Themisto (Jupiter XVIII) { 11160000, 10, 10, 10, 0, 29.01, 0.16, -1, -1, -1, -1, -1 } // 18 - Leda (Jupiter XIII) { 11460000, 85, 75, 60, 0, 29.59, 0.16, -1, -1, -1, -1, -1 } // 19 - Himalia (Jupiter VI) { 11720000, 18, 18, 18, 0, 25.77, 0.11, -1, -1, -1, -1, -1 } // 20 - Lysithea (Jupiter X) { 11740000, 43, 43, 43, 0, 30.66, 0.22, -1, -1, -1, -1, -1 } // 21 - Elara (Jupiter VII) { 12555000, 2, 2, 2, 0, 28, 0.248, -1, -1, -1, -1, -1 } // 22 - S/2000 J 11 { 17145000, 1.5, 1.5, 1.5 0, 56, 0.4316, -1, -1, -1, -1, -1 } // 23 - Carpo (Jupiter XLVI) { 17883000, 0.5, 0.5, 0.5, 0, 143, 0.492, -1, -1, -1, -1, -1 } // 24 - S/2003 J 12 { 19088000, 1, 1, 1, 0, 145, 0.096, -1, -1, -1, -1, -1 } // 25 - Euporie (Jupiter XXXIV) { 19622000, 1, 1, 1, 0, 146, 0.2507, -1, -1, -1, -1, -1 } // 26 - S/2003 J 3 { 19813000, 1, 1, 1, 0, 147, 0.157, -1, -1, -1, -1, -1 } // 27 - S/2003 J 18 { 20454000, 1, 1, 1, 0, 151, 0.2685, -1, -1, -1, -1, -1 } // 28 - Thelxinoe { 20465000, 1.5, 1.5, 1.5, 0, 143, 0.2001, -1, -1, -1, -1, -1 } // 29 - Euanthe (Jupiter XXXIII) { 20540000, 2, 2, 2, 0, 155, 0.1375, -1, -1, -1, -1, -1 } // 30 - Helike (Jupiter XLV) { 20568000, 1, 1, 1, 0, 142, 0.2433, -1, -1, -1, -1, -1 } // 31 - Orthosie (Jupiter XXXV) { 20723000, 2.5, 2.5, 2.5, 0, 147, 0.2874, -1, -1, -1, -1, -1 } // 32 - Iocaste (Jupiter XXIV) { 20744000, 1, 1, 1, 0, 151, 0.3185, -1, -1, -1, -1, -1 } // 33 - S/2003 J 16 { 20824000, 3.5, 3.5, 3.5 0, 144, 0.184, -1, -1, -1, -1, -1 } // 34 - Praxidike (Jupiter XXVII) { 21064000, 2, 2, 2, 0, 147, 0.2441, -1, -1, -1, -1, -1 } // 35 - Harpalyke (Jupiter XXII) { 21427000, 1, 1, 1, 0, 149, 0.2214, -1, -1, -1, -1, -1 } // 36 - Mneme (Jupiter XL) { 21182000, 2, 2, 2, 0, 151, 0.229, -1, -1, -1, -1, -1 } // 37 - Hermippe (Jupiter XXX) { 21405570, 2, 2, 2, 0, 147.276, 0.2525, -1, -1, -1, -1, -1 } // 38 - Thyone (Jupiter XXIX) { 21454952, 14, 14, 14, 0, 151.564, 0.3445, -1, -1, -1, -1, -1 } // 39 - Ananke (Jupiter XII) { 22134306, 1, 1, 1, 0, 162.49, 0.2379, -1, -1, -1, -1, -1 } // 40 - S/2003 J 17 { 22285161, 1.5, 1.5, 1.5 0, 165.562, 0.3927, -1, -1, -1, -1, -1 } // 41 - Aitne (Jupiter XXXI) { 22409207, 1, 1, 1, 0, 165.378, 0.2011, -1, -1, -1, -1, -1 } // 42 - Kale (Jupiter XXXVII) { 22438648, 2.5, 2.5, 2.5, 0, 164.89, 0.3678, -1, -1, -1, -1, -1 } // 43 - Taygete (Jupiter XX) { 22709061, 1, 1, 1, 0, 164.727, 0.1961, -1, -1, -1, -1, -1 } // 44 - S/2003 J 19 { 22713444, 1.9, 1.9, 1.9, 0, 167.07, 0.2916, -1, -1, -1, -1, -1 } // 45 - Chaldene (Jupiter XXI) { 22720999, 1, 1, 1, 0, 141.812, 0.0932, -1, -1, -1, -1, -1 } // 46 - S/2003 J 15 { 22730813, 1, 1, 1, 0, 163.813, 0.3438, -1, -1, -1, -1, -1, } // 47 - S/2003 J 10 { 22739654, 1, 1, 1, 0, 148.849, 0.393, -1, -1, -1, -1, -1 } // 48 - S/2003 J 23 { 22986266, 1.6, 1.6, 1.6, 0, 163.737, 0.2552, -1, -1, -1, -1, -1 } // 49 - Erinome (Jupiter XXV) { 23044175, 2, 2, 2, 0, 160.482, 0.6011, -1, -1, -1, -1, -1 } // 50 - Aoede (Jupiter XLI) { 23111823, 1, 1, 1, 0, 164.605, 0.2041, -1, -1, -1, -1, -1 } // 51 - Kallichore (Jupiter XLIV) { 23180773, 2.6, 2.6, 2.6, 0, 165.505, 0.2139, -1, -1, -1, -1, -1, } // 52 - Kalyke (Jupiter XXIII) { 23197992, 23, 23, 23, 0, 165.047, 0.2342, -1, -1, -1, -1, -1 } // 53 - Carme (Jupiter XI) { 23214986, 4.3, 4.3, 4.3, 0, 139.849, 0.2582, -1, -1, -1, -1, -1 } // 54 - Callirrhoe (Jupiter XVII) { 23230858, 1.5, 1.5, 1.5, 0, 149.324, 0.3769, -1, -1, -1, -1, -1 } // 55 - Eurydome (Jupiter XXXII) { 23307318, 1, 1, 1, 0, 165.759, 0.3288, -1, -1, -1, -1, -1 } // 56 - Pasithee (Jupiter XXXVIII) { 23396269, 1, 1, 1, 0, 140.148, 0.4115, -1, -1, -1, -1, -1 } // 57 - Cyllene (Jupiter XLVIII) { 23483694, 2, 2, 2, 0, 163.996, 0.2828, -1, -1, -1, -1, -1 } // 58 - Eukelade (Jupiter XLVII) { 23570790, 1, 1, 1, 0, 147.175, 0.3003, -1, -1, -1, -1, -1 } // 59 - S/2003 J 4 { 23609042, 30, 30, 18, 0, 141.803, 0.3743, -1, -1, -1, -1, -1 } // 60 - Pasiphae (Jupiter VIII) { 23702511, 1.5, 1.5, 1.5 0, 152.506, 0.4077, -1, -1, -1, -1, -1 } // 61 - Hegemone (Jupiter XXXIX) { 23717051, 1.5, 1.5, 1.5, 0, 164.587, 0.1492, -1, -1, -1, -1, -1 } // 62 - Arche (Jupiter XLIII) { 23800647, 1.9, 1.9, 1.9, 0, 165.127, 0.1775, -1, -1, -1, -1, -1 } // 63 - Isonoe (Jupiter XXVI) { 23857808, 0.5, 0.5, 0.5, 0, 164.980, 0.2761, -1, -1, -1, -1, -1 } // 64 - S/2003 J 9 { 23973926, 2, 2, 2, 0, 165.549, 0.307, -1, -1, -1, -1, -1 } // 65 - S/2003 J 5 { 24057865. 19, 19, 19, 0, 153.778, 0.275, -1, -1, -1, -1, -1 } // 66 - Sinope (Jupiter IX) { 24264445, 2, 2, 2, 0, 151.058, 0.369, -1, -1, -1, -1, -1 } // 67 - Autonoe (Jupiter XXVIII)136,505.5 { 23345093, 1, 1, 1, 0, 137.371, 0.1951, -1, -1, -1, -1, -1 } // 68 - Kore (Jupiter XLIX) { 24687239, 2.7, 2.7, 2.7, 0, 150.398, 0.3077, -1, -1, -1, -1, -1, } // 69 - Megaclite (Jupiter XXIX) { 24252627, 1, 1, 1, 0, 154.372, 0.4431, -1, -1, -1, -1, -1 } // 70 - Sponde (Jupiter XXXVI) { 30290846, 1, 1, 1, 0, 153.521, 0.1882, -1, -1, -1, -1, -1 } // 71 - S/2003 J 2 { 1433449370, 60268, 54364, 60268, 26.73, 2.484, 0.055723219, 336.013862,113.642811,-1, 83.537, 40.589 } // 72 - Saturn { 133584, 17.5, 17.5, 11.5, 0, 0.0001, 0.0000144, -1, 11.3, -1, -1, -1 } // 73 - Pan (Saturn XVIII) - longitude of ascending node fictitious! { 136505.5, 4.5, 4.5, 3, 0, 0.0036, 0.0000331, -1, 67.4, -1, -1, -1 } // 74 - Daphnis (Saturn XXXV) - longitude of ascending node fictitious! { 137670, 23, 19, 9.5, 0, 0.003, 0.0012, -1, 103.2, -1, -1, -1 } // 75 - Atlas (Saturn XV) - longitude of ascending node fictitious! { 139380, 59.5, 43.5, 30.5, 0, 0.008, 0.0022, -1, 341.5, -1, -1, -1 } // 76 - Prometheus (Saturn XVI) - longitude of ascending node fictitious! { 141720, 51.5, 40, 32, 0, 0.05, 0.0042, -1, 343.9, -1, -1, -1 } // 77 - Pandora (Saturn XVII) - longitude of ascending node fictitious! { 151410, 67.5, 54, 52.5, 0, 0.351, 0.0098, -1, 29.5, -1, -1, -1 } // 78 - Epimetheus (Saturn XI) - longitude of ascending node fictitious! { 151460, 96.5, 86.5, 68.5, 0, 0.163, 0.0068, -1, 29.6, -1, -1, -1 } // 79 - Janus (Saturn X) - longitude of ascending node fictitious! { 167500, 0.25, 0.25, 0.25, 0, 0.001, 0.0002, -1, 259.5, -1, -1, -1, } // 80 - Aegaeon (Saturn LIII) - longitude of ascending node fictitious! { 185539, 207.8, 196.7, 190.6, 0, 1.574, 0.0196, -1, 170.5, -1, -1, -1 } // 81 - Mimas (Saturn I) } // PROVISIONAL PLANETARY POSITIONS (to be replaced later according to astronomically accurate orbital data) #declare east=1; #declare Pos_Mercury = bodies[1][0]*; #declare Pos_Venus = bodies[2][0]*; #if (east) #declare orb_ang=0; #declare Pos_Earth = bodies[3][0]*; // eastern hemisphere in daylight (north winter) #else #declare orb_ang=180; #declare Pos_Earth = bodies[3][0]*; // western hemisphere in daylight (north summer) #end #declare Pos_Moon = Pos_Earth + bodies[4][0]*; #declare Pos_Mars = bodies[5][0]*; #declare Pos_Phobos = Pos_Mars + bodies[6][0]*; #declare Pos_Deimos = Pos_Mars + bodies[7][0]*; #declare Pos_Jupiter = bodies[8][0]*; #declare Pos_Amalthea = Pos_Jupiter + bodies[9][0]*; #declare Pos_Metis = Pos_Jupiter + bodies[10][0]*; #declare Pos_Thebe = Pos_Jupiter + bodies[11][0]*; #declare Pos_Adrastea = Pos_Jupiter + bodies[12][0]*; #declare Pos_Io = Pos_Jupiter + bodies[13][0]*; #declare Pos_Europa = Pos_Jupiter + bodies[14][0]*; #declare Pos_Ganymede = Pos_Jupiter + bodies[15][0]*; #declare Pos_Callisto = Pos_Jupiter + bodies[16][0]*; #declare Pos_Themisto = Pos_Jupiter + bodies[17][0]*; #declare Pos_Leda = Pos_Jupiter + bodies[18][0]*; #declare Pos_Himalia = Pos_Jupiter + bodies[19][0]*; #declare Pos_Lysithea = Pos_Jupiter + bodies[20][0]*; #declare Pos_Elara = Pos_Jupiter + bodies[21][0]*; #declare Pos_S2000J11 = Pos_Jupiter + bodies[22][0]*; #declare Pos_Carpo = Pos_Jupiter + bodies[23][0]*; #declare Pos_S2003J12 = Pos_Jupiter + bodies[24][0]*; #declare Pos_Euporie = Pos_Jupiter + bodies[25][0]*; #declare Pos_S2003J3 = Pos_Jupiter + bodies[26][0]*; #declare Pos_S2003J18 = Pos_Jupiter + bodies[27][0]*; #declare Pos_Thelxinoe = Pos_Jupiter + bodies[28][0]*; #declare Pos_Euanthe = Pos_Jupiter + bodies[29][0]*; #declare Pos_Helike = Pos_Jupiter + bodies[30][0]*; #declare Pos_Orthosie = Pos_Jupiter + bodies[31][0]*; #declare Pos_Iocaste = Pos_Jupiter + bodies[32][0]*; #declare Pos_S2003J16 = Pos_Jupiter + bodies[33][0]*; #declare Pos_Praxidike = Pos_Jupiter + bodies[34][0]*; #declare Pos_Harpalyke = Pos_Jupiter + bodies[35][0]*; #declare Pos_Mneme = Pos_Jupiter + bodies[36][0]*; #declare Pos_Hermippe = Pos_Jupiter + bodies[37][0]*; #declare Pos_Thyone = Pos_Jupiter + bodies[38][0]*; #declare Pos_Ananke = Pos_Jupiter + bodies[39][0]*; #declare Pos_S2003J17 = Pos_Jupiter + bodies[40][0]*; #declare Pos_Aitne = Pos_Jupiter + bodies[41][0]*; #declare Pos_Kale = Pos_Jupiter + bodies[42][0]*; #declare Pos_Taygete = Pos_Jupiter + bodies[43][0]*; #declare Pos_S2003J19 = Pos_Jupiter + bodies[44][0]*; #declare Pos_Chaldene = Pos_Jupiter + bodies[45][0]*; #declare Pos_S2003J15 = Pos_Jupiter + bodies[46][0]*; #declare Pos_S2003J10 = Pos_Jupiter + bodies[47][0]*; #declare Pos_S2003J23 = Pos_Jupiter + bodies[48][0]*; #declare Pos_Erinome = Pos_Jupiter + bodies[49][0]*; #declare Pos_Aoede = Pos_Jupiter + bodies[50][0]*; #declare Pos_Kallichore = Pos_Jupiter + bodies[51][0]*; #declare Pos_Kalyke = Pos_Jupiter + bodies[52][0]*; #declare Pos_Carme = Pos_Jupiter + bodies[53][0]*; #declare Pos_Callirrhoe = Pos_Jupiter + bodies[54][0]*; #declare Pos_Eurydome = Pos_Jupiter + bodies[55][0]*; #declare Pos_Pasithee = Pos_Jupiter + bodies[56][0]*; #declare Pos_Cyllene = Pos_Jupiter + bodies[57][0]*; #declare Pos_Eukelade = Pos_Jupiter + bodies[58][0]*; #declare Pos_S2003J4 = Pos_Jupiter + bodies[59][0]*; #declare Pos_Pasiphae = Pos_Jupiter + bodies[60][0]*; #declare Pos_Hegemone = Pos_Jupiter + bodies[61][0]*; #declare Pos_Arche = Pos_Jupiter + bodies[62][0]*; #declare Pos_Isonoe = Pos_Jupiter + bodies[63][0]*; #declare Pos_S2003J9 = Pos_Jupiter + bodies[64][0]*; #declare Pos_S2003J5 = Pos_Jupiter + bodies[65][0]*; #declare Pos_Sinope = Pos_Jupiter + bodies[66][0]*; #declare Pos_Autonoe = Pos_Jupiter + bodies[67][0]*; #declare Pos_Kore = Pos_Jupiter + bodies[68][0]*; #declare Pos_Megaclite = Pos_Jupiter + bodies[69][0]*; #declare Pos_Sponde = Pos_Jupiter + bodies[70][0]*; #declare Pos_S2003J2 = Pos_Jupiter + bodies[71][0]*; #declare Pos_Saturn = bodies[72][0]*; #declare Pos_Pan = bodies[73][0]*; // position on orbital trajectory #declare Pos_Pan = vrotate(Pos_Pan, ); // rotating whole orbit to match inclination and ascending node length #declare Pos_Daphnis = bodies[74][0]*; #declare Pos_Daphnis = vrotate(Pos_Daphnis, ); #declare Pos_Atlas = bodies[75][0]*; #declare Pos_Atlas = vrotate(Pos_Atlas, ); #declare Pos_Prometheus = bodies[76][0]*; #declare Pos_Prometheus = vrotate(Pos_Prometheus, ); #declare Final_Pos_Prometheus = Pos_Saturn + vrotate(Pos_Prometheus, ); #declare Pos_Pandora = bodies[77][0]*; #declare Pos_Pandora = vrotate(Pos_Prometheus, ); #declare Pos_Epimetheus = bodies[78][0]*; #declare Pos_Epimetheus = vrotate(Pos_Epimetheus, ); #declare Final_Pos_Epimetheus = Pos_Saturn + vrotate(Pos_Epimetheus, ); #declare Pos_Janus = bodies[79][0]*; #declare Pos_Janus = vrotate(Pos_Janus, ); #declare Final_Pos_Janus = Pos_Saturn + vrotate(Pos_Janus, ); #declare Pos_Aegaeon = bodies[80][0]*; #declare Pos_Aegaeon = vrotate(Pos_Aegaeon, ); #declare Final_Pos_Aegaeon = Pos_Saturn + vrotate(Pos_Aegaeon, ); #declare Pos_Mimas = bodies[81][0]*; #declare Pos_Mimas = vrotate(Pos_Mimas, ); #declare Final_Pos_Mimas = Pos_Saturn + vrotate(Pos_Mimas, ); // CAMERA DATA #declare cam = 7.28; // camera mode #switch(cam) #case (0) // celestial view #declare azi = 90-bodies[3][4]; #declare dir = 0; // centered on Polaris #declare camPos = <0, 0, 300000000>; #declare camLook = camPos + ; #declare camAng = 100; #break #range (1, 1.99) // centered on Sun #switch (cam) #case (1) // from 3,000,000 kms #declare camPos = <3000000, 0, 0>; #break #case (1.01) // from Mercury's orbit #declare camPos = <57909100, 0, 0>; #break #case (1.02) // from Venus' orbit #declare camPos = <108208930, 0, 0>; #break #case (1.03) // from Earth's orbit #declare camPos = <149597887.5, 0, 0>; #break #case (1.04) // from Mars' orbit #declare camPos = <227939100, 0, 0>; #break #case (1.05) // from Ceres' orbit #declare camPos = <413832587, 0, 0>; #break #case (1.06) // from Jupiter's orbit #declare camPos = <778547200, 0, 0>; #break #case (1.07) // from Saturn's orbit #declare camPos = <1433449370, 0, 0>; #break #case (1.08) // from Uranus' orbit #declare camPos = <2876679082, 0, 0>; #break #case (1.09) // from Neptune's orbit #declare camPos = <4503443661, 0, 0>; #break #case (1.1) // from Pluto's orbit #declare camPos = <5874000000, 0, 0>; #break #case (1.11) // from Eris' orbit #declare camPos = <10123287910, 0, 0>; #break #end #declare camLook = 0; #declare camAng = 40; #break #case (2) // centered on Mercury #declare camPos = Pos_Mercury + 30000 * ; #declare camLook = Pos_Mercury; #declare camAng = 40; #break #case (2.01) // centered on Mercury #declare camPos = Pos_Mercury + 12000 * ; #declare camLook = Pos_Mercury; #declare camAng = 40; #break #case (3) // centered on Venus #declare camPos = Pos_Venus + 85000 * ; #declare camLook = Pos_Venus; #declare camAng = 40; #break #case (4) // centered on Earth #declare camPos = Pos_Earth + 45000*; #declare camLook = Pos_Earth; #declare camAng = 40; #break #case (4.1) // centered on a defined geographic location on Earth #declare long =69.16611111; #declare lat=34.53305556; // Kabul #declare long=-long-90-clock; // adjusting longitude to PoV-Ray's rotation system and Earth's axis rotation #declare h=4000; // orbital height (unscaled kilometres) #declare camPos = Pos_Earth + vrotate ((6378.14 + h) * , ); #declare camLook = Pos_Earth; #declare camAng = 40; #break #case (4.11) // centered on a defined geographic location on Earth #declare long =44.78333333; #declare lat=41.71666667; // Tbilisi #declare long=-long-90; // adjusting longitude to PoV-Ray's rotation system #declare h=4000; // orbital height (unscaled kilometres) #declare camPos = Pos_Earth + vrotate ((6378.14 + h) * , ); #declare camLook = Pos_Earth; #declare camAng = 40; #break #case (4.12) // centered on a defined geographic location on Earth #declare long =6.967235; #declare lat=50.97367; // Cologne, Germany #declare long=-long-90; // adjusting longitude to PoV-Ray's rotation system #declare h=4000; // orbital height (unscaled kilometres) #declare camPos = Pos_Earth + vrotate ((6378.14 + h) * , ); #declare camLook = Pos_Earth; #declare camAng = 40; #break #case (4.13) // centered on a defined geographic location on Earth #declare long =139.6917; #declare lat=35.68950556; // Tokyo #declare long=-long-90; // adjusting longitude to PoV-Ray's rotation system #declare h=4000; // orbital height (unscaled kilometres) #declare camPos = Pos_Earth + vrotate ((6378.14 + h) * , ); #declare camLook = Pos_Earth; #declare camAng = 40; #break #case (4.14) // centered on a defined geographic location on Earth #declare long =151.2111111; #declare lat=-33.85997222; // Sydney #declare long=-long-90; // adjusting longitude to PoV-Ray's rotation system #declare h=4000; // orbital height (unscaled kilometres) #declare camPos = Pos_Earth + vrotate ((6378.14 + h) * , ); #declare camLook = Pos_Earth; #declare camAng = 40; #break #case (4.15) // centered on a defined geographic location on Earth #declare long =18.42388889; #declare lat=-33.92527778; // Cape Town #declare long=-long-90; // adjusting longitude to PoV-Ray's rotation system #declare h=4000; // orbital height (unscaled kilometres) #declare camPos = Pos_Earth + vrotate ((6378.14 + h) * , ); #declare camLook = Pos_Earth; #declare camAng = 40; #break #case (4.16) // centered on a defined geographic location on Earth #declare long =-17.44666667; #declare lat=14.69277778; // Dakar #declare long=-long-90; // adjusting longitude to PoV-Ray's rotation system #declare h=4000; // orbital height (unscaled kilometres) #declare camPos = Pos_Earth + vrotate ((6378.14 + h) * , ); #declare camLook = Pos_Earth; #declare camAng = 40; #break #case (4.17) // centered on a defined geographic location on Earth #declare long =10.18333333; #declare lat=36.8; // Tunis #declare long=-long-90; // adjusting longitude to PoV-Ray's rotation system #declare h=4000; // orbital height (unscaled kilometres) #declare camPos = Pos_Earth + vrotate ((6378.14 + h) * , ); #declare camLook = Pos_Earth; #declare camAng = 40; #break #case (4.18) // centered on a defined geographic location on Earth #declare long =37.61666667; #declare lat=55.75; // Moscow #declare long=-long-90; // adjusting longitude to PoV-Ray's rotation system #declare h=4000; // orbital height (unscaled kilometres) #declare camPos = Pos_Earth + vrotate ((6378.14 + h) * , ); #declare camLook = Pos_Earth; #declare camAng = 40; #break #case (4.19) // centered on a defined geographic location on Earth #declare long =72.83333333; #declare lat=18.96666667; // Mumbai #declare long=-long-90; // adjusting longitude to PoV-Ray's rotation system #declare h=4000; // orbital height (unscaled kilometres) #declare camPos = Pos_Earth + vrotate ((6378.14 + h) * , ); #declare camLook = Pos_Earth; #declare camAng = 40; #break #case (4.2) // centered on a defined geographic location on Earth #declare long =106.8; #declare lat=-6.2; // Jakarta #declare long=-long-90; // adjusting longitude to PoV-Ray's rotation system #declare h=4000; // orbital height (unscaled kilometres) #declare camPos = Pos_Earth + vrotate ((6378.14 + h) * , ); #declare camLook = Pos_Earth; #declare camAng = 40; #break #case (4.21) // centered on a defined geographic location on Earth #declare long =-73.93861111; #declare lat=40.66416667; // New York City #declare long=-long-90; // adjusting longitude to PoV-Ray's rotation system #declare h=4000; // orbital height (unscaled kilometres) #declare camPos = Pos_Earth + vrotate ((6378.14 + h) * , ); #declare camLook = Pos_Earth; #declare camAng = 40; #break #case (4.22) // centered on a defined geographic location on Earth #declare long =-122.4192; #declare lat=37.7793; // San Francisco #declare long=-long-90; // adjusting longitude to PoV-Ray's rotation system #declare h=4000; // orbital height (unscaled kilometres) #declare camPos = Pos_Earth + vrotate ((6378.14 + h) * , ); #declare camLook = Pos_Earth; #declare camAng = 40; #break #case (4.23) // centered on a defined geographic location on Earth #declare long =-43.19638889; #declare lat=-22.90833333; // Rio de Janeiro #declare long=-long-90; // adjusting longitude to PoV-Ray's rotation system #declare h=4000; // orbital height (unscaled kilometres) #declare camPos = Pos_Earth + vrotate ((6378.14 + h) * , ); #declare camLook = Pos_Earth; #declare camAng = 40; #break #case (4.24) // centered on a defined geographic location on Earth #declare long =-58.38166667; #declare lat=-34.70333333; // Buenos Aires #declare long=-long-90; // adjusting longitude to PoV-Ray's rotation system #declare h=4000; // orbital height (unscaled kilometres) #declare camPos = Pos_Earth + vrotate ((6378.14 + h) * , ); #declare camLook = Pos_Earth; #declare camAng = 40; #break #case (4.25) // centered on a defined geographic location on Earth #declare long =-68.3; #declare lat=-54.8; // Ushuaia #declare long=-long-90; // adjusting longitude to PoV-Ray's rotation system #declare h=4000; // orbital height (unscaled kilometres) #declare camPos = Pos_Earth + vrotate ((6378.14 + h) * , ); #declare camLook = Pos_Earth; #declare camAng = 40; #break #case (4.26) // centered on a defined geographic location on Earth #declare long =0; #declare lat=-90; // South Pole #declare long=-long-90; // adjusting longitude to PoV-Ray's rotation system #declare h=20000; // orbital height (unscaled kilometres) #declare camPos = Pos_Earth + vrotate ((6378.14 + h) * , ); #declare camLook = Pos_Earth; #declare camAng = 40; #break #case (4.27) // centered on a defined geographic location on Earth #declare long =0; #declare lat=90; // North Pole #declare long=-long-90; // adjusting longitude to PoV-Ray's rotation system #declare h=20000; // orbital height (unscaled kilometres) #declare camPos = Pos_Earth + vrotate ((6378.14 + h) * , ); #declare camLook = Pos_Earth; #declare camAng = 40; #break #case (4.28) // centered on a defined geographic location on Earth #declare long =-90; #declare lat=0; // center of western hemisphere #declare long=-long-90; // adjusting longitude to PoV-Ray's rotation system #declare h=20000; // orbital height (unscaled kilometres) #declare camPos = Pos_Earth + vrotate ((6378.14 + h) * , ); #declare camLook = Pos_Earth; #declare camAng = 40; #break #case (4.29) // centered on a defined geographic location on Earth #declare long =90; #declare lat=0; // center of eastern hemisphere #declare long=-long-90; // adjusting longitude to PoV-Ray's rotation system #declare h=20000; // orbital height (unscaled kilometres) #declare camPos = Pos_Earth + vrotate ((6378.14 + h) * , ); #declare camLook = Pos_Earth; #declare camAng = 40; #break #case (4.5) // centered on Moon #declare camPos = Pos_Moon + 20000*; #declare camLook = Pos_Moon; #declare camAng = 40; #break #case (5) // centered on Mars #declare camPos = Pos_Mars + 25000*; #declare camLook = Pos_Mars; #declare camAng = 40; #break #case (5.5) // centered on Phobos #declare camPos = Pos_Phobos + 5500*; #declare camLook = Pos_Phobos; #declare camAng = 40; #break #case (5.51) // centered on Phobos' north pole light_source { (Pos_Phobos + <0, 1000, 0>)/sc color rgb 1 } #declare camPos = Pos_Phobos + <0, 20, 0>; #declare camLook = Pos_Phobos; #declare camAng = 5; #break #case (5.6) // centered on Deimos #declare camPos = Pos_Deimos + 5000*; #declare camLook = Pos_Deimos; #declare camAng = 20; #break #case (5.8) // Jupiter, as seen from Mars #declare camSky = <1, 0, 0>; #declare camPos = Pos_Mars + 25000*; #declare camLook = Pos_Jupiter; #declare camAng = 0.4; #break #case (6) // centered on Jupiter #declare camPos = Pos_Jupiter + 400000*; #declare camLook = Pos_Jupiter; #declare camAng = 40; #break #case (6.11) // centered on Amalthea #declare camPos = Pos_Amalthea + 500*; #declare camLook = Pos_Amalthea; #declare camAng = 40; #break #case (6.111) // overhead view of Amalthea's north pole #declare camPos = Pos_Amalthea + <0, 100, 0>; #declare camLook = Pos_Amalthea; #declare camAng = 40; #break #case (6.1111) // close-up of Amalthea's north pole #declare camPos = Pos_Amalthea + 500*; #declare camLook = Pos_Amalthea+<0, 68, 0>; #declare camAng = 2; #break #case (6.112) // overhead view of Amalthea's south pole #declare camPos = Pos_Amalthea + <0, -100, 0>; #declare camLook = Pos_Amalthea; #declare camAng = 40; #break #case (6.12) // centered on Metis #declare camPos = Pos_Metis + 405*; #declare camLook = Pos_Metis; #declare camAng = 40; #break #case (6.13) // centered on Thebe #declare camPos = Pos_Thebe + 280*; #declare camLook = Pos_Thebe; #declare camAng = 40; #break #case (6.14) // centered on Adrastea #declare camPos = Pos_Adrastea + 50*; #declare camLook = Pos_Adrastea; #declare camAng = 40; #break #case (6.15) // centered on Io #declare camPos = Pos_Io + 8000 * ; #declare camLook = Pos_Io; #declare camAng = 40; #break #case (6.16) // centered on Europa #declare camPos = Pos_Europa + 9000 * ; #declare camLook = Pos_Europa; #declare camAng = 40; #break #case (6.17) // centered on Ganymede #declare camPos = Pos_Ganymede + 15000 * ; #declare camLook = Pos_Ganymede; #declare camAng = 40; #break #case (6.18) // centered on Callisto #declare camPos = Pos_Callisto + 21000 * ; #declare camLook = Pos_Callisto; #declare camAng = 40; #break #case (6.19) // centered on Themisto #declare camPos = Pos_Themisto + 50 * ; #declare camLook = Pos_Themisto; #declare camAng = 40; #break #case (6.2) // centered on Leda #declare camPos = Pos_Leda + 150 * ; #declare camLook = Pos_Leda; #declare camAng = 40; #break #case (6.21) // centered on Himalia #declare camPos = Pos_Himalia + 1200 * ; #declare camLook = Pos_Himalia; #declare camAng = 40; #break #case (6.22) // centered on Lysithea #declare camPos = Pos_Lysithea + 280 * ; #declare camLook = Pos_Lysithea; #declare camAng = 40; #break #case (6.23) // centered on Elara #declare camPos = Pos_Elara + 445 * ; #declare camLook = Pos_Elara; #declare camAng = 40; #break #case (6.24) // centered on S/2000 J 11 #declare camPos = Pos_S2000J11 + 30 * ; #declare camLook = Pos_S2000J11; #declare camAng = 40; #break #case (6.25) // centered on Carpo #declare camPos = Pos_Carpo + 24 * ; #declare camLook = Pos_Carpo; #declare camAng = 40; #break #case (6.26) // centered on S/2003 J 12 #declare camPos = Pos_S2003J12 + 7 * ; #declare camLook = Pos_S2003J12; #declare camAng = 40; #break #case (6.27) // centered on Euporie #declare camPos = Pos_Euporie + 15 * ; #declare camLook = Pos_Euporie; #declare camAng = 40; #break #case (6.28) // centered on S/2003 J 3 #declare camPos = Pos_S2003J3 + 15 * ; #declare camLook = Pos_S2003J3; #declare camAng = 40; #break #case (6.29) // centered on S/2003 J 18 #declare camPos = Pos_S2003J18 + 15 * ; #declare camLook = Pos_S2003J18; #declare camAng = 40; #break #case (6.3) // centered on Thelxinoe #declare camPos = Pos_Thelxinoe + 15 * ; #declare camLook = Pos_Thelxinoe; #declare camAng = 40; #break #case (6.31) // centered on Euanthe #declare camPos = Pos_Euanthe + 12 * ; #declare camLook = Pos_Euanthe; #declare camAng = 40; #break #case (6.32) // centered on Helike #declare camPos = Pos_Helike + 17 * ; #declare camLook = Pos_Helike; #declare camAng = 40; #break #case (6.33) // centered on Orthosie #declare camPos = Pos_Orthosie + 17 * ; #declare camLook = Pos_Orthosie; #declare camAng = 40; #break #case (6.34) // centered on Iocaste #declare camPos = Pos_Iocaste + 21 * ; #declare camLook = Pos_Iocaste; #declare camAng = 40; #break #case (6.35) // centered on S/2003 J 16 #declare camPos = Pos_S2003J16 + 10 * ; #declare camLook = Pos_S2003J16; #declare camAng = 40; #break #case (6.36) // centered on Praxidike #declare camPos = Pos_Praxidike + 25 * ; #declare camLook = Pos_Praxidike; #declare camAng = 40; #break #case (6.37) // centered on Harpalyke #declare camPos = Pos_Harpalyke + 15 * ; #declare camLook = Pos_Harpalyke; #declare camAng = 40; #break #case (6.38) // centered on Mneme #declare camPos = Pos_Mneme + 15 * ; #declare camLook = Pos_Mneme; #declare camAng = 40; #break #case (6.39) // centered on Hermippe #declare camPos = Pos_Hermippe + 15 * ; #declare camLook = Pos_Hermippe; #declare camAng = 40; #break #case (6.4) // centered on Thyone #declare camPos = Pos_Thyone + 15 * ; #declare camLook = Pos_Thyone; #declare camAng = 40; #break #case (6.41) // centered on Ananke #declare camPos = Pos_Ananke + 100 * ; #declare camLook = Pos_Ananke; #declare camAng = 40; #break #case (6.42) // centered on S/2003 J 17 #declare camPos = Pos_S2003J17 + 15 * ; #declare camLook = Pos_S2003J17; #declare camAng = 40; #break #case (6.43) // centered on Aitne #declare camPos = Pos_Aitne + 15 * ; #declare camLook = Pos_Aitne; #declare camAng = 40; #break #case (6.44) // centered on Kale #declare camPos = Pos_Kale + 15 * ; #declare camLook = Pos_Kale; #declare camAng = 40; #break #case (6.45) // centered on Taygete #declare camPos = Pos_Taygete + 25 * ; #declare camLook = Pos_Taygete; #declare camAng = 40; #break #case (6.46) // centered on S/2003 J 19 #declare camPos = Pos_S2003J19 + 15 * ; #declare camLook = Pos_S2003J19; #declare camAng = 40; #break #case (6.47) // centered on Chaldene (Jupiter XXI) #declare camPos = Pos_Chaldene + 20 * ; #declare camLook = Pos_Chaldene; #declare camAng = 40; #break #case (6.48) // centered on S/2003 J 15 #declare camPos = Pos_S2003J15 + 15 * ; #declare camLook = Pos_S2003J15; #declare camAng = 40; #break #case (6.49) // centered on S/2003 J 10 #declare camPos = Pos_S2003J10 + 15 * ; #declare camLook = Pos_S2003J10; #declare camAng = 40; #break #case (6.5) // centered on S/2003 J 23 #declare camPos = Pos_S2003J23 + 15 * ; #declare camLook = Pos_S2003J23; #declare camAng = 40; #break #case (6.51) // centered on Erinome #declare camPos = Pos_Erinome + 15 * ; #declare camLook = Pos_Erinome; #declare camAng = 40; #break #case (6.52) // centered on Aoede #declare camPos = Pos_Aoede + 20 * ; #declare camLook = Pos_Aoede; #declare camAng = 40; #break #case (6.53) // centered on Kallichore #declare camPos = Pos_Kallichore + 15 * ; #declare camLook = Pos_Kallichore; #declare camAng = 40; #break #case (6.54) // centered on Kalyke #declare camPos = Pos_Kalyke + 25 * ; #declare camLook = Pos_Kalyke; #declare camAng = 40; #break #case (6.55) // centered on Carme #declare camPos = Pos_Carme + 180 * ; #declare camLook = Pos_Carme; #declare camAng = 40; #break #case (6.56) // centered on Callirrhoe #declare camPos = Pos_Callirrhoe + 35 * ; #declare camLook = Pos_Callirrhoe; #declare camAng = 40; #break #case (6.57) // centered on Eurydome #declare camPos = Pos_Eurydome + 20 * ; #declare camLook = Pos_Eurydome; #declare camAng = 40; #break #case (6.58) // centered on Pasithee #declare camPos = Pos_Pasithee + 15 * ; #declare camLook = Pos_Pasithee; #declare camAng = 40; #break #case (6.59) // centered on Cyllene #declare camPos = Pos_Cyllene + 15 * ; #declare camLook = Pos_Cyllene; #declare camAng = 40; #break #case (6.6) // centered on Eukelade #declare camPos = Pos_Eukelade + 22 * ; #declare camLook = Pos_Eukelade; #declare camAng = 40; #break #case (6.61) // centered on S/2003 J 4 #declare camPos = Pos_S2003J4 + 26 * ; #declare camLook = Pos_S2003J4; #declare camAng = 40; #break #case (6.62) // centered on Pasiphae #declare camPos = Pos_Pasiphae + 200 * ; #declare camLook = Pos_Pasiphae; #declare camAng = 40; #break #case (6.63) // centered on Hegemone #declare camPos = Pos_Hegemone + 20 * ; #declare camLook = Pos_Hegemone; #declare camAng = 40; #break #case (6.64) // centered on Arche #declare camPos = Pos_Arche + 20 * ; #declare camLook = Pos_Arche; #declare camAng = 40; #break #case (6.65) // centered on Isonoe #declare camPos = Pos_Isonoe + 25 * ; #declare camLook = Pos_Isonoe; #declare camAng = 40; #break #case (6.66) // centered on S/2003 J 9 #declare camPos = Pos_S2003J9 + 8 * ; #declare camLook = Pos_S2003J9; #declare camAng = 40; #break #case (6.67) // centered on S/2003 J 5 #declare camPos = Pos_S2003J5 + 20 * ; #declare camLook = Pos_S2003J5; #declare camAng = 40; #break #case (6.68) // centered on S/2003 J 5 #declare camPos = Pos_Sinope + 180 * ; #declare camLook = Pos_Sinope; #declare camAng = 40; #break #case (6.69) // centered on Autonoe #declare camPos = Pos_Autonoe + 25 * ; #declare camLook = Pos_Autonoe; #declare camAng = 40; #break #case (6.7) // centered on Kore #declare camPos = Pos_Kore + 15 * ; #declare camLook = Pos_Kore; #declare camAng = 40; #break #case (6.71) // centered on Megaclite #declare camPos = Pos_Megaclite + 28 * ; #declare camLook = Pos_Megaclite; #declare camAng = 40; #break #case (6.72) // centered on Sponde #declare camPos = Pos_Sponde + 15 * ; #declare camLook = Pos_Sponde; #declare camAng = 40; #break #case (6.73) // centered on S/2003 J 2 #declare camPos = Pos_S2003J2 + 15 * ; #declare camLook = Pos_S2003J2; #declare camAng = 40; #break #case (7) // centered on Saturn, rings oblique view #declare camPos = Pos_Saturn + 350000 * ; #declare camLook = Pos_Saturn; #declare camAng = 40; #break #case (7.01) // view through Saturn's D ring #declare camPos = Pos_Saturn + 350000 * ; #declare camLook = Pos_Saturn+<10000, -32000, 0>; #declare camAng = 5; #break #case (7.02) // centered on Saturn, view of unlit ring side #declare camPos = Pos_Saturn + 350000 * ; #declare camLook = Pos_Saturn; #declare camAng = 40; #break #case (7.2) // centered on Pan #declare Final_Pos_Pan = Pos_Saturn + vrotate(Pos_Pan, ); #declare camPos = Final_Pos_Pan + 100 * ; #declare camLook = Final_Pos_Pan; #declare camAng = 40; #break #case (7.21) // centered on Daphnis #declare Final_Pos_Daphnis = Pos_Saturn + vrotate(Pos_Daphnis, ); #declare camPos = Final_Pos_Daphnis + 80 * ; #declare camLook = Final_Pos_Daphnis; #declare camAng = 5; #break #case (7.22) // centered on Atlas #declare Final_Pos_Atlas = Pos_Saturn + vrotate(Pos_Atlas, ); #declare camPos = Final_Pos_Atlas + 160 * ; #declare camLook = Final_Pos_Atlas; #declare camAng = 40; #break #case (7.23) // centered on Prometheus #declare camPos = Final_Pos_Prometheus + 500 * ; #declare camLook = Final_Pos_Prometheus; #declare camAng = 40; #break #case (7.24) // centered on Pandora #declare Final_Pos_Pandora = Pos_Saturn + vrotate(Pos_Pandora, ); #declare camPos = Final_Pos_Pandora + 500 * ; #declare camLook = Final_Pos_Pandora; #declare camAng = 40; #break #case (7.25) // centered on Epimetheus #declare Final_Pos_Epimetheus = Pos_Saturn + vrotate(Pos_Epimetheus, ); #declare camPos = Final_Pos_Epimetheus + 500 * ; #declare camLook = Final_Pos_Epimetheus; #declare camAng = 40; #break #case (7.26) // centered on Janus #declare camPos = Final_Pos_Janus + 800 * ; #declare camLook = Final_Pos_Janus; #declare camAng = 40; #break #case (7.27) // centered on Aegaeon #declare camPos = Final_Pos_Aegaeon + 3 * ; #declare camLook = Final_Pos_Aegaeon; #declare camAng = 40; #break #case (7.28) // centered on Mimas #declare camPos = Final_Pos_Mimas + 1000 * ; #declare camLook = Final_Pos_Aegaeon; #declare camAng = 40; #break #end // CELESTIAL SPHERE Stars(6, image_width, camAng, 1.5) #macro SetAxis(dec, ras) rotate rotate <0, 90-ras, 0> #end light_source // Sun { 0 color rgb 1 looks_like { sphere { 0, 1 texture { pigment { color rgb <1, 1, 0.85> } finish { ambient 1 diffuse 0 } } scale bodies[0][1]/sc SetAxis(bodies[0][10], bodies[0][11]) } } } sphere // Sun glow { 0, 1 hollow texture { pigment { color rgbft <1, 1, 1, 0.5, 0.5> } } interior { media { emission rgb <1, 1, 0.85>/(bodies[0][1]*7/sc) density { spherical poly_wave 2 } } } scale bodies[0][1]*7/sc } sphere // Mercury { 0, 1 texture { pigment { image_map { png "solarsys/mercury_nasa_6132x3066_bright.png" map_type 1 interpolate 2 } } finish { F_Standard_Planetary_Surface } } rotate <0, 180, 0> scale bodies[1][1]/sc SetAxis(bodies[1][10], bodies[1][11]) translate Pos_Mercury/sc } sphere // Venus { 0, 1 texture { pigment { image_map { jpeg "solarsys/venus_bjoernjonsson_visiblelight.jpg" map_type 1 interpolate 2 } } finish { F_Standard_Planetary_Surface } } scale (bodies[2][1]+65)/sc SetAxis(bodies[2][10], bodies[2][11]) translate Pos_Venus/sc } #declare T_Earth_Night = texture { pigment { image_map { png "solarsys/ev5826_land_ocean_ice_lights_8192.png" map_type 1 interpolate 2 } } finish { ambient 0.5 diffuse 0 } } #declare T_Earth_Day = texture { pigment { image_map { png "solarsys/ev11612_land_ocean_ice_8192_POV.png" map_type 1 interpolate 2 } } finish { F_Standard_Planetary_Surface } } /* texture { gradient z texture_map { [0 T_Earth_Day] [0.4 T_Earth_Day] [0.55 T_Earth_Night] [1 T_Earth_Night] } scale 2 translate <0, 0, -1> } */ union { sphere // Earth, surface { 0, 1 texture { pigment_pattern { gradient z // transform gradient without affecting patterns in the texture_map scale 2 translate -z // offset to middle of gradient rotate <0, orb_ang, 0> rotate <-bodies[3][4], clock, 0> // x rotation is applied before y } texture_map { [0.45 T_Earth_Day] [0.48 T_Earth_Night] } } scale /sc } sphere // Earth, clouds { 0, 1 texture { pigment { image_map { png "solarsys/cloud_combined_8192a_alpha.png" map_type 1 interpolate 2 } } finish { F_Standard_Planetary_Surface } } scale /sc } rotate -y*clock SetAxis(bodies[3][10], bodies[3][11]) translate Pos_Earth/sc } sphere // Moon { 0, 1 texture { pigment { image_map { jpeg "solarsys/moon_jensmeyer.jpg" map_type 1 interpolate 2 } } finish { F_Standard_Planetary_Surface } } rotate scale bodies[4][1]/sc translate Pos_Moon/sc } sphere // Mars { 0, 1 texture { pigment { image_map { jpeg "solarsys/marscyl1l.jpg" map_type 1 interpolate 2 } } finish { F_Standard_Planetary_Surface } } SetAxis(bodies[5][10], bodies[5][11]) scale bodies[5][1]/sc translate Pos_Mars/sc } #if (vlength(camPos-Pos_Phobos)/sc < bodies[6][1]*2*(image_width/(pw*2))/tan(radians(camAng/2))/sc) // if Phobos is larger than 5 pixels across #declare PhobosRelief = pigment { image_map { tga "solarsys/phobos_topo.tga" } } mesh2 // Phobos { vertex_vectors { 320000 #declare a=0; #while (a<400) #declare b=0; #while (b<800) #declare redval=eval_pigment(PhobosRelief, <(0.5+b)*(1/800), (0.5+a)*(1/400), 0>).red * (14-8.1); #declare greenval=eval_pigment(PhobosRelief, <(0.5+b)*(1/800), (0.5+a)*(1/400), 0>).green * ((14-8.1)/255); ((8.1+redval+greenval)*)/sc #declare b=b+1; #end #declare a=a+1; #end } face_indices { 638400 #declare a=0; #while (a<399) #declare b=0; #while (b<800) , <(a+1)*800+b, (a+1)*800+mod(b+1,800), a*800+mod(b+1,800)> #declare b=b+1; #end #declare a=a+1; #end } texture { pigment { image_map { gif "solarsys/phobos.gif" map_type 1 } rotate <0, 180, 0> } finish { F_Standard_Planetary_Surface } } // rotate y*180 translate Pos_Phobos/sc } #else sphere // Phobos { 0, 1 texture { pigment { image_map { gif "solarsys/phobos.gif" map_type 1 } rotate <0, 180, 0> } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Phobos/sc } #end #if (vlength(camPos-Pos_Deimos)/sc < bodies[7][1]*2*(image_width/(pw*2))/tan(radians(camAng/2))/sc) // if Deimos is larger than 5 pixels across #declare DeimosRelief = pigment { image_map { tga "solarsys/deimos_topo.tga" } } mesh2 // Deimos { vertex_vectors { 320000 #declare a=0; #while (a<400) #declare b=0; #while (b<800) #declare redval=eval_pigment(DeimosRelief, <(0.5+b)*(1/800), (0.5+a)*(1/400), 0>).red * (8.4-3.6); #declare greenval=eval_pigment(DeimosRelief, <(0.5+b)*(1/800), (0.5+a)*(1/400), 0>).green * ((8.4-3.6)/255); ((3.6+redval+greenval)*)/sc #declare b=b+1; #end #declare a=a+1; #end } face_indices { 638400 #declare a=0; #while (a<399) #declare b=0; #while (b<800) , <(a+1)*800+b, (a+1)*800+mod(b+1,800), a*800+mod(b+1,800)> #declare b=b+1; #end #declare a=a+1; #end } texture { pigment { image_map { jpeg "solarsys/deimoscyl4.jpg" map_type 1 } rotate <0, 180, 0> } finish { F_Standard_Planetary_Surface } } rotate y*95 translate Pos_Deimos/sc } #else sphere // Deimos { 0, 1 texture { pigment { image_map { jpeg "solarsys/deimoscyl4.jpg" map_type 1 } rotate <0, 180, 0> } finish { F_Standard_Planetary_Surface } } scale /sc rotate y*95 translate Pos_Deimos/sc } #end // #declare i=0; /* #fopen PhobosData "solarsys/phobos_shapemodel.txt" read // Phobos shape model by Phil J. Stooke #while (defined(PhobosData)) #read (PhobosData,long, lat, height) #declare PhobosMesh[i][0] = long; #declare PhobosMesh[i][1] = lat; #declare PhobosMesh[i][2] = height; #declare i=i+1; #end #fclose PhobosData */ /* #declare i=0; #fopen DeimosData "solarsys/deimos_shapemodel.txt" read // Deimos shape model by Phil J. Stooke #while (defined(DeimosData)) #read (DeimosData,long, lat, height) #declare DeimosMesh[i][0] = long; #declare DeimosMesh[i][1] = lat; #declare DeimosMesh[i][2] = height; #declare i=i+1; #end #fclose DeimosData */ /* mesh2 // Phobos { vertex_vectors { 2701 #declare i=0; #while (i<2700) (PhobosMesh[i][2]*)/sc, #declare i=i+1; #end (PhobosMesh[2700][2]*)/sc } face_indices { 5184 #declare a=0; #while (a<72) #declare b=0; #while (b<36) , #if (b=35 & a=71) <2699, 2700, 2663> #else <(a+1)*37+b, (a+1)*37+b+1, a*37+b+1>, #end #declare b=b+1; #end #declare a=a+1; #end } texture { pigment { color rgb 0.3 } finish { F_Standard_Planetary_Surface } } rotate -y*100 translate Pos_Phobos/sc } */ /* mesh2 // Deimos { vertex_vectors { 2701 #declare i=0; #while (i<2700) (DeimosMesh[i][2]*)/sc, #declare i=i+1; #end (DeimosMesh[2700][2]*)/sc } face_indices { 5184 #declare a=0; #while (a<72) #declare b=0; #while (b<36) , #if (b=35 & a=71) <2699, 2700, 2663> #else <(a+1)*37+b, (a+1)*37+b+1, a*37+b+1>, #end #declare b=b+1; #end #declare a=a+1; #end } texture { pigment { color rgb 0.3 } finish { F_Standard_Planetary_Surface } } rotate y*60 translate Pos_Deimos/sc } */ sphere // Jupiter { 0, 1 texture { pigment { image_map { png "solarsys/jupiter_cassini.png" map_type 1 interpolate 2 } } finish { F_Standard_Planetary_Surface } } rotate y*215 scale /sc SetAxis(bodies[8][10], bodies[8][11]) translate Pos_Jupiter/sc } #if (vlength(camPos-Pos_Amalthea)/sc < bodies[9][1]*2*(image_width/(pw*2))/tan(radians(camAng/2))/sc) // if Amalthea is larger than 5 pixels across #declare AmaltheaRelief = pigment { image_map { tga "solarsys/amalthea_topo.tga" } } mesh2 // Amalthea { vertex_vectors { 318402 <0, -53.04356, 0>/sc // south pole #declare a=1; #while (a<399) #declare b=0; #while (b<800) #declare redval=eval_pigment(AmaltheaRelief, <(0.5+b)*(1/800), (0.5+a)*(1/400), 0>).red * (148.3-51.8); #declare greenval=eval_pigment(AmaltheaRelief, <(0.5+b)*(1/800), (0.5+a)*(1/400), 0>).green * ((148.3-51.8)/255); ((51.8+redval+greenval)*)/sc #declare b=b+1; #end #declare a=a+1; #end <0, 53.13458, 0>/sc // north pole // <0, 100, 0>/sc // north pole } face_indices { 636800 #declare a=0; #while (a<399) #declare b=0; #while (b<800) #switch (a) #case (0) <0, a+1+b, a+1+mod(b+1,800)> #break #range (1, 397) <1+(a-1)*800+b, 1+(a-1)*800+mod(b+1,800), 1+a*800+b>, <1+a*800+b, 1+a*800+mod(b+1,800), 1+(a-1)*800+mod(b+1,800)> /* <1+a*800+b, 1+a*800+mod(b+1,800), 1+(a+1)*800+b>, <1+(a+1)*800+b, 1+(a+1)*800+mod(b+1,800), 1+a*800+mod(b+1,800)> */ #break #case (398) // <1+a*800+b, 1+a*800+mod(b+1,800), 318401> <1+(a-1)*800+b, 1+(a-1)*800+mod(b+1,800), 318401> #break #end #declare b=b+1; #end #declare a=a+1; #end } texture { #declare C_Amalthea_Red = CHSL2RGB(<15, 0.6, 0.09, 0, 0>); pigment { C_Amalthea_Red } finish { F_Standard_Planetary_Surface } } translate Pos_Amalthea/sc } #else sphere // Amalthea { 0, 1 texture { pigment { color rgb <179, 101,46>/255 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Amalthea/sc } #end /* #declare AmaltheaMesh = array[2701][3]; #declare i=0; #fopen AmaltheaData "solarsys/amalthea_shapemodel.txt" read // Amalthea shape model by Phil J. Stooke #while (defined(AmaltheaData)) #read (AmaltheaData,long, lat, height) #declare AmaltheaMesh[i][0] = long; #declare AmaltheaMesh[i][1] = lat; #declare AmaltheaMesh[i][2] = height; #declare i=i+1; #end #fclose AmaltheaData mesh2 // Amalthea { vertex_vectors { 2701 #declare i=0; #while (i<2700) (AmaltheaMesh[i][2]*)/sc, #declare i=i+1; #end (AmaltheaMesh[2700][2]*)/sc } face_indices { 5184 #declare a=0; #while (a<72) #declare b=0; #while (b<36) , #if (b=35 & a=71) <2699, 2700, 2663> #else <(a+1)*37+b, (a+1)*37+b+1, a*37+b+1>, #end #declare b=b+1; #end #declare a=a+1; #end } texture { pigment { color rgb <179, 101,46>/255 } finish { F_Standard_Planetary_Surface } } rotate y*60 translate Pos_Amalthea/sc } */ sphere // Metis (Jupiter XVI) { 0, 1 texture { pigment { color rgb < 0.7, 0.345, 0.18> } finish { F_Standard_Planetary_Surface } } scale /sc rotate <0, 0, -25> rotate y*90 translate Pos_Metis/sc } sphere // Thebe (Jupiter XIV) { 0, 1 texture { pigment { color rgb < 0.62, 0.31, 0.13> } finish { F_Standard_Planetary_Surface } } scale /sc rotate <0, 0, 40> rotate y*63 translate Pos_Thebe/sc } sphere // Adrastea (Jupiter XV) { 0, 1 texture { pigment { color rgb < 0.63, 0.313, 0.15> } finish { F_Standard_Planetary_Surface } } scale /sc rotate <0, 0, 50> rotate y*63 translate Pos_Adrastea/sc } sphere // Io (Jupiter I) { 0, 1 texture { pigment { image_map { jpeg "solarsys/io_bjoernjonsson.jpg" map_type 1 interpolate 2 } } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Io/sc } sphere // Europa (Jupiter II) { 0, 1 texture { pigment { image_map { jpeg "solarsys/europa_bjoernjonsson.jpg" map_type 1 interpolate 2 } } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Europa/sc } sphere // Ganymede (Jupiter III) { 0, 1 texture { pigment { image_map { jpeg "solarsys/ganymede_bjoernjonsson.jpg" map_type 1 interpolate 2 } } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Ganymede/sc } sphere // Callisto (Jupiter IV) { 0, 1 texture { pigment { image_map { jpeg "solarsys/callisto_bjoernjonsson.jpg" map_type 1 interpolate 2 } } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Callisto/sc } sphere // Themisto (Jupiter XVIII) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Themisto/sc } sphere // Leda (Jupiter XIII) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Leda/sc } sphere // Himalia (Jupiter VI) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Himalia/sc } sphere // Lysithea (Jupiter X) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Lysithea/sc } sphere // Elara (Jupiter VII) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Elara/sc } sphere // S/2000 J 11 { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_S2000J11/sc } sphere // Carpo { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Carpo/sc } sphere // S/2003 J 12 { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_S2003J12/sc } sphere // Euporie (Jupiter XXXIV) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Euporie/sc } sphere // S/2003 J 3 { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_S2003J3/sc } sphere // S/2003 J 18 { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_S2003J18/sc } sphere // Thelxinoe { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Thelxinoe/sc } sphere // Euanthe (Jupiter XXXIII) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Euanthe/sc } sphere // Helike (Jupiter XLV) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Helike/sc } sphere // Orthosie (Jupiter XXXV) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Orthosie/sc } sphere // Iocaste (Jupiter XXIV) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Iocaste/sc } sphere // S/2003 J 16 { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_S2003J16/sc } sphere // Praxidike (Jupiter XXVII) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Praxidike/sc } sphere // Harpalyke (Jupiter XXII) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Harpalyke/sc } sphere // Mneme (Jupiter XL) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Mneme/sc } sphere // Hermippe (Jupiter XXX) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Hermippe/sc } sphere // Thyone (Jupiter XXIX) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Thyone/sc } sphere // Ananke (Jupiter XII) { 0, 1 texture { #declare C_Ananke_Red = CHSL2RGB(<15, 0.4, 0.04, 0, 0>); pigment { C_Ananke_Red } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Ananke/sc } sphere // S/2003 J 17 { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_S2003J17/sc } sphere // Aitne (Jupiter XXXI) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Aitne/sc } sphere // Kale (Jupiter XXXVII) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Kale/sc } sphere // Taygete (Jupiter XX) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Taygete/sc } sphere // S/2003 J 19 { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_S2003J19/sc } sphere // Chaldene (Jupiter XXI) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Chaldene/sc } sphere // S/2003 J 15 { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_S2003J15/sc } sphere // S/2003 J 10 { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_S2003J10/sc } sphere // S/2003 J 23 { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_S2003J23/sc } sphere // Erinome (Jupiter XXV) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Erinome/sc } sphere // Aoede (Jupiter XLI) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Aoede/sc } sphere // Kallichore (Jupiter XLIV) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Kallichore/sc } sphere // Kalyke (Jupiter XXIII) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Kalyke/sc } sphere // Carme (Jupiter XI) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Carme/sc } sphere // Callirrhoe (Jupiter XVII) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Callirrhoe/sc } sphere // Eurydome (Jupiter XXXII) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Eurydome/sc } sphere // Pasithee (Jupiter XXXVIII) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Pasithee/sc } sphere // Cyllene (Jupiter XLVIII) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Cyllene/sc } sphere // Eukelade (Jupiter XLVII) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Eukelade/sc } sphere // S/2003 J 4 { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_S2003J4/sc } sphere // Pasiphae (Jupiter VIII) { 0, 1 texture { pigment { color rgb 0.07 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Pasiphae/sc } sphere // Hegemone (Jupiter XXXIX) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Hegemone/sc } sphere // Arche (Jupiter XLIII) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Arche/sc } sphere // Isonoe (Jupiter XXVI) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Isonoe/sc } sphere // S/2003 J 9 { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_S2003J9/sc } sphere // S/2003 J 5 { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_S2003J5/sc } sphere // Sinope (Jupiter IX) { 0, 1 texture { #declare C_Sinope_Red = CHSL2RGB(<15, 0.35, 0.04, 0, 0>); pigment { C_Sinope_Red } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Sinope/sc } sphere // Autonoe (Jupiter XXVIII) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Autonoe/sc } sphere // Kore (Jupiter XLIX) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Kore/sc } sphere // Megaclite (Jupiter XXIX) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Megaclite/sc } sphere // Sponde (Jupiter XXXVI) { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Sponde/sc } sphere // S/2003 J 2 { 0, 1 texture { pigment { color rgb 0.04 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_S2003J2/sc } #declare Saturn_Rings_Colors = pigment { image_map { png "solarsys/sat_ring_color_bjoernjonsson.png" } } #declare Saturn_Rings_Transparency = pigment { image_map { png "solarsys/transparency_bjoernjonsson.png" } } #declare Saturn_Rings_UnlitSide = pigment { image_map { png "solarsys/unlitside_bjoernjonsson.png" } } #declare Ring_Color_Map_1_to_255 = texture { pigment { cylindrical color_map { #declare a=0; #while (a<255) #declare c=eval_pigment(Saturn_Rings_Colors, <2999/3000-a/1500, 0.5, 0>); #declare f=eval_pigment(Saturn_Rings_Transparency, <2999/3000-a/1500, 0.5, 0>); [a*(((140390-74510)/140390)/1500) rgb c filter f.gray] #declare a=a+1; #end } } } #declare Ring_Color_Map_256_to_510 = texture { pigment { cylindrical color_map { #declare a=255; #while (a<510) #declare c=eval_pigment(Saturn_Rings_Colors, <2999/3000-a/1500, 0.5, 0>); #declare f=eval_pigment(Saturn_Rings_Transparency, <2999/3000-a/1500, 0.5, 0>); [a*(((140390-74510)/140390)/1500) rgb c filter f.gray] #declare a=a+1; #end } } finish { F_Saturn_Rings } } #declare Ring_Color_Map_511_to_765 = texture { pigment { cylindrical color_map { #declare a=510; #while (a<765) #declare c=eval_pigment(Saturn_Rings_Colors, <2999/3000-a/1500, 0.5, 0>); #declare f=eval_pigment(Saturn_Rings_Transparency, <2999/3000-a/1500, 0.5, 0>); [a*(((140390-74510)/140390)/1500) rgb c filter f.gray] #declare a=a+1; #end } } finish { F_Saturn_Rings } } #declare Ring_Color_Map_766_to_1020 = texture { pigment { cylindrical color_map { #declare a=765; #while (a<1020) #declare c=eval_pigment(Saturn_Rings_Colors, <2999/3000-a/1500, 0.5, 0>); #declare f=eval_pigment(Saturn_Rings_Transparency, <2999/3000-a/1500, 0.5, 0>); [a*(((140390-74510)/140390)/1500) rgb c filter f.gray] #declare a=a+1; #end } } finish { F_Saturn_Rings } } #declare Ring_Color_Map_1021_to_1275 = texture { pigment { cylindrical color_map { #declare a=1020; #while (a<1275) #declare c=eval_pigment(Saturn_Rings_Colors, <2999/3000-a/1500, 0.5, 0>); #declare f=eval_pigment(Saturn_Rings_Transparency, <2999/3000-a/1500, 0.5, 0>); [a*(((140390-74510)/140390)/1500) rgb c filter f.gray] #declare a=a+1; #end } } finish { F_Saturn_Rings } } #declare Ring_Color_Map_1276_to_1500 = texture { pigment { cylindrical color_map { #declare a=1275; #while (a<1500) #declare c=eval_pigment(Saturn_Rings_Colors, <2999/3000-a/1500, 0.5, 0>); #declare f=eval_pigment(Saturn_Rings_Transparency, <2999/3000-a/1500, 0.5, 0>); [a*(((140390-74510)/140390)/1500) rgb c filter f.gray] #declare a=a+1; #end } } finish { F_Saturn_Rings } } #declare Ring_UnlitSide_Map_1_to_255 = texture { pigment { cylindrical color_map { #declare a=0; #while (a<255) #declare c=eval_pigment(Saturn_Rings_UnlitSide, <2999/3000-a/1500, 0.5, 0>); #declare f=eval_pigment(Saturn_Rings_Transparency, <2999/3000-a/1500, 0.5, 0>); [a*(((140390-74510)/140390)/1500) rgb c filter f.gray] #declare a=a+1; #end } } finish { F_Saturn_Rings_UnlitSide } } #declare Ring_UnlitSide_Map_256_to_510 = texture { pigment { cylindrical color_map { #declare a=255; #while (a<510) #declare c=eval_pigment(Saturn_Rings_UnlitSide, <2999/3000-a/1500, 0.5, 0>); #declare f=eval_pigment(Saturn_Rings_Transparency, <2999/3000-a/1500, 0.5, 0>); [a*(((140390-74510)/140390)/1500) rgb c filter f.gray] #declare a=a+1; #end } } finish { F_Saturn_Rings_UnlitSide } } #declare Ring_UnlitSide_Map_511_to_765 = texture { pigment { cylindrical color_map { #declare a=510; #while (a<765) #declare c=eval_pigment(Saturn_Rings_UnlitSide, <2999/3000-a/1500, 0.5, 0>); #declare f=eval_pigment(Saturn_Rings_Transparency, <2999/3000-a/1500, 0.5, 0>); [a*(((140390-74510)/140390)/1500) rgb c filter f.gray] #declare a=a+1; #end } } finish { F_Saturn_Rings_UnlitSide } } #declare Ring_UnlitSide_Map_766_to_1020 = texture { pigment { cylindrical color_map { #declare a=765; #while (a<1020) #declare c=eval_pigment(Saturn_Rings_UnlitSide, <2999/3000-a/1500, 0.5, 0>); #declare f=eval_pigment(Saturn_Rings_Transparency, <2999/3000-a/1500, 0.5, 0>); [a*(((140390-74510)/140390)/1500) rgb c filter f.gray] #declare a=a+1; #end } } finish { F_Saturn_Rings_UnlitSide } } #declare Ring_UnlitSide_Map_1021_to_1275 = texture { pigment { cylindrical color_map { #declare a=1020; #while (a<1275) #declare c=eval_pigment(Saturn_Rings_UnlitSide, <2999/3000-a/1500, 0.5, 0>); #declare f=eval_pigment(Saturn_Rings_Transparency, <2999/3000-a/1500, 0.5, 0>); [a*(((140390-74510)/140390)/1500) rgb c filter f.gray] #declare a=a+1; #end } } finish { F_Saturn_Rings_UnlitSide } } #declare Ring_UnlitSide_Map_1276_to_1500 = texture { pigment { cylindrical color_map { #declare a=1275; #while (a<1500) #declare c=eval_pigment(Saturn_Rings_UnlitSide, <2999/3000-a/1500, 0.5, 0>); #declare f=eval_pigment(Saturn_Rings_Transparency, <2999/3000-a/1500, 0.5, 0>); [a*(((140390-74510)/140390)/1500) rgb c filter f.gray] #declare a=a+1; #end } } finish { F_Saturn_Rings_UnlitSide } } union { sphere // Saturn { 0, 1 texture { pigment { image_map { jpeg "solarsys/saturn_bjoernjonsson.jpg" map_type 1 interpolate 2 } } finish { F_Standard_Planetary_Surface } } scale /sc } difference // rings { cylinder { <0, -0.11, 0>/sc, <0, 0.1, 0>/sc, 140390/sc } cylinder { <0, -0.12, 0>/sc, <0, 0.11, 0>/sc, 74510/sc } cylinder // unlit side! { <0, -0.15, 0>/sc, <0, -0.1, 0>/sc, 150000/sc texture { cylindrical texture_map { [0 Ring_UnlitSide_Map_1_to_255 ] [255*(((140390-74510)/140390)/1500) Ring_UnlitSide_Map_256_to_510] [510*(((140390-74510)/140390)/1500) Ring_UnlitSide_Map_511_to_765] [765*(((140390-74510)/140390)/1500) Ring_UnlitSide_Map_766_to_1020] [1020*(((140390-74510)/140390)/1500) Ring_UnlitSide_Map_1021_to_1275] [1275*(((140390-74510)/140390)/1500) Ring_UnlitSide_Map_1276_to_1500] } scale 140390/sc } } #if (lores) texture // low resolution texture { pigment { color rgb <0.98, 0.98, 0.95> } finish { F_Saturn_Rings } } #else double_illuminate texture { cylindrical texture_map { [0 Ring_Color_Map_1_to_255] [255*(((140390-74510)/140390)/1500) Ring_Color_Map_256_to_510] [510*(((140390-74510)/140390)/1500) Ring_Color_Map_511_to_765] [765*(((140390-74510)/140390)/1500) Ring_Color_Map_766_to_1020] [1020*(((140390-74510)/140390)/1500) Ring_Color_Map_1021_to_1275] [1275*(((140390-74510)/140390)/1500) Ring_Color_Map_1276_to_1500] } scale 140390/sc } #end } sphere // Pan (Saturn XVIII) { 0, 1 texture { pigment { color rgb 0.5 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Pan/sc } sphere // Daphnis (Saturn XXXV) { 0, 1 texture { pigment { color rgb 0.5 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Daphnis/sc } isosurface // Atlas (Saturn XV) { function { pow(x/(bodies[75][1]*sc), 2) + pow(y/(bodies[75][2]*sc), 2) + pow(z/(bodies[75][3]*sc), 2) - 1 } contained_by { sphere { 0, 30/sc } } accuracy pow(10, -30) max_gradient 1 texture { pigment { color rgb 0.4 } finish { F_Standard_Planetary_Surface } } // scale /sc translate Pos_Atlas/sc } /* sphere // Atlas (Saturn XV) { 0, 1 texture { pigment { color rgb 0.4 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Atlas/sc } */ #if (vlength(camPos-Final_Pos_Prometheus) < 35000) // provisional distance limit, to be specified later on #declare PrometheusRelief = pigment { image_map { tga "solarsys/prometheus_topo.tga" } } mesh2 // Prometheus { vertex_vectors { 318402 <0, -53.04356, 0>/sc // south pole #declare a=1; #while (a<399) #declare b=0; #while (b<800) #declare redval=eval_pigment(PrometheusRelief, <(0.5+b)*(1/800), (0.5+a)*(1/400), 0>).red * (74.9-28.3); #declare greenval=eval_pigment(PrometheusRelief, <(0.5+b)*(1/800), (0.5+a)*(1/400), 0>).green * ((74.9-28.3)/255); ((28.3+redval+greenval)*)/sc #declare b=b+1; #end #declare a=a+1; #end <0, 53.13458, 0>/sc // north pole // <0, 100, 0>/sc // north pole } face_indices { 636800 #declare a=0; #while (a<399) #declare b=0; #while (b<800) #switch (a) #case (0) <0, a+1+b, a+1+mod(b+1,800)> #break #range (1, 397) <1+(a-1)*800+b, 1+(a-1)*800+mod(b+1,800), 1+a*800+b>, <1+a*800+b, 1+a*800+mod(b+1,800), 1+(a-1)*800+mod(b+1,800)> /* <1+a*800+b, 1+a*800+mod(b+1,800), 1+(a+1)*800+b>, <1+(a+1)*800+b, 1+(a+1)*800+mod(b+1,800), 1+a*800+mod(b+1,800)> */ #break #case (398) // <1+a*800+b, 1+a*800+mod(b+1,800), 318401> <1+(a-1)*800+b, 1+(a-1)*800+mod(b+1,800), 318401> #break #end #declare b=b+1; #end #declare a=a+1; #end } texture { pigment { color rgb 0.6 } finish { F_Standard_Planetary_Surface } } translate Pos_Prometheus/sc } #else sphere // Prometheus { 0, 1 texture { pigment { color rgb 0.6 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Prometheus/sc } #end sphere // Pandora { 0, 1 texture { pigment { color rgb 0.6 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Pandora/sc } #if (vlength(camPos-Final_Pos_Epimetheus) < 35000) // provisional distance limit, to be specified later on #declare EpimetheusRelief = pigment { image_map { tga "solarsys/epimet.tga" } } mesh2 // Epimetheus { vertex_vectors { 318402 <0, -44.267165, 0>/sc // south pole #declare a=1; #while (a<399) #declare b=0; #declare rdcum = 0; #while (b<800) #declare redval=eval_pigment(EpimetheusRelief, <(0.5+b)*(1/800), (0.5+a)*(1/400), 0>).red * (79.1-42.7); #declare greenval=eval_pigment(EpimetheusRelief, <(0.5+b)*(1/800), (0.5+a)*(1/400), 0>).green * ((79.1-42.7)/255); #declare rd=42.7+redval+greenval; #if (a=1 | a=398) #declare rdcum=rdcum+rd; #if (b=799) #warning str(rdcum/800, 3, 6) #end #end (rd*)/sc #declare b=b+1; #end #declare a=a+1; #end <0, 50.658518, 0>/sc // north pole // <0, 100, 0>/sc // north pole } face_indices { 636800 #declare a=0; #while (a<399) #declare b=0; #while (b<800) #switch (a) #case (0) <0, a+1+b, a+1+mod(b+1,800)> #break #range (1, 397) <1+(a-1)*800+b, 1+(a-1)*800+mod(b+1,800), 1+a*800+b>, <1+a*800+b, 1+a*800+mod(b+1,800), 1+(a-1)*800+mod(b+1,800)> /* <1+a*800+b, 1+a*800+mod(b+1,800), 1+(a+1)*800+b>, <1+(a+1)*800+b, 1+(a+1)*800+mod(b+1,800), 1+a*800+mod(b+1,800)> */ #break #case (398) // <1+a*800+b, 1+a*800+mod(b+1,800), 318401> <1+(a-1)*800+b, 1+(a-1)*800+mod(b+1,800), 318401> #break #end #declare b=b+1; #end #declare a=a+1; #end } texture { pigment { color rgb 0.6 } finish { F_Standard_Planetary_Surface } } translate Pos_Epimetheus/sc } #else sphere // Prometheus { 0, 1 texture { pigment { color rgb 0.6 } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Epimetheus/sc } #end #if (vlength(camPos-Final_Pos_Janus) < 35000) // provisional distance limit, to be specified later on #declare JanusRelief = pigment { image_map { tga "solarsys/janus_topo.tga" } } mesh2 // Janus { vertex_vectors { 318402 <0, -71.465213, 0>/sc // south pole #declare a=1; #while (a<399) #declare b=0; #declare rdcum = 0; #while (b<800) #declare redval=eval_pigment(EpimetheusRelief, <(0.5+b)*(1/800), (0.5+a)*(1/400), 0>).red * (110.7-69.7); #declare greenval=eval_pigment(EpimetheusRelief, <(0.5+b)*(1/800), (0.5+a)*(1/400), 0>).green * ((110.7-69.7)/255); #declare rd=69.7+redval+greenval; #if (a=1 | a=398) #declare rdcum=rdcum+rd; #if (b=799) #warning str(rdcum/800, 3, 6) #end #end (rd*)/sc #declare b=b+1; #end #declare a=a+1; #end <0, 78.664265, 0>/sc // north pole // <0, 100, 0>/sc // north pole } face_indices { 636800 #declare a=0; #while (a<399) #declare b=0; #while (b<800) #switch (a) #case (0) <0, a+1+b, a+1+mod(b+1,800)> #break #range (1, 397) <1+(a-1)*800+b, 1+(a-1)*800+mod(b+1,800), 1+a*800+b>, <1+a*800+b, 1+a*800+mod(b+1,800), 1+(a-1)*800+mod(b+1,800)> /* <1+a*800+b, 1+a*800+mod(b+1,800), 1+(a+1)*800+b>, <1+(a+1)*800+b, 1+(a+1)*800+mod(b+1,800), 1+a*800+mod(b+1,800)> */ #break #case (398) // <1+a*800+b, 1+a*800+mod(b+1,800), 318401> <1+(a-1)*800+b, 1+(a-1)*800+mod(b+1,800), 318401> #break #end #declare b=b+1; #end #declare a=a+1; #end } texture { #declare C_Janus_Red = CHSL2RGB(<0, 0.5, 0.71, 0, 0>); pigment { color C_Janus_Red } finish { F_Standard_Planetary_Surface } } translate Pos_Janus/sc } #else sphere // Janus { 0, 1 texture { #declare C_Janus_Red = CHSL2RGB(<0, 0.5, 0.71, 0, 0>); pigment { color rgb C_Janus_Red } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Janus/sc } #end sphere // Aegaeon { 0, 1 texture { pigment { color rgb 0.5 } // surface albedo fictitious! finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Aegaeon/sc } SetAxis(bodies[72][10], bodies[72][11]) translate Pos_Saturn/sc sphere // Mimas (Saturn I) { 0, 1 texture { pigment { image_map { png "solarsys/mimas_2014_nasa_processed.png" map_type 1 interpolate 2 } } finish { F_Standard_Planetary_Surface } } scale /sc translate Pos_Mimas/sc } } camera { #if (cam = 5.8) sky camSky #end location camPos/sc look_at camLook/sc angle camAng }