diff --git a/Assets/Scripts/UI/Common/ModelViewer/ModelViewRenderImage.cs b/Assets/Scripts/UI/Common/ModelViewer/ModelViewRenderImage.cs index 582ed4d0a..1e19bf64a 100644 --- a/Assets/Scripts/UI/Common/ModelViewer/ModelViewRenderImage.cs +++ b/Assets/Scripts/UI/Common/ModelViewer/ModelViewRenderImage.cs @@ -25,7 +25,7 @@ namespace NBF int _width; int _height; bool _cacheTexture; - Vector3 _rotating; + // Vector3 _rotating; const int RENDER_LAYER = 0; const int HIDDEN_LAYER = 10; @@ -80,7 +80,7 @@ namespace NBF ViewerSettings = settings; Object prefab = Resources.Load(model); - if(prefab == null) return; + if (prefab == null) return; GameObject go = ((GameObject)Object.Instantiate(prefab)); var joint = go.GetComponent(); if (joint != null) @@ -111,7 +111,7 @@ namespace NBF _model = null; } - _rotating = Vector3.zero; + // _rotating = Vector3.zero; } @@ -205,11 +205,11 @@ namespace NBF void Render(object param = null) { - if (_rotating != Vector3.zero && this.modelRoot != null) - { - // 使用 Quaternion 来避免欧拉角带来的问题 - modelRoot.Rotate(_rotating, Space.World); - } + // if (_rotating != Vector3.zero && this.modelRoot != null) + // { + // // 使用 Quaternion 来避免欧拉角带来的问题 + // modelRoot.Rotate(_rotating, Space.World); + // } SetLayer(_root.gameObject, RENDER_LAYER); @@ -236,18 +236,51 @@ namespace NBF #region 旋转 - public void StartRotate(Vector3 delta) + // 在 ModelViewRenderImage 中添加新字段 + private Vector2 _lastMousePosition; + + private bool _isDragging; + + public void StartRotate(Vector2 currentMousePosition) { - _rotating = delta; + _lastMousePosition = currentMousePosition; + _isDragging = true; + } + + public void UpdateRotation(Vector2 currentMousePosition) + { + if (!_isDragging || modelRoot == null || _camera == null) return; + + Vector2 delta = currentMousePosition - _lastMousePosition; + + // 使用适中的灵敏度 + float sensitivity = 0.2f; + float rotX = -delta.y * sensitivity; + float rotY = -delta.x * sensitivity; + + Quaternion yRotation = Quaternion.AngleAxis(rotY, _camera.transform.up); + Quaternion xRotation = Quaternion.AngleAxis(rotX, _camera.transform.right); + + // 组合旋转并应用 + modelRoot.rotation = yRotation * xRotation * modelRoot.rotation; + + _lastMousePosition = currentMousePosition; } public void StopRotate() { - _rotating = Vector3.zero; + _isDragging = false; + } + + // 重置到初始状态的方法 + public void ResetToInitialRotation() + { + modelRoot.localRotation = Quaternion.identity; + _isDragging = false; } #endregion - + #region MyRegion diff --git a/Assets/Scripts/UI/Common/ModelViewer/ModelViewer.cs b/Assets/Scripts/UI/Common/ModelViewer/ModelViewer.cs index 396e10ff2..a6e59f5cc 100644 --- a/Assets/Scripts/UI/Common/ModelViewer/ModelViewer.cs +++ b/Assets/Scripts/UI/Common/ModelViewer/ModelViewer.cs @@ -64,33 +64,52 @@ namespace NBF { var dragObj = TouchHolder; var gesture1 = new SwipeGesture(dragObj); + gesture1.onBegin.Set(OnSwipeBegin); gesture1.onMove.Set(OnSwipeMove); gesture1.onEnd.Set(OnSwipeEnd); } + private void OnSwipeBegin(EventContext context) + { + var gesture = context.sender as SwipeGesture; + if (gesture == null) return; + if (context.inputEvent.button == 0) + { + _renderImage.StartRotate(gesture.position); + } + } + private void OnSwipeMove(EventContext context) { var gesture = context.sender as SwipeGesture; if (gesture == null) return; - var v = Vector3.zero; - if (context.inputEvent.button == 0) { - v.y = -gesture.delta.x * 0.2f; - v.z = -gesture.delta.y * 0.2f; - if (!gesture.snapping) - { - v.y = 0; - v.z = 0; - } - - if (Mathf.Abs(v.y) < 1) //消除手抖影响 - v.y = 0; - if (Mathf.Abs(v.z) < 1) //消除手抖影响 - v.z = 0; - _renderImage.StartRotate(v); + _renderImage.UpdateRotation(gesture.position); } + + // var gesture = context.sender as SwipeGesture; + // if (gesture == null) return; + // var v = Vector3.zero; + // + // + // if (context.inputEvent.button == 0) + // { + // v.y = -gesture.delta.x * 0.2f; + // v.z = -gesture.delta.y * 0.2f; + // if (!gesture.snapping) + // { + // v.y = 0; + // v.z = 0; + // } + // + // if (Mathf.Abs(v.y) < 1) //消除手抖影响 + // v.y = 0; + // if (Mathf.Abs(v.z) < 1) //消除手抖影响 + // v.z = 0; + // _renderImage.StartRotate(v); + // } } private void OnSwipeEnd(EventContext context)