国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

Unity3D實現鼠標控制旋轉轉盤

2020-01-24 00:10:06
字體:
來源:轉載
供稿:網友

在培訓模擬考試軟件中,我們經常會遇到類似用鼠標旋轉轉盤打開開關的需求。讓用戶更加真實的操作設備儀器。接下來說下我的解決方案。

因為鼠標操作是在UI平面上,所以我們要先將被操作的模型的世界坐標轉換到屏幕坐標上。代碼如下:

ModelScreenPos = camera.WorldToScreenPoint(Model.transform.position);

這里有個聲明,這個模型代表的是轉盤,而且要保證模型的中心點在轉盤中心。然后我們就要計算鼠標以模型在屏幕坐標為中心點的旋轉偏移量。我們開始以鼠標按下的瞬間,偏移量為0,然后進行每幀計算偏移量。偏移量也就是旋轉角度,很好計算,就是求兩個向量的夾角。角度angle=Vector2.Angle(OA,OB);

接下來我們要解決的就是旋轉方向是順時針還是逆時針的。利用unity的四元數公式

q = Quaternion.FromToRotation(OA, OB);

得出的四元數我們可以根據四元數的Z值判斷旋轉方向是順時針還是逆時針的。當Z為正時就是逆時針旋轉,當為負時就是順時針啦。可以自己寫個向量xy平面向量旋轉測試下。然后我們設置模型旋轉軸對應的歐拉角分量加上我們獲得的旋轉角度。功能就實現了。思路大體是這樣,但是在實現過程中有很多小的設置需要注意下。下面是我的源代碼:

private Vector2 ModelPos; private Vector2 mousePos; //當前鼠標位置 private Vector2 premousePos;//上一幀鼠標位置 private Quaternion q;  private float RotateAngle; private Vector3 localEluer; //模型歐拉角存儲變量  private bool IsSelect = false; void Start() {  ModelPos = camera.WorldToScreenPoint(go.transform.position);  angle = localEluer.x = info.opening;  go.transform.localEulerAngles = localEluer; }  public virtual void Update() {  if (Input.GetMouseButtonDown(0)&&modelCamera.IsTouch())  {   IsSelect = true;   premousePos = mousePos=Input.mousePosition; //每次重新點擊的時候都重置鼠標上一幀點擊坐標  }  if (Input.GetMouseButton(0)&& IsSelect)  {   mousePos = Input.mousePosition;   RotateAngle = Vector2.Angle(premousePos - ModelPos, mousePos - ModelPos);   //Debug.Log("RotateAngle+"+RotateAngle);   if (RotateAngle == 0)   {    premousePos = mousePos;   }   else   {    q = Quaternion.FromToRotation(premousePos - ModelPos, mousePos - ModelPos);    float k = q.z > 0 ? 1 : -1;    localEluer.x += k * RotateAngle;    //Debug.Log(localEluer.x);    angle = localEluer.x = Mathf.Clamp(localEluer.x, 0, AllowAngle); //這里是項目需要 限制一下旋轉圈數    go.transform.localEulerAngles = localEluer;    premousePos = mousePos;   }  }  if (Input.GetMouseButtonUp(0))  {   IsSelect = false;  }  }

效果圖如下:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 娄底市| 大渡口区| 舒城县| 鞍山市| 类乌齐县| 台东市| 池州市| 焉耆| 石家庄市| 郁南县| 二手房| 新安县| 吉安市| 庆云县| 文昌市| 临夏县| 云林县| 中宁县| 宜川县| 区。| 海南省| 丹东市| 沙田区| 厦门市| 饶阳县| 林西县| 黄石市| 昭通市| 宜昌市| 宜黄县| 开化县| 全椒县| 南丰县| 南开区| 广灵县| 金溪县| 新干县| 瑞金市| 丽江市| 富顺县| 和顺县|