Advertisement
jedijosh920

Untitled

Dec 1st, 2018
243
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.60 KB | None | 0 0
  1.  private Vector3 Raycast2DHitCoords(Camera cam, Vector2 screenCoord, float raycastToDists = 1000f)
  2.         {
  3.             Vector3 camPos = cam.Position;
  4.             Vector3 camRot = cam.Rotation;
  5.             float raycastToDist = raycastToDists;
  6.             const float raycastFromDist = 1.0f;
  7.  
  8.             var target3D = ScreenRelToWorld(camPos, camRot, screenCoord);
  9.             var source3D = camPos;
  10.  
  11.             var dir = (target3D - source3D);
  12.             dir.Normalize();
  13.             var raycastResults = World.Raycast(source3D + dir * raycastFromDist,
  14.                 source3D + dir * raycastToDist, IntersectOptions.Everything);
  15.  
  16.             return raycastResults.HitCoords;
  17.         }
  18.  
  19.         private Vector3 ScreenRelToWorld(Vector3 camPos, Vector3 camRot, Vector2 coord)
  20.         {
  21.             var camForward = RotationToDirection(camRot);
  22.             var rotUp = camRot + new Vector3(10, 0, 0);
  23.             var rotDown = camRot + new Vector3(-10, 0, 0);
  24.             var rotLeft = camRot + new Vector3(0, 0, -10);
  25.             var rotRight = camRot + new Vector3(0, 0, 10);
  26.  
  27.             var camRight = RotationToDirection(rotRight) - RotationToDirection(rotLeft);
  28.             var camUp = RotationToDirection(rotUp) - RotationToDirection(rotDown);
  29.  
  30.             var rollRad = -DegToRad(camRot.Y);
  31.  
  32.             var camRightRoll = camRight * (float)Math.Cos(rollRad) - camUp * (float)Math.Sin(rollRad);
  33.             var camUpRoll = camRight * (float)Math.Sin(rollRad) + camUp * (float)Math.Cos(rollRad);
  34.  
  35.             var point3D = camPos + camForward * 10.0f + camRightRoll + camUpRoll;
  36.             Vector2 point2D;
  37.             if (!WorldToScreenRel(point3D, out point2D)) return camPos + camForward * 10.0f;
  38.             var point3DZero = camPos + camForward * 10.0f;
  39.             Vector2 point2DZero;
  40.             if (!WorldToScreenRel(point3DZero, out point2DZero)) return camPos + camForward * 10.0f;
  41.  
  42.             const double eps = 0.001;
  43.             if (Math.Abs(point2D.X - point2DZero.X) < eps || Math.Abs(point2D.Y - point2DZero.Y) < eps) return camPos + camForward * 10.0f;
  44.             var scaleX = (coord.X - point2DZero.X) / (point2D.X - point2DZero.X);
  45.             var scaleY = (coord.Y - point2DZero.Y) / (point2D.Y - point2DZero.Y);
  46.             var point3Dret = camPos + camForward * 10.0f + camRightRoll * scaleX + camUpRoll * scaleY;
  47.             return point3Dret;
  48.         }
  49.  
  50.         private bool WorldToScreenRel(Vector3 worldCoords, out Vector2 screenCoords)
  51.         {
  52.             OutputArgument num1 = new OutputArgument();
  53.             OutputArgument num2 = new OutputArgument();
  54.             if (!Function.Call<bool>(Hash._WORLD3D_TO_SCREEN2D, worldCoords.X, worldCoords.Y, worldCoords.Z, num1, num2))
  55.             {
  56.                 screenCoords = new Vector2();
  57.                 return false;
  58.             }
  59.             screenCoords = new Vector2((num1.GetResult<float>() - 0.5f) * 2, (num2.GetResult<float>() - 0.5f) * 2);
  60.             return true;
  61.         }
  62.  
  63.         private double DegToRad(double deg)
  64.         {
  65.             return deg * Math.PI / 180.0;
  66.         }
  67.  
  68.         private double RadToDeg(double deg)
  69.         {
  70.             return deg * 180.0 / Math.PI;
  71.         }
  72.  
  73.         private Vector3 RotationToDirection(Vector3 rotation)
  74.         {
  75.             var z = DegToRad(rotation.Z);
  76.             var x = DegToRad(rotation.X);
  77.             var num = Math.Abs(Math.Cos(x));
  78.             return new Vector3
  79.             {
  80.                 X = (float)(-Math.Sin(z) * num),
  81.                 Y = (float)(Math.Cos(z) * num),
  82.                 Z = (float)Math.Sin(x)
  83.             };
  84.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement