ImageTrackingResultInfo.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. //==========================================================
  2. //
  3. // Copyright (c) Guangzhou Shixiang Technology Co.,Ltd.
  4. // All rights reserved.
  5. //
  6. //==========================================================
  7. using System.Collections.Generic;
  8. using System.Collections.ObjectModel;
  9. using System.Text;
  10. using GxrSdk;
  11. using TMPro;
  12. using UnityEngine;
  13. public class ImageTrackingResultInfo : MonoBehaviour, IGxrImageTrackingHandler
  14. {
  15. [SerializeField]
  16. private TextMeshPro textTotal;
  17. [SerializeField]
  18. private TextMeshPro textCount;
  19. [SerializeField]
  20. private TextMeshPro textResult;
  21. private readonly StringBuilder _stringBuilder = new StringBuilder();
  22. // 当前帧中跟踪到的id
  23. private readonly List<uint> _currentTrackedIds = new List<uint>();
  24. // 保存上一帧中跟踪到的id
  25. private readonly List<uint> _lastTrackedIds = new List<uint>();
  26. // 识别到的总次数
  27. // 当前帧中跟踪到的id,如果在上一帧中没有,则总次数加一
  28. private int _totalNum = 0;
  29. void OnEnable()
  30. {
  31. // 注册图像跟踪监听器
  32. GxrSystemAccessor.TrackingSystem?.RegisterHandler<IGxrImageTrackingHandler>(this);
  33. }
  34. void OnDisable()
  35. {
  36. // 注销图像跟踪监听器
  37. GxrSystemAccessor.TrackingSystem?.UnregisterHandler<IGxrImageTrackingHandler>(this);
  38. }
  39. /// <summary>
  40. /// 图像跟踪结果更新
  41. /// </summary>
  42. /// <param name="eventData"></param>
  43. public void OnImageTrackingUpdated(GxrImageTrackingEventData eventData)
  44. {
  45. var trackingResults = eventData.TrackingResults;
  46. UpdateCountText(trackingResults.Count);
  47. _stringBuilder.Clear();
  48. for (var i = 0; i < trackingResults.Count; ++i)
  49. {
  50. var trackingResult = trackingResults[i];
  51. uint id = trackingResult.TrackerId;
  52. var position = trackingResult.Pose.position;
  53. var rotation = trackingResult.Pose.rotation;
  54. var localPosition = trackingResult.LocalPose.position;
  55. var localRotation = trackingResult.LocalPose.rotation;
  56. _stringBuilder.Append($"Id:{id},Position:{position:F3},Rotation:{rotation.eulerAngles:F3}\n" +
  57. $"LocalPosition:{localPosition:F3},LocalRotation:{localRotation.eulerAngles:F3}\n");
  58. }
  59. UpdateResultText(_stringBuilder.ToString());
  60. UpdateTotalNum(trackingResults);
  61. }
  62. private void UpdateCountText(int count)
  63. {
  64. if (textCount != null)
  65. {
  66. textCount.text = $"Count: {count}";
  67. }
  68. }
  69. private void UpdateResultText(string result)
  70. {
  71. if (textResult != null)
  72. {
  73. textResult.text = result;
  74. }
  75. }
  76. /// <summary>
  77. /// 更新识别到的总次数
  78. /// 当前帧中跟踪到的id,如果在上一帧中没有,则总次数加一
  79. /// </summary>
  80. /// <param name="trackingResults"></param>
  81. private void UpdateTotalNum(ReadOnlyCollection<GxrTrackingResult> trackingResults)
  82. {
  83. _currentTrackedIds.Clear();
  84. for (var i = 0; i < trackingResults.Count; ++i)
  85. {
  86. var trackedId = trackingResults[i].TrackerId;
  87. _currentTrackedIds.Add(trackedId);
  88. if (!_lastTrackedIds.Exists(id => id == trackedId))
  89. {
  90. ++_totalNum;
  91. if (textTotal != null)
  92. {
  93. textTotal.text = $"Total: {_totalNum}";
  94. }
  95. }
  96. }
  97. _lastTrackedIds.Clear();
  98. _currentTrackedIds.ForEach(i => _lastTrackedIds.Add(i));
  99. }
  100. public void OnTargetFound()
  101. {
  102. Debug.Log($"[ImageTrackingResultInfo][OnTargetFound] ");
  103. }
  104. public void OnTargetLost()
  105. {
  106. Debug.Log($"[ImageTrackingResultInfo][OnTargetLost] ");
  107. }
  108. public void OnTargetUpdated(Pose worldPose)
  109. {
  110. Debug.Log($"[ImageTrackingResultInfo][OnTargetUpdated] {worldPose.position:F3},{worldPose.rotation:F3}");
  111. }
  112. }