CameraPoseSetPanel.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. using UnityEngine;
  2. using UnityEngine.UI;
  3. using QFramework;
  4. using ChivaXR;
  5. using ChivaXR.Op;
  6. namespace QFramework
  7. {
  8. public class CameraPoseSetPanelData : UIPanelData
  9. {
  10. }
  11. public partial class CameraPoseSetPanel : UIPanel
  12. {
  13. StepListProxy m_StepListProxy;
  14. bool m_CameraState;
  15. protected override void OnInit(IUIData uiData = null)
  16. {
  17. mData = uiData as CameraPoseSetPanelData ?? new CameraPoseSetPanelData();
  18. // please add init code here
  19. m_StepListProxy = DAL.Instance.Get<StepListProxy>();
  20. NextBtn.onClick.AddListener(OnNextBtnClick);
  21. PreviousBtn.onClick.AddListener(OnPreviousBtnClick);
  22. AutoSettingCamera.onClick.AddListener(OnAutoSettingView);
  23. SaveCameraPose.onClick.AddListener(OnSaveCameraPoseBtnClick);
  24. SaveBtn.onClick.AddListener(OnSaveBtnClick);
  25. }
  26. //启动时记录当前状态
  27. private bool recordautoEnterNextProcessState;
  28. //启动时记录当前播放
  29. private bool recordplayView;
  30. protected override void OnOpen(IUIData uiData = null)
  31. {
  32. m_CameraState = RoamCameraController.Instance.toggle;
  33. RoamCameraController.Instance.SetCameraMoveState(true);
  34. recordautoEnterNextProcessState = ProcessManagement.Instance.autoEnterNextProcess;
  35. recordplayView = Preprocess_VoiceAndCamera.playView;
  36. Preprocess_VoiceAndCamera.playView = true;
  37. ProcessManagement.Instance.autoEnterNextProcess = false;
  38. Info.text = "";
  39. }
  40. protected override void OnShow()
  41. {
  42. }
  43. protected override void OnHide()
  44. {
  45. }
  46. protected override void OnClose()
  47. {
  48. RoamCameraController.Instance.toggle = m_CameraState;
  49. ProcessManagement.Instance.autoEnterNextProcess = recordautoEnterNextProcessState;
  50. Preprocess_VoiceAndCamera.playView = recordplayView;
  51. }
  52. private void OnNextBtnClick()
  53. {
  54. Info.text = "";
  55. ProcessManagement.Instance.JumpProcessState(ProcessManagement.Instance.currentStepID + 1);
  56. ProcessManagement.Instance.ActiveCurrentProcess();
  57. }
  58. private void OnPreviousBtnClick()
  59. {
  60. Info.text = "";
  61. ProcessManagement.Instance.JumpProcessState(ProcessManagement.Instance.currentStepID - 1);
  62. ProcessManagement.Instance.ActiveCurrentProcess();
  63. }
  64. private void OnSaveCameraPoseBtnClick()
  65. {
  66. m_StepListProxy.SetOperationCameraPoseById(ProcessManagement.Instance.currentStepID, RoamCameraController.Instance.transform.position,
  67. RoamCameraController.Instance.transform.eulerAngles);
  68. Info.text = "设置第" + ProcessManagement.Instance.currentStepID + "步,镜头信息:" + RoamCameraController.Instance.transform.position + "/" + RoamCameraController.Instance.transform.eulerAngles;
  69. }
  70. private void OnSaveBtnClick()
  71. {
  72. m_StepListProxy.SaveOperation();
  73. UIKit.ClosePanel<CameraPoseSetPanel>();
  74. }
  75. public void OnAutoSettingView()
  76. {
  77. PB_OpData pbOpData = ProcessManagement.Instance.GetCurrentProcess().GetComponent<PB_OpData>();
  78. OpTrigger_ToolPack opTrigger_ToolPack =
  79. OperationManager.Instance.GetOpData(pbOpData.opData.operationDataName).gameObject.GetComponent<OpTrigger_ToolPack>();
  80. if (opTrigger_ToolPack != null)
  81. {
  82. if (opTrigger_ToolPack.targetObjs.Count > 0)
  83. {
  84. Transform viewTarget = opTrigger_ToolPack.targetObjs[0].transform;
  85. Transform targetPoint = opTrigger_ToolPack.targetObjs[0].transform.GetComponentInChildren<MeshRenderer>().transform;
  86. Bounds bound = GetBounds(targetPoint);
  87. Vector3 targetPos = bound.center +
  88. (bound.center - new Vector3(0, bound.center.y - 0.3f, 0)).normalized
  89. * (bound.size.magnitude < 0.8f ? 0.8f : bound.size.magnitude);
  90. Vector3 euler = Quaternion.LookRotation(bound.center - targetPos, Vector3.up).eulerAngles;
  91. RoamCameraController.Instance.SetCameraState(targetPos, euler);
  92. }
  93. }
  94. }
  95. Vector3 GetEulerAnglesFromVectors(Vector3 forward, Vector3 up)
  96. {
  97. // 确保向量都被归一化了
  98. forward.Normalize();
  99. up.Normalize();
  100. // 右向量通过向上向量和前向量的叉乘得到
  101. Vector3 right = Vector3.Cross(up, forward);
  102. // 通过右向量和前向量得到旋转
  103. float roll = Mathf.Atan2(right.x, right.z) * Mathf.Rad2Deg;
  104. float pitch = Mathf.Asin(right.y) * Mathf.Rad2Deg;
  105. float yaw = Mathf.Atan2(up.x, up.z) * Mathf.Rad2Deg;
  106. return new Vector3(yaw, pitch, roll);
  107. }
  108. /// <summary>
  109. /// 获取Transform及其子级的包围盒(MeshRenderer),若MeshRenderer包围盒长度为0,则获取BoxCollider包围盒
  110. /// </summary>
  111. /// <param name="transform"></param>
  112. /// <returns></returns>
  113. private static Bounds GetBounds(Transform transform)
  114. {
  115. Quaternion oldRotation = Quaternion.identity;
  116. bool boundsInitialized = false;
  117. //Bounds bounds = new Bounds(transform.position, Vector3.zero);
  118. Bounds bounds = new Bounds();
  119. Renderer[] renderers = transform.GetComponentsInChildren<Renderer>();
  120. foreach (Renderer renderer in renderers)
  121. {
  122. if (!boundsInitialized)
  123. {
  124. bounds = new Bounds(renderer.transform.position, Vector3.zero);
  125. boundsInitialized = true;
  126. }
  127. bounds.Encapsulate(renderer.bounds);
  128. }
  129. if (bounds.size.magnitude == 0)
  130. {
  131. BoxCollider[] colliders = transform.GetComponentsInChildren<BoxCollider>();
  132. foreach (BoxCollider collider in colliders)
  133. {
  134. if (!boundsInitialized)
  135. {
  136. bounds = new Bounds(collider.transform.position, Vector3.zero);
  137. boundsInitialized = true;
  138. }
  139. bounds.Encapsulate(collider.bounds);
  140. }
  141. }
  142. return bounds;
  143. }
  144. }
  145. }