AR2dMarkerInfo.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. using EZXR.Glass.Core;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. namespace EZXR.Glass.Tracking2D
  5. {
  6. public struct MarkerAnchorInfo
  7. {
  8. public Matrix4x4 pose;
  9. public string name;
  10. public Vector3 physicalSize;
  11. public bool isValid;
  12. public override string ToString()
  13. {
  14. return string.Format("name:{0}, pose:{1}, physicalSize:{2}, isValid:{3}", name, pose, physicalSize, isValid);
  15. }
  16. }
  17. public class MarkerAnchorInfoComparer : IEqualityComparer<MarkerAnchorInfo>
  18. {
  19. public bool Equals(MarkerAnchorInfo x, MarkerAnchorInfo y)
  20. {
  21. return x.name.Equals(y.name);
  22. }
  23. public int GetHashCode(MarkerAnchorInfo obj)
  24. {
  25. return obj.name.GetHashCode();
  26. }
  27. }
  28. public class AR2dMarkerInfo : MonoBehaviour
  29. {
  30. [SerializeField]
  31. GameObject m_AnchorPrefab;
  32. private List<MarkerAnchorInfo> m_markerAnchorInfos = new List<MarkerAnchorInfo>();
  33. private List<GameObject> m_markerAnchorObjects = new List<GameObject>();
  34. // Start is called before the first frame update
  35. void Start()
  36. {
  37. m_markerAnchorInfos.Clear();
  38. }
  39. // Update is called once per frame
  40. void Update()
  41. {
  42. UpdateMarkerInfo();
  43. }
  44. public void SetMarkerInfo(Matrix4x4 cameraToWorldMatrix, EZXR_MarkerAnchor markerAnchor)
  45. {
  46. m_markerAnchorInfos.Clear();
  47. Matrix4x4 pose_c2image = CoordinateTransformation.ConvertImagePoseToUnityPose_c2w(markerAnchor.pose.transform);
  48. Matrix4x4 pose_c2image_orientation = CoordinateTransformation.GetMatrixFromLandscapeLeft(Screen.orientation, pose_c2image);
  49. Matrix4x4 pose_image2w = cameraToWorldMatrix * pose_c2image_orientation.inverse;
  50. var markerAnchorInfo = new MarkerAnchorInfo()
  51. {
  52. pose = pose_image2w,
  53. name = markerAnchor.name,
  54. physicalSize = new Vector3(markerAnchor.physicalSize[0], 0.005f, markerAnchor.physicalSize[1]),
  55. isValid = markerAnchor.isValid
  56. };
  57. bool isExist = false;
  58. for (int j = 0; j < m_markerAnchorInfos.Count; j++)
  59. {
  60. if (m_markerAnchorInfos[j].name.Equals(markerAnchorInfo.name))
  61. {
  62. m_markerAnchorInfos[j] = markerAnchorInfo;
  63. isExist = true;
  64. break;
  65. }
  66. }
  67. if (!isExist)
  68. {
  69. m_markerAnchorInfos.Add(markerAnchorInfo);
  70. }
  71. }
  72. private void UpdateMarkerInfo()
  73. {
  74. for (int i = 0; i < m_markerAnchorInfos.Count; i++)
  75. {
  76. //Debug.Log("markerAnchorInfo " + i + "/" + m_markerAnchorInfos.Count + " : " + m_markerAnchorInfos[i].ToString());
  77. GameObject anchor = null;
  78. if (m_markerAnchorObjects.Count > i)
  79. {
  80. anchor = m_markerAnchorObjects[i];
  81. m_markerAnchorObjects[i].transform.position = m_markerAnchorInfos[i].pose.GetPosition();
  82. m_markerAnchorObjects[i].transform.rotation = m_markerAnchorInfos[i].pose.rotation;
  83. m_markerAnchorObjects[i].transform.localScale = m_markerAnchorInfos[i].physicalSize;
  84. }
  85. else
  86. {
  87. anchor = Instantiate(m_AnchorPrefab, m_markerAnchorInfos[i].pose.GetPosition(), m_markerAnchorInfos[i].pose.rotation);
  88. anchor.transform.localScale = m_markerAnchorInfos[i].physicalSize;
  89. anchor.name = m_markerAnchorInfos[i].name;
  90. m_markerAnchorObjects.Add(anchor);
  91. }
  92. anchor.SetActive(m_markerAnchorInfos[i].isValid);
  93. }
  94. }
  95. }
  96. }