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;
    }
  }

效果图如下:

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

(0)

相关推荐

  • Unity 2017使用UGUI实现大转盘抽奖

    本文实例为大家分享了Unity 2017实现大转盘抽奖的具体代码,供大家参考,具体内容如下 涉及到的插件:Dotween 在"Hierarchy"面板创建一个Image,这个Image用来显示大转盘的那个圆盘,我用的UGUI里默认的那个圆圆的图片,放大后很模糊,不过不打紧 接着创建一个Panel名字改成"奖品组",这个是奖品的父物体,记得吧Panel里的Image,Canvas Renderer组件删了 然后在创建一个Panel名字改成"Awar"

  • Unity实现大转盘的简单笔记

    本文实例为大家分享了Unity实现大转盘展示的具体代码,供大家参考,具体内容如下 1.unity中要实现旋转一个gameobject,我们需要改变它的transform下对应的Rotation,由于我们的大转盘是2D的视角,所以我们首先需要明确大转盘旋转的方向是旋转Rotation的Z. 2.如何实现大转盘由旋转快到慢,再到旋转指定为位置停下.查看了unity的脚本可以找到如下方法实现旋转大转盘如下: public void Rotate(Vector3 eulerAngles, Space r

  • Unity幸运转盘实战项目

    幸运转盘主要是由两部分组成--转盘.指针,实现的方式也分两种,转盘动或者指针动,不过两者的原理都是一样的,这里就以指针动做了一个项目级的demo(由于后面的圆盘中间的那条竖线有点往左偏,所以导致那些圣诞老人的显示有些偏移).< Demo 下载> 在项目开发中,一般这个功能的实现过程是: 1.当点击开始的时候,转盘开始动, 同时向服务端发送协议: 2.服务端返回数据(前端计算好对应的角度),当转盘旋转一定时间后开始减速直至对应角度 当然也可以等服务端返回数据后再开始模拟旋转过程,但是由于受网络的

  • Unity3D实现鼠标控制旋转转盘

    在培训模拟考试软件中,我们经常会遇到类似用鼠标旋转转盘打开开关的需求.让用户更加真实的操作设备仪器.接下来说下我的解决方案. 因为鼠标操作是在UI平面上,所以我们要先将被操作的模型的世界坐标转换到屏幕坐标上.代码如下: ModelScreenPos = camera.WorldToScreenPoint(Model.transform.position); 这里有个声明,这个模型代表的是转盘,而且要保证模型的中心点在转盘中心.然后我们就要计算鼠标以模型在屏幕坐标为中心点的旋转偏移量.我们开始以鼠

  • Unity3D实现鼠标控制视角转动

    前面,学了物体的移动功能,现在来学一下C#实现鼠标控制摄像机(视角)移动. 代码如下: C#脚本(在Unity 5.5.1 下能运行): using System.Collections; using System.Collections.Generic; using UnityEngine; public class MouseView : MonoBehaviour { public enum RotationAxes { MouseXAndY = 0, MouseX = 1, MouseY

  • Unity3D使用鼠标旋转缩放平移视角

    Unity使用鼠标旋转缩放平移视角,供大家参考,具体内容如下 用代码在Game界面完美实现Scene界面的操作方法. 使用方法:把脚本挂在相机上,把跟踪的target拖到脚本上. 视角跟踪的是一个空物体,当然如果你是做RPG游戏需要跟踪某一角色的视角,那就不需要中键平移功能,把空物体换成角色就行. 代码主要是分三部分功能进行实现. 1.右键拖动控制视角的旋转: 2.滚轮旋转控制视角的缩放: 3.中键拖动控制视角的平移. 右键拖动控制旋转主要是用GetAxis获得鼠标在x方向与y方向平移的距离,相

  • Unity3D实现旋钮控制灯光效果

    本文实例为大家分享了Unity3D实现旋钮控制灯光效果的具体代码,供大家参考,具体内容如下 前言 实际上使用的是非常简单的方式,通过开启以及关闭带有灯光效果物体的渲染以模拟出的灯光切换效果. 正确方式应当为物体切换不同的Material实现效果. 所用函数 public void RotateAround(Vector3 point, Vector3 axis, float angle); //通过给定一个世界坐标.轴向以及一个角度,使物体以该角度旋转绕世界坐标点的轴向的变换 public T

  • 超级经典一套鼠标控制左右滚动图片带自动翻滚

    超级经典一套鼠标控制左右滚动图片带自动翻滚 周宪环 周桢炜 张颖 王乃超 谢雯琇 吕铬 贾正如 = GetObj('List1').scrollWidth){GetObj('ISL_Cont').scrollLeft = GetObj('ISL_Cont').scrollLeft - GetObj('List1').scrollWidth;} GetObj('ISL_Cont').scrollLeft += Space ; } function CompScr(){ var num; if(Co

  • C++实现鼠标控制的黑框象棋

    本文实例为大家分享了C++实现鼠标控制的黑框象棋的具体代码,供大家参考,具体内容如下 该象棋小游戏的特色 有颜色标注出 红方和绿方 可以用鼠标控制 颜色原理 直接调用用Windows自带的颜色API 用到了 颜色头文件.h 代码. //consolecolor.hpp这是着色的实现头文件 #pragma once #include<Windows.h>//调用win32API函数 #include<iostream>//调用flush成员函数,首先刷新缓冲区 namespace c

  • JavaScript实现鼠标控制自由移动的窗口

    本文实例为大家分享了JavaScript实现鼠标控制自由窗口的具体代码,供大家参考,具体内容如下 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>用鼠标移动的窗口</title> <style> .mainDiv { width: 350px; height: 200px; borde

  • Unity3D使用陀螺仪控制节点旋转

    本文实例为大家分享了Unity3D陀螺仪控制节点旋转的具体代码,供大家参考,具体内容如下 /******************************************************************** Desc: 陀螺仪对相机的逻辑类. *********************************************************************/ using System; using System.Collections; using

  • 可拖动窗口,附带鼠标控制渐变透明,开启关闭功能

    <style type="text/css"><!--#Layer1 { position:absolute; width:210px; height:160px; z-index:1; left: 178px; top: 322px; background-color: #FFFBF0;}#content { position:absolute; width:200px; height:115px; z-index:1; left: 0px; top: 27px; 

  • ImageFlow可鼠标控制图片滚动

    You are free to use this in any product, or on any web site. For more information about ImageFlow read the Documentation and check my Newsblog. For anything else simply drop me a line in my Shoutbox. ChangeLog Version 0.8  Added Safari 1.x compatibil

随机推荐