drabont

Space Engineers - Монокоптер H-Ori-30nt

Mar 30th, 2020
567
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.33 KB | None | 0 0
  1. //Управляющий скрипт для монокоптера H-Ori-30nt, СС0 ( https://youtu.be/ukHAXVj3F8o )
  2. //ʕ ᵔᴥᵔ ʔ
  3. Vector3D o_pos; public Program() { o_pos = Me.CubeGrid.GetPosition(); Runtime.UpdateFrequency = UpdateFrequency.Update10; }
  4. public void Main(string arg) {
  5.   var deg = (float)Math.PI / 180; //градус выраженный в радианах
  6.  
  7.   //находим нужные блоки по именам
  8.   var gy = (IMyGyro)GridTerminalSystem.GetBlockWithName("Gyroscope");
  9.   var sc = (IMyShipController)GridTerminalSystem.GetBlockWithName("Control Seat");
  10.   var tr = (IMyThrust)GridTerminalSystem.GetBlockWithName("Atmospheric Thrusters");
  11.    
  12.   //берем центр планеты и переводим его в целочисленный вектор в пространстве сетки
  13.   var g_pos = Me.CubeGrid.GetPosition();
  14.   var p_cen = g_pos; var g_ovr = sc.TryGetPlanetPosition(out p_cen);
  15.   var cen =  Me.CubeGrid.WorldToGridInteger( p_cen );
  16.   var spd = Me.CubeGrid.WorldToGridInteger( o_pos ); o_pos = g_pos;
  17.    
  18.   //вычисляем углы отклонения (-pi..pi)
  19.   var ax = (float) Math.Atan2( cen.X, -cen.Y );
  20.   var az = (float) Math.Atan2( cen.Z, -cen.Y );
  21.  
  22.   //формируем управляющие сигналы (-2pi..2pi) на оси гироскопа
  23.   var uv = new Vector3(0); uv.Y = sc.RotationIndicator.Y *deg*10;
  24.   uv.Z = -(ax *2 - spd.X *deg*4 - sc.MoveIndicator.X *deg*20 - sc.RollIndicator *deg*90);
  25.   uv.X =  (az *2 - (sc.HandBrake? spd.Z *deg*5: 0) - sc.MoveIndicator.Z *deg*20 - sc.RotationIndicator.X *deg*10);
  26.  
  27.   //применяем сигналы к гироскопу с учетом ориентации гироскопа
  28.   Matrix ma; gy.Orientation.GetMatrix(out ma); var tv = Vector3.Transform( uv, Matrix.Transpose( ma ));
  29.   gy.Pitch = (float)tv.X; gy.Yaw = (float)tv.Y; gy.Roll = (float)tv.Z; gy.GyroOverride = g_ovr;
  30.  
  31.   //Dampeners ассистент, включаем демпфирование на безопасной высоте
  32.   double alt; sc.TryGetPlanetElevation( MyPlanetElevation.Surface, out alt ); //9.81 - ускорение \|/ свободного падения
  33.   var sh = Math.Pow(sc.GetShipSpeed(),2)/(tr.MaxEffectiveThrust/sc.CalculateShipMass().TotalMass-9.81);
  34.   sc.DampenersOverride = sh>=alt | sc.DampenersOverride;
  35. }
Add Comment
Please, Sign In to add comment