zoukankan      html  css  js  c++  java
  • Unity 3D鼠标操作实现旋转(相机围绕目标物体)、缩放观察物体

    //放在摄像头上,实现旋转、缩放观察物体
    using UnityEngine;
    
    public class BaseCam : MonoBehaviour
    {
      ///缩放距离

      public float ZoomSpeed=30;
      //拖动速度

      public float MovingSpeed=0.5f;
      //视角和摆动速度

      public float RotateSpeed=1;
      //摄像机旋转速度

      public float distance=30;
      public Transform rotateCenter;
    public Vector3 mousePos1; //记录鼠标点下去瞬间的位置 public Vector3 mousePos2; //记录鼠标任何时刻的位置 public Quaternion start_qua; //角度使用四元数 public Vector3 start_pos; //位置坐标 // Use this for initialization void Start() { //记录相机开始的角度与位置 start_qua = transform.rotation; start_pos = transform.position; }   Quaternion rotation;
      Vector3 position;
      float delta_x,delta_y,delta_z;
      float delta_rotation_x,delta_rotation_y;
    // Update is called once per frame void Update() {
        //拖动
        if(Input.GetMouseButton(2))
        {
          delta_x=Input.GetAxis("Mouse X")*MovingSpeed;
          delta_y=Input.GetAxis("Mouse Y")*MovingSpeed;
          rotation=Quaternion.Euler(0,transform.rotation.eulerAngles.y,0);
          transform.position=rotation*new Vector3(-delta_x,-delta_y,0)+transform.position;
        }
        //缩放

        if(Input.GetAxis("Mouse ScrollWheel")!=0)
        {
          delta_z=-Input.GetAxis("Mouse ScrollWheel")*ZoomSpeed;

          transform.Translate(0,0,-delta_z);

          //distance+=delta_z;
        }


     //记录鼠标实时移动的点
            mousePos2 = Input.mousePosition;   


        //旋转中心为自身(相机)
        if(Input.GetMouseButton(1))
        {
          delta_rotation_x=Input.GetAxis("Mouse X")*RotateSpeed;
          delta_rotation_y=-Input.GetAxis("Mouse Y")*RotateSpeed;
          position=transform.rotation*new Vector3(0,0,distance)+transform.position;
          transform.Rotate(0,delta_rotation_x,0,Space.World);
          transform.Rotate(delta_rotation_y,0,0);
          transform.position=transform.rotation*new Vector3(0,0,-distance)+position;

        }

      }
    void OnGUI() { //鼠标左键 if (Input.GetMouseButton(0)) { mousePos1 = Input.mousePosition; //记录鼠标点击瞬间的点 Vector3 offset = mousePos1 - mousePos2; //记录鼠标移动的距离 //上下与左右 旋转分开,绝对值比较 if (Mathf.Abs(offset.x) > Mathf.Abs(offset.y)) { //以物体上方为旋转轴(Vector3.up == new Vector3(0, 1.0f, 0)),物体左右旋转角度与鼠标横向移动距离相关,变化速率2f transform.RotateAround(new Vector3(0, 0, 0), Vector3.up, Time.deltaTime * offset.x * 2f);
             // transform.RotateAround(rotateCenter.localPosition, Vector3.up, Time.deltaTime * offset.x * 2f); //旋转中心为目标物体rotateCenter
           
                }
                else
                {
                    //以世界坐标右方为旋转轴(transform.right,是会变化的量),物体上下旋转角度与鼠标纵向移动距离相关,变化速率2f
                    transform.RotateAround(new Vector3(0, 0, 0), transform.right, -Time.deltaTime * offset.y * 2f);//旋转中心为世界
    // transform.RotateAround(rotateCenter.localPosition, transform.right, -Time.deltaTime * offset.y * 2f);//旋转中心为目标物体rotateCenter

    }
    //打印数据transform.right变量 Debug.Log("pos: " + transform.right); } ////鼠标中键,物体恢复原来的角度与位置 // if (Input.GetMouseButton(2)) // { // transform.rotation = start_qua; // transform.position = start_pos; // } ////鼠标中键滑动,物体缩放,摄像头前后移动距离范围在2f~5f,变化速率3f // if (Input.GetAxis("Mouse ScrollWheel") > 0f && Vector3.Distance(transform.position, new Vector3(0, 0, 0)) > 2f) // { // transform.Translate(Vector3.forward * Time.deltaTime * Input.GetAxis("Mouse ScrollWheel") * 5f);
           // }
           // if (Input.GetAxis("Mouse ScrollWheel") < 0f && Vector3.Distance(transform.position, new Vector3(0, 0, 0)) <5f)
           // {
               // transform.Translate(Vector3.back * Time.deltaTime * (-Input.GetAxis("Mouse ScrollWheel")) * 5f);
            //}//
        }
    }
  • 相关阅读:
    按年按月分组查询
    dir listing 目录文件列表索引
    ps/sql developer 登录远程服务器
    Sql 基础问题
    数组的ES6,ES7的方法
    release中技术点的定义
    数仓面试
    项目总体分析
    spark
    dmp准备工作
  • 原文地址:https://www.cnblogs.com/WalkingSnail/p/15627458.html
Copyright © 2011-2022 走看看