Advertisement
Whiplash141

Messy Velocity and Angle Code Request 12/19/16

Dec 19th, 2016
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.98 KB | None | 0 0
  1. //This code took 16 minutes to write
  2.  
  3. //Whip's Messy as Hell Velocity and Angle Text Indicator - 12/19/16
  4.  
  5. string cockpitName = "Main";
  6. string textPanelName = "Display";
  7.  
  8. double rad2deg = 180 / Math.PI;
  9.  
  10. void Main()
  11. {
  12.     var cockpits = new List<IMyTerminalBlock>();
  13.    
  14.     GridTerminalSystem.SearchBlocksOfName(cockpitName, cockpits, block => block is IMyShipController);
  15.     if (cockpits.Count == 0)
  16.     {
  17.         Echo($"Error: No cockpits name {cockpitName}");
  18.         return;
  19.     }
  20.    
  21.    
  22.     var thisController = cockpits[0] as IMyShipController;
  23.    
  24.     var velocityVec = thisController.GetShipVelocities().LinearVelocity;
  25.     var upVelocity = VectorProjection(velocityVec, thisController.WorldMatrix.Up) * Math.Sign(velocityVec.Dot(thisController.WorldMatrix.Up));
  26.     var rightVelocity = VectorProjection(velocityVec, thisController.WorldMatrix.Right) * Math.Sign(velocityVec.Dot(thisController.WorldMatrix.Right));
  27.     var forwardVelocity = VectorProjection(velocityVec, thisController.WorldMatrix.Forward) * Math.Sign(velocityVec.Dot(thisController.WorldMatrix.Forward));
  28.    
  29.     double pitch = 0; double yaw = 0;
  30.     GetRotationAngles(velocityVec, thisController.WorldMatrix.Forward, thisController.WorldMatrix.Left, thisController.WorldMatrix.Up, out yaw, out pitch);
  31.     pitch *= rad2deg;
  32.     yaw *= rad2deg;
  33.    
  34.     string outputText = $"Total Speed: {Math.Round(velocityVec.Length(),1)} \n   Forward: {Math.Round(forwardVelocity.Length(),1)} \n   Up: {Math.Round(upVelocity.Length(),1)} \n   Right: {Math.Round(rightVelocity.Length(),1)} \n\nPitch: {Math.Round(pitch,1)} \nYaw: {Math.Round(yaw,1)}";
  35.    
  36.     WriteToTextPanel(textPanelName, outputText);
  37. }
  38.  
  39. Vector3D VectorProjection( Vector3D a, Vector3D b )
  40. {
  41.     return a.Dot( b ) / b.LengthSquared() * b;  
  42. }
  43.  
  44. void WriteToTextPanel(string textPanelName, string textToWrite, bool append = false)
  45. {
  46.     var listScreens = new List<IMyTerminalBlock>();
  47.     GridTerminalSystem.SearchBlocksOfName(textPanelName, listScreens, block => block is IMyTextPanel);
  48.     if (listScreens.Count == 0)
  49.     {
  50.         Echo("Error: No text panel with name tag '" + textPanelName + "' was found");
  51.         return;
  52.     }
  53.     else
  54.     {
  55.         for (int i = 0; i < listScreens.Count; i++)
  56.         {
  57.             var thisScreen = listScreens[i] as IMyTextPanel;
  58.             if (thisScreen != null)
  59.             {
  60.                 thisScreen.WritePublicText(textToWrite, append);
  61.                 thisScreen.ShowPublicTextOnScreen();
  62.             }
  63.         }
  64.     }
  65. }
  66.  
  67. //Whip's Get Rotation Angles Method v4
  68. void GetRotationAngles( Vector3D v_target, Vector3D v_front, Vector3D v_left, Vector3D v_up, out double yaw, out double pitch )
  69. {
  70.     //Dependencies: VectorProjection() | VectorAngleBetween()
  71.     //Keen uses a stupid left hand rule coordSystem, I dont.
  72.     var projTargetFront = VectorProjection( v_target, v_front );  
  73.     var projTargetLeft = VectorProjection( v_target, v_left );    
  74.     var projTargetUp = VectorProjection( v_target, v_up );
  75.     var projTargetFrontLeft = projTargetFront + projTargetLeft;
  76.     var projTargetFrontUp = projTargetFront + projTargetUp;
  77.  
  78.     yaw = VectorAngleBetween(v_front, projTargetFrontLeft);
  79.     pitch = VectorAngleBetween(v_front, projTargetFrontUp);
  80.  
  81.     //---Check if yaw angle is left or right  
  82.     //multiplied by -1 to convert from right hand rule to left hand rule
  83.     yaw = -1 * Math.Sign( v_left.Dot( projTargetLeft ) ) * yaw;
  84.  
  85.     //---Check if pitch angle is up or down    
  86.     pitch = Math.Sign( v_up.Dot( projTargetUp )) * pitch;
  87.  
  88.     //---Check if target vector is pointing opposite the front vector
  89.     if (pitch == 0 && yaw == 0 && v_target.Dot(v_front) < 0)
  90.     {
  91.         yaw = Math.PI;
  92.         pitch = Math.PI;
  93.     }
  94. }
  95.  
  96. double VectorAngleBetween(Vector3D a, Vector3D b) //returns radians
  97. {
  98.     if (a.LengthSquared() == 0 || b.LengthSquared() == 0)
  99.         return 0;
  100.     else
  101.         return Math.Acos(MathHelper.Clamp(a.Dot(b) / a.Length() / b.Length(), -1, 1));
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement