欢迎来到入门教程网!

C#教程

当前位置:主页 > 软件编程 > C#教程 >

Unity3D实现鼠标控制旋转转盘

来源:本站原创|时间:2020-01-10|栏目:C#教程|点击:

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

因为鼠标操作是在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#实现餐饮管理系统

栏    目:C#教程

下一篇:C#如何给枚举类型增加一个描述特性详解

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

本文地址:https://www.xiuzhanwang.com/a1/C_jiaocheng/4923.html

网页制作CMS教程网络编程软件编程脚本语言数据库服务器

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

联系QQ:835971066 | 邮箱:835971066#qq.com(#换成@)

Copyright © 2002-2020 脚本教程网 版权所有