欢迎来到代码驿站!

.NET代码

当前位置:首页 > 软件编程 > .NET代码

Unity3D实现鼠标控制旋转转盘

时间:2021-01-18 14:42:57|栏目:.NET代码|点击:

在培训模拟考试软件中,我们经常会遇到类似用鼠标旋转转盘打开开关的需求。让用户更加真实的操作设备仪器。接下来说下我的解决方案。

因为鼠标操作是在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;
  } 
 }

效果图如下:

上一篇:C#实现.net页面之间传值传参方法汇总

栏    目:.NET代码

下一篇:C#使用yield关键字构建迭代器详解

本文标题:Unity3D实现鼠标控制旋转转盘

本文地址:http://www.codeinn.net/misctech/46823.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有