Advertisement
Moricky

Arma 3 Night Sky Planets

Sep 6th, 2024 (edited)
293
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQF 5.21 KB | Gaming | 0 0
  1. /*
  2.     Place the file in a mission folder and execute it for example for player's init field:
  3.         0 = [] execvm "fn_drawPlanets.sqf";
  4.        
  5.     Calculations based on https://aa.quae.nl/en/reken/hemelpositie.html
  6. */
  7. bis_fnc_drawPanets_timeRefresh = 0;
  8. draw3DPlanets = {
  9.  
  10.     if (sunormoon < 1) then {
  11.         //--- Get world coordinates
  12.         _lat = -getnumber (configfile >> "CfgWorlds" >> worldname >> "latitude");   //latitude = -35.097;
  13.         _lon = getnumber (configfile >> "CfgWorlds" >> worldname >> "longitude");   //longitude = 16.482;
  14.         _timeZone = -2;
  15.         _time = daytime;
  16.  
  17.         if (time > bis_fnc_drawPanets_timeRefresh) then {
  18.             //--- orbital params at 01/01/2000
  19.             _planets = [
  20.                 //Name      a       e       i       AP      LAN     M0      Color       Size
  21.                 ["Earth",   1.00000,    0.01671,    0.000,      288.064,    174.873,    357.529,    [0,0,0],    0.0],
  22.                 ["Mercury", 0.38710,    0.20563,    7.005,      29.125,     48.331,     174.795,    [255,243,239],  0.2],
  23.                 ["Venus",   0.72333,    0.00677,    3.395,      54.884,     76.680,     50.416,     [253,254,255],  0.25],
  24.                 ["Mars",    1.52368,    0.09340,    1.850,      286.502,    49.558,     19.373,     [245,151,118],  0.25],
  25.                 ["Jupiter", 5.20260,    0.04849,    1.303,      273.687,    100.464,    20.020,     [249,250,232],  0.25]
  26.                 //--- Not visible without a telescope
  27.                 //["Saturn",    9.55491,    0.05551,    2.489,      339.391,    113.666,    317.021,    [253,254,209],  0.2],
  28.                 //["Uranus",    19.21845,   0.04630,    0.773,      98.999,     74.006,     141.050,    [188,253,250],  0.2],
  29.                 //["Neptune",   30.11039,   0.00899,    1.770,      276.340,    131.784,    256.225,    [190,226,242],  0.2]
  30.             ];
  31.             draw3DPlanets_data = [];
  32.  
  33.             //--- Get number of days since 01/01/2000
  34.             _date = date;//[2004,1,1,0,0];
  35.             _year = _date select 0;
  36.             _day = ((datetonumber _date) * 365);
  37.             //_time = 1;
  38.             _diffYear = _year - 2000;
  39.             _days = abs((_diffYear * 365) + floor(_diffYear / 4) + _day); // ToDo: Correct leap year calculation
  40.  
  41.             _hXE = 0;
  42.             _hYE = 0;
  43.             _hZE = 0;
  44.             _ME = 0;
  45.             {
  46.                 _name = _x select 0;
  47.                 _a = _x select 1;
  48.                 _e = _x select 2;
  49.                 _i = _x select 3;
  50.                 _AP = _x select 4;
  51.                 _LAN = _x select 5;
  52.                 _M0 = _x select 6;
  53.                 _color = _x select 7;
  54.                 _size = _x select 8;
  55.  
  56.                 //--- Get mean anomaly
  57.                 _n = 0.9856076686 / (_a^(3/2));
  58.                 _M = (_M0 + _n * _days) % 360;
  59.                 _TA = _M + 2 * _e * sin(_M) + 1.25 * _e^2 * sin(2 * _M);
  60.  
  61.                 //--- Get eccentric anomaly
  62.                 _EA = _M;
  63.                 _f = 0;
  64.                 _ratio = 0;
  65.                 for "_i" from 0 to 10 do {
  66.                     _ff = 1 - _e * cos(_f);
  67.                     _f = _EA - _e * sin(_EA) - _M;
  68.                     _EA = _EA - _ratio;
  69.                     _ratio = _ratio + _f / _ff;
  70.                 };
  71.  
  72.                 //--- Get true anomaly
  73.                 _TA = 2 * atan(sqrt((1 + _e) / (1 - _e)) * tan(_EA / 2));
  74.  
  75.                 //--- Get distance from the sun
  76.                 _r = (_a * (1 - _e^2)) / (1 + _e * cos(_TA));
  77.  
  78.                 //--- Get heliocentric elliptical coordinates
  79.                 _hX = _r * ((cos(_LAN) * cos(_AP + _TA)) - sin(_LAN) * cos(_i) * sin(_AP + _TA));
  80.                 _hY = _r * ((sin(_LAN) * cos(_AP + _TA)) + cos(_LAN) * cos(_i) * sin(_AP + _TA));
  81.                 _hZ = _r * sin(_i) * sin(_AP + _TA);
  82.                 if (_foreachindex == 0) then {
  83.                     _hXE = _hX;
  84.                     _hYE = _hY;
  85.                     _hZE = _hZ;
  86.                     _ME = _M;
  87.                 } else {
  88.                     //--- Get rectangular geocentric ecliptical coordinates
  89.                     _posX = _hX - _hXE;
  90.                     _posY = _hY - _hYE;
  91.                     _posZ = _hZ - _hZE;
  92.  
  93.                     //--- Get geocentric ecliptical longitude and latitude
  94.                     _lambda = _posY atan2 _posX;
  95.                     _beta = asin(_posZ / sqrt(_posX^2 + _posY^2 + _posZ^2));
  96.  
  97.                     //--- The right ascension and declination
  98.                     _epsilon = 23.4397;
  99.                     _alpha = (sin(_lambda) * cos(_epsilon) - tan(_beta) * sin(_epsilon)) atan2 (cos(_lambda));
  100.                     _delta = asin(sin(_beta) * cos(_epsilon) + cos(_beta) * sin(_epsilon) * sin(_lambda));
  101.  
  102.                     //--- The sidereal time
  103.                     //_theta = (_ME + 102.937 + 15 * (_time + _timeZone) + _lon) % 360;
  104.  
  105.                     //--- Hour angle
  106.                     //_H = _theta - _alpha;
  107.  
  108.                     //--- The height and azimuth
  109.                     //_dirH = (sin(_H)) atan2 (cos(_H) * sin(_lat) - tan(_delta) * cos(_lat));
  110.                     //_dirV = asin(sin(_lat) * sin(_delta) + cos(_lat) * cos(_delta) * cos(_H));
  111.  
  112.                     draw3DPlanets_data pushback [_name,_ME,_alpha,_delta,_color,_size];
  113.                 };
  114.             } foreach _planets;
  115.             bis_fnc_drawPanets_timeRefresh = time + 1;
  116.         };
  117.  
  118.         {
  119.  
  120.             _name = _x select 0;
  121.             _ME = _x select 1;
  122.             _alpha = _x select 2;
  123.             _delta = _x select 3;
  124.             _color = _x select 4;
  125.             _size = _x select 5;
  126.             _color = [
  127.                 (_color select 0) / 255,
  128.                 (_color select 1) / 255,
  129.                 (_color select 2) / 255,
  130.                 1
  131.             ];
  132.  
  133.             if (cameraview == "external") then {_name = "";};
  134.  
  135.             _theta = (_ME + 102.937 + 15 * (_time + _timeZone) + _lon) % 360;
  136.             _H = _theta - _alpha;
  137.             _dirH = (sin(_H)) atan2 (cos(_H) * sin(_lat) - tan(_delta) * cos(_lat));
  138.             _dirV = asin(sin(_lat) * sin(_delta) + cos(_lat) * cos(_delta) * cos(_H));
  139.  
  140.             _dirH = 282 - _dirH; //--- Magic constant
  141.  
  142.             if (_dirV > 5) then {
  143.                 _dis = viewdistance;
  144.                 _pos = [
  145.                     (position player select 0) + (cos _dirH * _dis),
  146.                     (position player select 1) + (sin _dirH * _dis),
  147.                     (position player select 2) + (tan _dirV * _dis)
  148.                 ];
  149.                 drawicon3d ["\a3\Data_f\light_flare_ca.paa",_color,_pos,_size,_size,0,_name,0];
  150.             };
  151.         } foreach draw3DPlanets_data;
  152.     };
  153. };
  154.  
  155. if (isnil "draw3DPlanetsHandler") then {
  156.     draw3DPlanetsHandler = addmissioneventhandler ["draw3D",{[] call draw3DPlanets}];
  157. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement