Unity3D实现鼠标控制旋转转盘
- 作者: 各自安好10699046
- 来源: 51数据库
- 2020-08-12
这篇文章主要为大家详细介绍了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;
}
}
效果图如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,
推荐阅读
- C#通过fleck实现wss协议的WebSocket多人Web实时聊天(附源码)
- 团队城市未满足要求:MSBuildTools12.0_x86_Path 存在
- 使用 MSBuild.exe 在发布模式下构建 C# 解决方案
- 当我发布 Web 应用程序时,AfterPublish 脚本不运行
- 构建时 T4 转换的产品仅在下一个构建中使用
- ASP.NET Core Application (.NET Framework) for Windows x64 only error in project.assets.json
- 新的 .csproj 格式 - 如何将整个目录指定为“链接文件"到子目录?
- 如何将条件编译符号(DefineConstants)传递给 msbuild
- MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板
- NuGet 包还原找不到包,没有源
热点文章
团队城市未满足要求:MSBuildTools12.0_x86_Path 存在
0
使用 MSBuild.exe 在发布模式下构建 C# 解决方案
0
当我发布 Web 应用程序时,AfterPublish 脚本不运行
0
构建时 T4 转换的产品仅在下一个构建中使用
0
ASP.NET Core Application (.NET Framework) for Windows x64 only error in project.assets.json
0
新的 .csproj 格式 - 如何将整个目录指定为“链接文件"到子目录?
0
如何将条件编译符号(DefineConstants)传递给 msbuild
0
MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板
0
NuGet 包还原找不到包,没有源
0
使用 C# 6.0 功能运行 TFS 构建
0
