将脚本挂在 球体上,
public List<Transform> mObjList; 存储 要停留的位置,
public Transform mControlObj; 固定计算的位置,用于其他四个位置 往这个位置去。
using UnityEngine; using System.Collections; using System.Collections.Generic; public class CircleManager : MonoBehaviour { private Vector3 mousePos; public Transform mControlObj; public List<Transform> mObjList; private Vector3 mControlTran; private Vector3 mItemTran; private Quaternion FinallQuaternion; private bool IsMove =false; void Update () { if(SaveManager.IsOpenMainUI) { if (Input.GetMouseButtonDown(0)) { IsMove =false; StopCoroutine("OnMouseDown"); StartCoroutine("OnMouseDown"); } if(IsMove) { transform.rotation = Quaternion.Lerp(transform.rotation, FinallQuaternion, 0.2f); } } } IEnumerator OnMouseDown() { mousePos = Input.mousePosition; while(Input.GetMouseButton(0)) { Vector3 offset = mousePos - Input.mousePosition; if(offset.x!=0) transform.Rotate(Vector3.up * offset.x*0.1f, Space.World); if(offset.y!=0) transform.Rotate(Vector3.right*(-1)*offset.y*0.1f,Space.World); mousePos=Input.mousePosition; yield return null; } yield return new WaitForSeconds(0.1f); EndCaculate(); yield return new WaitForSeconds(0.2f); IsMove = false; } private void EndCaculate() { Vector3 first=mControlObj.position - transform.position; Vector3 second; float angle =361.0f; int Index = 0; Vector3 NeedCaculate =Vector3.zero; for(int i=0;i<mObjList.Count;i++) { second = mObjList[i].position - transform.position; float angles = Vector3.Angle(second,first); if(Mathf.Abs(angles) < Mathf.Abs(angle)) { angle =Mathf.Abs(angles); Index = i; } } if(Index ==1||Index ==2 ||Index ==0) MonoManager.Ins.CallFuncWithSingleInstance("MainUIManager", "OpenVipScreen"); else MonoManager.Ins.CallFuncWithSingleInstance("MainUIManager", "CloseVipScreen"); FinallQuaternion = CalculateRotation(mObjList[Index].position); IsMove =true; } //计算球面上点 hitPoint 朝向主摄像机时球的 rotation private Quaternion CalculateRotation(Vector3 hitPoint) { // 获取物体 到球心的向量 Vector3 v1 = hitPoint - transform.position; // 获取参照物 到球心的向量 Vector3 v2 = mControlObj.position - transform.position; // 球进行旋转即是以通过球心且和 v1、v2 组成界面垂直的向量(法向量)为旋转轴 // v1 和 v2 叉乘,获取 v1、v2 组成界面的法向量 Vector3 cross = Vector3.Cross(v1, v2); // 球绕旋转轴旋转的角度为 v1 和 v2 的夹角 // 获取向量 v1、v2 的夹角 float angle = Vector3.Angle(v1, v2); //获取球以 cross 为旋转轴 旋转angle 角度的 四元数 Quaternion quaternion = Quaternion.AngleAxis(angle, cross); // 这样错误, 必须要 quaternion 左乘 tr.rotation //return tr.rotation * quaternion; return quaternion * transform.rotation; } }
Unity 球体旋转 到固定位置
最新推荐文章于 2024-08-23 10:15:00 发布