当前位置: 首页 > news >正文

Unity中的平移 缩放 旋转

Unity中的平移 缩放 旋转

1.最近想实现Unity中的平移 缩放 旋转功能, 类似于Unity编辑器状态下的效果.尝试了好几个方式,效果都有瑕疵,网友们谁有好的实现方式,请教我.
下面是我的一种实现方式:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 本脚本实现场景的平移,缩放,旋转功能
/// 初始状态,要求场景所有模型对象(不包括摄像机)有一个父对象,并且此父对象的坐标为世界坐标系原点
/// 初始状态,摄像机位置为(0,0,-10),并朝向世界坐标系原点。
/// 平移功能:场景对象在世界坐标系的XY平面移动。
/// 缩放功能:摄像机沿着世界坐标系的Z轴方向,前后移动。
/// 旋转功能:场景对象绕自身坐标系的X轴和Y轴旋转。
/// </summary>
public class DragRotateScale : MonoBehaviour {
    //场景对象
    public Transform scene;
    //镜头与目标距离
    public float camTarDistance = 2.0f, camTarDistanceMin = 2.0f, camTarDistanceMax = 30.0f;
    //拖拽灵敏度
    public float dragSensitive = 1.0f;
    //旋转灵敏度
    public float rotateSensitive = 10.0f;
    //缩放灵敏度
    public float scaleSensitive = 5.0f;
    //双击选中间隔系数
    public float selectedSensitive = 4.0f;
    //阻尼参数及系数
    public bool needDamping = true;
    private float dampingScale = 5.0f;
    //鼠标移动分量
    private float camEulerX, camEulerY;
    private Quaternion camRotation;
    private Vector3 camPosition;
    //鼠标右键上一次点击时间
    private float firstClickTime = 0;
    /// <summary>
    /// 双击鼠标右键,选中场景中心
    /// 使摄像机回到初始位置
    /// </summary>
    void SlectedCenter()
    {
        if (Input.GetMouseButtonDown(1))
        {
            if (firstClickTime != 0f && Time.realtimeSinceStartup - firstClickTime < 0.1f * 

selectedSensitive)
            {
                transform.position = new Vector3(0, 0, -10);
            }
            firstClickTime = Time.realtimeSinceStartup;
        }
    }
    /// <summary>
    /// 鼠标滚轮调整镜头与目标距离,实现缩放
    /// </summary>
    void ScrollWheelScale()
    {
        //调整镜头距离
        if (Mathf.Abs(Input.GetAxis("Mouse ScrollWheel")) > 0.02f)
        {
            camTarDistance = Input.GetAxis("Mouse ScrollWheel") * scaleSensitive;
            camPosition = new Vector3(transform.position.x, transform.position.y, transform.position.z 

+ camTarDistance);
            transform.position = Vector3.Lerp(transform.position, camPosition, Time.deltaTime * 

dampingScale);
        }
    }
    /// <summary>
    /// 鼠标右键旋转场景
    /// </summary>
    void RightDownRotate()
    {
        if (Input.GetMouseButton(1))
        {
            camEulerX += Input.GetAxis("Mouse X") * rotateSensitive;
            camEulerY += Input.GetAxis("Mouse Y") * rotateSensitive;

            Quaternion targetRotation = scene.rotation;

            targetRotation = Quaternion.Euler(camEulerY, -camEulerX, 0.0f);
            scene.rotation = targetRotation;
        }

    }
    /// <summary>
    /// 鼠标左键拖拽场景,实现场景平移(摄像机反向移动)
    /// </summary>
    void LeftDownDrag()
    {
        if (Input.GetMouseButton(0))
        {
            float horizontal = -Input.GetAxis("Mouse X") * dragSensitive;
            float vertical = -Input.GetAxis("Mouse Y") * dragSensitive;

            transform.Translate(new Vector3(horizontal, vertical, 0.0f));
        }
    }

    void Start()
    {
        //初始化参数
        camRotation = transform.rotation;
        camPosition = transform.position;
        Vector3 angles = transform.eulerAngles;
        camEulerX = angles.y;
        camEulerY = angles.x;
    }

    void Update()
    {
        LeftDownDrag();
        RightDownRotate();
        ScrollWheelScale();
        SlectedCenter();
    }
}
原文地址http://www.bieryun.com/2473.html

相关文章:

  • android开发学习 ------- 【转】 android中的单例模式 (详解)
  • python学习笔记(数据类型)
  • P1073 最优贸易
  • 080.mycat和mycopy
  • [模板] LIS
  • 用户管理 useradd userdel usermod
  • canvas填充样式
  • 公钥加密—私钥签名
  • 网络应用框架Netty快速入门
  • Redux 中间件分析
  • c# yield关键字原理详解
  • 一个日期处理类库moment.js
  • 使用Kolla构建Pike版本OpenStack Docker镜像
  • spring MVC 使用 hibernate validator验证框架,国际化配置
  • Kubernetes软件包管理系统-Helm架构
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • Apache Zeppelin在Apache Trafodion上的可视化
  • CSS中外联样式表代表的含义
  • FineReport中如何实现自动滚屏效果
  • Mysql优化
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Odoo domain写法及运用
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Spring Boot快速入门(一):Hello Spring Boot
  • vue 个人积累(使用工具,组件)
  • 安卓应用性能调试和优化经验分享
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 分布式熔断降级平台aegis
  • 记录一下第一次使用npm
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 新版博客前端前瞻
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • # include “ “ 和 # include < >两者的区别
  • #预处理和函数的对比以及条件编译
  • (Matlab)使用竞争神经网络实现数据聚类
  • (ZT)一个美国文科博士的YardLife
  • (八十八)VFL语言初步 - 实现布局
  • (蓝桥杯每日一题)love
  • (算法)求1到1亿间的质数或素数
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)甲方乙方——赵民谈找工作
  • .net core 依赖注入的基本用发
  • .NET delegate 委托 、 Event 事件
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .NET Micro Framework初体验(二)
  • .Net Redis的秒杀Dome和异步执行
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .net 生成二级域名
  • .NET 中的轻量级线程安全
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • :=