Unity 球体旋转 到固定位置

将脚本挂在 球体上,
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;
	}


}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值