using UnityEngine; using UnityEngine.UI; using QFramework; using ChivaXR; using ChivaXR.Op; namespace QFramework { public class CameraPoseSetPanelData : UIPanelData { } public partial class CameraPoseSetPanel : UIPanel { StepListProxy m_StepListProxy; bool m_CameraState; protected override void OnInit(IUIData uiData = null) { mData = uiData as CameraPoseSetPanelData ?? new CameraPoseSetPanelData(); // please add init code here m_StepListProxy = DAL.Instance.Get(); NextBtn.onClick.AddListener(OnNextBtnClick); PreviousBtn.onClick.AddListener(OnPreviousBtnClick); AutoSettingCamera.onClick.AddListener(OnAutoSettingView); SaveCameraPose.onClick.AddListener(OnSaveCameraPoseBtnClick); SaveBtn.onClick.AddListener(OnSaveBtnClick); } //启动时记录当前状态 private bool recordautoEnterNextProcessState; //启动时记录当前播放 private bool recordplayView; protected override void OnOpen(IUIData uiData = null) { m_CameraState = RoamCameraController.Instance.toggle; RoamCameraController.Instance.SetCameraMoveState(true); recordautoEnterNextProcessState = ProcessManagement.Instance.autoEnterNextProcess; recordplayView = Preprocess_VoiceAndCamera.playView; Preprocess_VoiceAndCamera.playView = true; ProcessManagement.Instance.autoEnterNextProcess = false; Info.text = ""; } protected override void OnShow() { } protected override void OnHide() { } protected override void OnClose() { RoamCameraController.Instance.toggle = m_CameraState; ProcessManagement.Instance.autoEnterNextProcess = recordautoEnterNextProcessState; Preprocess_VoiceAndCamera.playView = recordplayView; } private void OnNextBtnClick() { Info.text = ""; ProcessManagement.Instance.JumpProcessState(ProcessManagement.Instance.currentStepID + 1); ProcessManagement.Instance.ActiveCurrentProcess(); } private void OnPreviousBtnClick() { Info.text = ""; ProcessManagement.Instance.JumpProcessState(ProcessManagement.Instance.currentStepID - 1); ProcessManagement.Instance.ActiveCurrentProcess(); } private void OnSaveCameraPoseBtnClick() { m_StepListProxy.SetOperationCameraPoseById(ProcessManagement.Instance.currentStepID, RoamCameraController.Instance.transform.position, RoamCameraController.Instance.transform.eulerAngles); Info.text = "设置第" + ProcessManagement.Instance.currentStepID + "步,镜头信息:" + RoamCameraController.Instance.transform.position + "/" + RoamCameraController.Instance.transform.eulerAngles; } private void OnSaveBtnClick() { m_StepListProxy.SaveOperation(); UIKit.ClosePanel(); } public void OnAutoSettingView() { PB_OpData pbOpData = ProcessManagement.Instance.GetCurrentProcess().GetComponent(); OpTrigger_ToolPack opTrigger_ToolPack = OperationManager.Instance.GetOpData(pbOpData.opData.operationDataName).gameObject.GetComponent(); if (opTrigger_ToolPack != null) { if (opTrigger_ToolPack.targetObjs.Count > 0) { Transform viewTarget = opTrigger_ToolPack.targetObjs[0].transform; Transform targetPoint = opTrigger_ToolPack.targetObjs[0].transform.GetComponentInChildren().transform; Bounds bound = GetBounds(targetPoint); Vector3 targetPos = bound.center + (bound.center - new Vector3(0, bound.center.y - 0.3f, 0)).normalized * (bound.size.magnitude < 0.8f ? 0.8f : bound.size.magnitude); Vector3 euler = Quaternion.LookRotation(bound.center - targetPos, Vector3.up).eulerAngles; RoamCameraController.Instance.SetCameraState(targetPos, euler); } } } Vector3 GetEulerAnglesFromVectors(Vector3 forward, Vector3 up) { // 确保向量都被归一化了 forward.Normalize(); up.Normalize(); // 右向量通过向上向量和前向量的叉乘得到 Vector3 right = Vector3.Cross(up, forward); // 通过右向量和前向量得到旋转 float roll = Mathf.Atan2(right.x, right.z) * Mathf.Rad2Deg; float pitch = Mathf.Asin(right.y) * Mathf.Rad2Deg; float yaw = Mathf.Atan2(up.x, up.z) * Mathf.Rad2Deg; return new Vector3(yaw, pitch, roll); } /// /// 获取Transform及其子级的包围盒(MeshRenderer),若MeshRenderer包围盒长度为0,则获取BoxCollider包围盒 /// /// /// private static Bounds GetBounds(Transform transform) { Quaternion oldRotation = Quaternion.identity; bool boundsInitialized = false; //Bounds bounds = new Bounds(transform.position, Vector3.zero); Bounds bounds = new Bounds(); Renderer[] renderers = transform.GetComponentsInChildren(); foreach (Renderer renderer in renderers) { if (!boundsInitialized) { bounds = new Bounds(renderer.transform.position, Vector3.zero); boundsInitialized = true; } bounds.Encapsulate(renderer.bounds); } if (bounds.size.magnitude == 0) { BoxCollider[] colliders = transform.GetComponentsInChildren(); foreach (BoxCollider collider in colliders) { if (!boundsInitialized) { bounds = new Bounds(collider.transform.position, Vector3.zero); boundsInitialized = true; } bounds.Encapsulate(collider.bounds); } } return bounds; } } }