当前位置: 首页 > 编程笔记 >

Unity3D实现鼠标控制旋转转盘

公羊新
2023-03-14
本文向大家介绍Unity3D实现鼠标控制旋转转盘,包括了Unity3D实现鼠标控制旋转转盘的使用技巧和注意事项,需要的朋友参考一下

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

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

效果图如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍Flutter 控制屏幕旋转的实现,包括了Flutter 控制屏幕旋转的实现的使用技巧和注意事项,需要的朋友参考一下 最近需要做个平板的项目,然后需要直接横屏,有2种实现方式。 1, 随着屏幕旋转,布局自动调整。做横竖屏适配 2,强制屏幕横屏,不随着屏幕去调整 第一种方式这里就不做说明了。代码做适配就可以。 下面说一下第二种实现方式 Flutter 自带方式 flutter 为我们提

  • 本文向大家介绍unity3d 四元数外观旋转,包括了unity3d 四元数外观旋转的使用技巧和注意事项,需要的朋友参考一下 示例 Quaternion.LookRotation(Vector3 forward [, Vector3 up])将创建一个四元数旋转,该旋转向前看“向下”向前的向量,并使Y轴与“向上”向量对齐。如果未指定up向量,Vector3.up则将使用。 旋转此游戏对象以查看目标游

  • 所以,我有一艘附加了“硬点”的船,可以把武器放在上面。放置后,它们瞄准鼠标位置,旋转范围有限:参见此处 旋转范围基于minAngle和maxAngle,并通过eulerAngles计算。父硬点槽的z,加/减角度修改器(在本例中为20)。我不得不做一些奇怪的旋转巫术(参见代码片段中的OneEightyToThreeSixty()),以使鼠标的视角与minAngle/maxAngle的格式匹配。 角度

  • 我想做的是: 由父视图控制器管理的父视图不应旋转。 由子视图控制器管理的子视图应该旋转到所有方向。 我所尝试的: 家长视图控制器 儿童视图控制器 Xcode部署信息中支持的方向设置为所有四个。 我得到的: 没有视图的旋转。如果将父视图的旋转设置为“全部”,则所有视图将一起旋转。所以要么全有要么全无。 更新 当我尝试放置UIDeviceOrientationIDChangeNotification的

  • 本文向大家介绍Unity3D实现控制摄像机移动,包括了Unity3D实现控制摄像机移动的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Unity3D实现控制摄像机移动的具体代码,供大家参考,具体内容如下 最近公司的几个项目开发内容基本相同,很多脚本直接复制过来就可以拼接项目。之前一直是代码爱好者,能自己敲的绝对不去复制粘贴。但是开发速度确实是被耽误了,所以接下来打算把开发中常用的脚本

  • 本文向大家介绍C#控制图像旋转和翻转的方法,包括了C#控制图像旋转和翻转的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#控制图像旋转和翻转的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的C#程序设计有所帮助。