ScreenMap.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using o0.Geometry2D.Float;
  2. using System;
  3. using System.Diagnostics;
  4. using UnityEngine;
  5. namespace ZIM.Unity
  6. {
  7. // 记录屏幕的位置,Quad表示屏幕4个点的坐标
  8. // TransformToScreen可将摄像机空间的点映射到屏幕空间,反之用TransformToCamera
  9. public class ScreenMap
  10. {
  11. public Rect QuadRect { get; private set; }
  12. public Vector2 UVSize { get; private set; } // UV代表屏幕空间的坐标,UVSize代表屏幕坐标的取值范围
  13. public bool Active => quad != null;
  14. public OrdinalQuadrilateral Quad
  15. {
  16. get => quad;
  17. set
  18. {
  19. quad = value;
  20. if (value != null)
  21. {
  22. var x = Math.Min((value.A - value.B).Length, (value.C - value.D).Length);
  23. var y = Math.Min((value.A - value.C).Length, (value.B - value.D).Length);
  24. UVSize = new Vector2(x, y);
  25. perspective = new ZIMPerspectiveTransform(value, new OrdinalQuadrilateral(new Vector(0, 0), new Vector(x, 0), new Vector(0, y), new Vector(x, y)));
  26. var aabb = value.AABBRect();
  27. QuadRect = new Rect(aabb.Item1.x, aabb.Item1.y, aabb.Item2.x - aabb.Item1.x, aabb.Item2.y - aabb.Item1.y);
  28. //Debug.Log(QuadRect);
  29. }
  30. }
  31. }
  32. OrdinalQuadrilateral quad;
  33. ZIMPerspectiveTransform perspective;
  34. public ScreenMap()
  35. {
  36. }
  37. public ScreenMap(OrdinalQuadrilateral quad)
  38. {
  39. Quad = quad;
  40. }
  41. public bool UVInScreen(Vector2 v)
  42. {
  43. return v.x > 0 && v.x < UVSize.x && v.y > 0 && v.y < UVSize.y;
  44. }
  45. // UV归一化到[0, 1]范围,仅用于输出最终结果
  46. public Vector2 UVNormalize(Vector2 location)
  47. {
  48. return new Vector2(location.x / UVSize.x, location.y / UVSize.y);
  49. }
  50. public Vector2 TransformToScreen(Vector2 vIn)
  51. {
  52. var v = perspective.Transform(vIn.x, vIn.y);
  53. return new Vector2(v.x, v.y);
  54. }
  55. public Vector2 TransformToCamera(Vector2 vIn)
  56. {
  57. var v = perspective.TransformInverse(vIn.x, vIn.y);
  58. return new Vector2(v.x, v.y);
  59. }
  60. }
  61. }