Advertisement
Guest User

Mouse 2D to Screen 3D

a guest
Mar 20th, 2013
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 1.57 KB | None | 0 0
  1.         public static Vector3 GetScreenCoordinates(MouseState mouseState, Viewport viewport, Vector3 target, Matrix projection, Matrix view, Matrix world, float dimension = 1f, bool ceiling = true)
  2.         {
  3.             Vector3 pos = Vector3.Zero;
  4.  
  5.             Vector3 pos0 = new Vector3(mouseState.X, mouseState.Y, 0);
  6.             Vector3 pos1 = new Vector3(mouseState.X, mouseState.Y, 1);
  7.  
  8.             pos0 = viewport.Unproject(pos0, projection, view, world);
  9.             pos1 = viewport.Unproject(pos1, projection, view, world);
  10.  
  11.             Ray ray = new Ray(pos0, pos1 - pos0);
  12.             float? depth = ray.Intersects(new Plane(Vector3.UnitY, 0));
  13.  
  14.             if (depth != null)
  15.             {
  16.                 Vector3 ms_world_pos = (pos0 + (pos1 - pos0) * depth.Value);
  17.  
  18.                 bool XN = (ms_world_pos.X < 0);
  19.                 bool ZN = (ms_world_pos.Z < 0);
  20.  
  21.                 ms_world_pos.X = (int)(ms_world_pos.X / dimension);
  22.                 ms_world_pos.Y = (int)(ms_world_pos.Y / dimension);
  23.                 ms_world_pos.Z = (int)(ms_world_pos.Z / dimension);
  24.  
  25.                 ms_world_pos.X += XN ? -0.5f : 0.5f;
  26.                 ms_world_pos.Y += 0;
  27.                 ms_world_pos.Z += ZN ? -0.5f : 0.5f;
  28.  
  29.                 ms_world_pos *= dimension;
  30.  
  31.                 pos = ms_world_pos;
  32.             }
  33.  
  34.             if (ceiling)
  35.             {
  36.                 pos.X = (float)Math.Ceiling(pos.X);
  37.                 pos.Y = (float)Math.Ceiling(pos.Y);
  38.                 pos.Z = (float)Math.Ceiling(pos.Z);
  39.             }
  40.  
  41.             return pos;
  42.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement