最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Unity3D實現(xiàn)鼠標控制旋轉轉盤

 更新時間:2021年08月08日 10:14:04   作者:JayW就是我吖  
這篇文章主要為大家詳細介紹了Unity3D實現(xiàn)鼠標控制旋轉轉盤,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

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

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

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

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

q = Quaternion.FromToRotation(OA, OB);

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

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); //這里是項目需要 限制一下旋轉圈數(shù)
    go.transform.localEulerAngles = localEluer;
    premousePos = mousePos;
   }
  }
  if (Input.GetMouseButtonUp(0))
  {
   IsSelect = false;
  } 
 }

效果圖如下:

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

相關文章

  • C#中將DataTable轉化成List<T>的方法解析

    C#中將DataTable轉化成List<T>的方法解析

    大家應該都知道在.net項目中使用到DataTable和List<T>集合的地方較多,有的時候需要將DataTable轉化成List<T>,那么改如何轉化呢?下面通過這篇文章來一起學習下吧,本文中給出了詳細的示例代碼,相信對大家的理解和學習具有一定的參考借鑒價值。
    2016-12-12
  • 全面分析c# LINQ

    全面分析c# LINQ

    這篇文章主要介紹了c# LINQ的相關資料,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-08-08
  • 詳解C#中的依賴注入和IoC容器

    詳解C#中的依賴注入和IoC容器

    這篇文章主要介紹了C#中的依賴注入和IoC容器的相關資料,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-12-12
  • C#調用??倒I(yè)相機SDK采集圖像并在Halcon窗口中顯示方式

    C#調用海康工業(yè)相機SDK采集圖像并在Halcon窗口中顯示方式

    這篇文章主要介紹了C#調用??倒I(yè)相機SDK采集圖像并在Halcon窗口中顯示方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C#調用攝像頭實現(xiàn)拍照功能的示例代碼

    C#調用攝像頭實現(xiàn)拍照功能的示例代碼

    這篇文章主要介紹了C#調用攝像頭實現(xiàn)拍照功能的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • C#函數(shù)out多個返回值問題

    C#函數(shù)out多個返回值問題

    這篇文章主要介紹了C#函數(shù)out多個返回值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C#使用XML文件的操作詳解及示例

    C#使用XML文件的操作詳解及示例

    XML是 Extensible Markup Language 的簡稱,用于存儲和傳輸數(shù)據(jù)的可擴展標記語言,它被應用在數(shù)據(jù)交換、數(shù)據(jù)存儲、Web服務、網(wǎng)絡協(xié)議等場景,本文給大家介紹了C#使用XML文件的操作詳解及示例,需要的朋友可以參考下
    2024-10-10
  • C#實現(xiàn)簡易畫圖板的示例代碼

    C#實現(xiàn)簡易畫圖板的示例代碼

    這篇文章主要介紹了C#實現(xiàn)簡易畫圖板的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • C#實現(xiàn)文件上傳及文件下載功能實例代碼

    C#實現(xiàn)文件上傳及文件下載功能實例代碼

    文件上傳文件下載需求在項目中經(jīng)常會遇到,今天小編給大家分享C#實現(xiàn)文件上傳及文件下載功能實例代碼,需要的朋友參考下吧
    2017-08-08
  • C#操作Byte數(shù)組和十六進制進行互轉

    C#操作Byte數(shù)組和十六進制進行互轉

    這篇文章介紹了C#操作Byte數(shù)組和十六進制進行互轉的的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05

最新評論

龙川县| 崇左市| 都昌县| 贵阳市| 贵德县| 仁寿县| 射洪县| 九江县| 赤峰市| 襄汾县| 泽普县| 荔波县| 那坡县| 余姚市| 常山县| 于田县| 宁陕县| 商都县| 高雄县| 永善县| 民丰县| 平陆县| 常宁市| 昭平县| 奉节县| 杭州市| 禹城市| 石柱| 福鼎市| 南雄市| 正定县| 洛宁县| 华容县| 北碚区| 天祝| 焉耆| 临汾市| 东宁县| 进贤县| 凌海市| 仁怀市|