Unity 触屏手势控制Camera平移旋转缩放
Unity 触屏手势控制Camera平移旋转缩放
实现思路
单点触屏,位移增量控制相机平移;
两点触屏,两点位移控制相机前后移动(缩放);两点中一点不位移控制相机绕点旋转;
实现需要的API
Touch.position触屏点的位置
Touch.deltaPosition触屏点的位移增量
Touch.phase触屏的状态描述触摸的阶段
Input.touchCount触屏点的数量
Input.touches触屏点的数组
代码
using System;
using UnityEngine;public class TouchControlCamera : MonoBehaviour
{public float Speed = 1;//控制速度Transform m_Camera;//相机Vector3 m_transfrom;//记录camera的初始位置Vector3 m_eulerAngles;//记录camera的初始角度Vector3 m_RayHitPoint;//记录射线点Touch m_touchLeft;//记录左边的触屏点Touch m_touchRight;//记录右边的触屏点int m_isforward;//标记摄像机的前后移动方向//用于判断是否放大float m_leng0 = 0;int IsEnlarge(Vector2 P1, Vector2 P2){float leng1 = Vector2.Distance(P1, P2);if (m_leng0 == 0){m_leng0 = leng1;}if (m_leng0 < leng1){//放大手势m_leng0 = leng1;return 1;}else if (m_leng0 > leng1){//缩小手势m_leng0 = leng1;return -1;}else{m_leng0 = leng1;return 0;}}void Start(){m_Camera = this.transform;m_RayHitPoint = Vector3.zero;m_transfrom = m_Camera.position;m_eulerAngles = m_Camera.eulerAngles;}//得到单位向量Vector2 GetDirection(Vector2 vector){vector.Normalize();return vector;}void Update(){if (Input.touchCount <= 0)return;if (Input.touchCount == 1) //单点触碰移动摄像机{if (Input.touches[0].phase == TouchPhase.Began)RayPoint();if (Input.touches[0].phase == TouchPhase.Moved) //手指在屏幕上移动,移动摄像机{Translation(-GetDirection(Input.touches[0].deltaPosition));}}else if (Input.touchCount == 2){//判断左右触屏点if (Input.touches[0].position.x > Input.touches[1].position.x){m_touchLeft = Input.touches[1];m_touchRight = Input.touches[0];}else{m_touchLeft = Input.touches[0];m_touchRight = Input.touches[1];}RayPoint();if (m_touchRight.deltaPosition != Vector2.zero && m_touchLeft.deltaPosition != Vector2.zero){//判断手势伸缩从而进行摄像机前后移动参数缩放效果m_isforward = IsEnlarge(m_touchLeft.position, m_touchRight.position);FrontMove(m_isforward);}else if (m_touchRight.deltaPosition == Vector2.zero && m_touchLeft.deltaPosition != Vector2.zero){RotatePoint(-GetDirection(m_touchLeft.deltaPosition));//左手旋转}else if (m_touchRight.deltaPosition != Vector2.zero && m_touchLeft.deltaPosition == Vector2.zero){RotatePoint(-GetDirection(m_touchRight.deltaPosition));//右手旋转}else{return;}}}Vector3 m_VecOffet = Vector3.zero;/// <summary>/// 水平平移/// </summary>/// <param name="direction"></param>void Translation(Vector2 direction){m_VecOffet = m_RayHitPoint - m_Camera.position;float ftCamerDis = GetDis();if (ftCamerDis == 0){ftCamerDis = 1;}float tranY = direction.y * (float)Math.Sin(Math.Round(m_Camera.localRotation.eulerAngles.x, 2) * Math.PI / 180.0);float tranZ = direction.y * (float)Math.Cos(Math.Round(m_Camera.localRotation.eulerAngles.x, 2) * Math.PI / 180.0);m_Camera.Translate(new Vector3(-direction.x, -tranY, -tranZ) * ftCamerDis * Time.deltaTime * Speed, Space.Self);m_RayHitPoint = m_Camera.position + m_VecOffet;}/// <summary>/// 得到射线碰撞点/// </summary>void RayPoint(){Ray ray;ray = new Ray(m_Camera.position, m_Camera.forward);RaycastHit hit;if (Physics.Raycast(ray, out hit)){m_RayHitPoint = hit.point;}else{m_RayHitPoint = transform.forward * 800 + transform.position;//摄像机前方 800 点 }}/// <summary>/// 绕点旋转/// </summary>void RotatePoint(Vector2 rotate){Vector3 eulerAngles = m_Camera.eulerAngles;float eulerAngles_x = eulerAngles.y;float eulerAngles_y = eulerAngles.x;float ftCamerDis = GetDis();eulerAngles_x += (rotate.x) * Time.deltaTime * 60;eulerAngles_y -= (rotate.y) * Time.deltaTime * 60;if (eulerAngles_y > 80){eulerAngles_y = 80;}else if (eulerAngles_y < 1){eulerAngles_y = 1;}Quaternion quaternion = Quaternion.Euler(eulerAngles_y, eulerAngles_x, (float)0);Vector3 vector = ((Vector3)(quaternion * new Vector3((float)0, (float)0, -ftCamerDis))) + m_RayHitPoint;m_Camera.rotation = quaternion;m_Camera.position = vector;}/// <summary>/// 向前移动/// Direction[方向]/// </summary>/// <param name="intDirection">填写正反,1向前移动,2向后移动</param>void FrontMove(int intDirection){float ftCamerDis = GetDis();if (ftCamerDis < 1){ftCamerDis = 1;}m_Camera.Translate(Vector3.forward * ftCamerDis * Time.deltaTime * Speed * intDirection);}float GetDis(){float ftCamerDis = Vector3.Distance(m_Camera.position, m_RayHitPoint);return ftCamerDis;}//相机复位public void Reset(){m_Camera.position = m_transfrom;m_Camera.eulerAngles = m_eulerAngles;}
}
原理参见我的另一篇文章地址
Unity 触屏手势控制Camera平移旋转缩放相关推荐
- Unity实现触摸屏手势控制镜头旋转与缩放
一.关于 Unity实现触摸屏手势控制镜头旋转与缩放脚本 /*** * Title:"三维可视化" 项目 * 主题:手势控制物体的旋转缩放 * Description: * 功能: ...
- 手势控制控件 的缩放,平移和旋转:
手势控制控件的缩放,平移和旋转: mapView是要移动的控件,TouchLayout是手势控制的区域,具体代码如下: touchLayout.setOnTouchListener(new Touch ...
- 什么软件可以将win窗口进行置顶_【玩转YOGA】第四期:像平板一样使用平板——触屏手势软件GestureSign...
YOGA C系列翻转本配备了一块十点触控屏幕,它给我们带来了全新的Windows触控体验,将屏幕翻折后更可以当成一台平板来使用.不过由于Windows本身仍是一个电脑操作系统,默认场景下的许多交互逻辑 ...
- 智能家居新品-华尔兹智能语音面板,支持按键+触屏+语音控制交互的智能面板
视声发布首款支持按键+触屏+语音控制交互的KNX智能面板,华尔兹智能语音面板,智能家居控制只需动动嘴,点点屏幕,按下按键,随时随地听您指挥.
- Unity3D类英雄联盟镜头控制(平移和缩放)
Unity3D类英雄联盟镜头控制(平移和缩放) using System.Collections; using System.Collections.Generic; using UnityEngin ...
- Unity实现安卓端手势控制摄像机的旋转和缩放
说明 上一篇记录了PC端鼠标控制摄像机的移动和缩放,这一篇写的是在安卓机上实现手势控制摄像机围绕一个物体进行旋转和缩放,两篇的代码逻辑基本一样只是输入检测有区别,这里我是分开记录,没有整合[Uni ...
- Unity在移动端iphone/ipad上的触屏手势
这几天做ipad的项目时,遇到触屏手势识别操作问题,这里介绍双指控制的缩放和左右移动3D物体,C#代码如下所示: using UnityEngine; using System.Collections ...
- Linux的触屏手势软件安装,如何添加Mac的多点触控手势到Ubuntu | MOS86
虽然Mac操作系统有很多故障,易于使用是苹果在其他地方超越的主要地方.在Mac笔记本电脑上,由于macOS如何实现触摸板手势,因此用户可以期待出色的令人印象深刻的触摸板体验. On默认情况下Ubunt ...
- Android单点触控技术,对图片进行平移,缩放,旋转操作
转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/42833893),请尊重他人的辛勤劳动成果,谢谢! 相信大家 ...
最新文章
- 史诗级画面刷爆全球,尼奥重返矩阵,为崔妮蒂而战!《黑客帝国4》重磅来袭!...
- android 强制打开gps定位_Android 6.0 默认关闭定位和GPS,开启后默认选省电
- Java 内存泄露总结
- 这可能是全中国最靠谱的星座指南
- 内存类型范围寄存器 (MTRR)
- 网站后台发通知页面效果图
- 万人报名2020腾讯广告算法大赛,顶级技术争锋正式开战!
- 也谈谈Javascript中的几个怪异特性(上)
- arma找不到合适的模型_愉悦宝贝丨投资水育早教找不到合适品牌?那是因为你没遇到愉悦宝贝!...
- 2022-2027年(新版)中国工程造价咨询行业现状动态与未来前景预测报告
- python:实现峰值信噪比算法(附完整源码)
- 计算机文化基础(高职高专版 第十一版)第七章 答案
- html计时器插件,jQuery计时器插件TimeCircles
- java的duplicate用法_Java ByteBuffer duplicate()用法及代码示例
- python_opencv 黑白图片之白色部分单独分离
- 不同几种剔除(Culling)在渲染流程中的使用总结
- ios 字体 机打动效_24种打动朋友的方法
- TFN F4 高性能OTDR光时域反射仪 都具有哪些优势?
- 大数据开发平台-数据同步服务
- char、short、int、long各占多少字节
热门文章
- POI 获取Word大纲级别,操作Word(2018-06-03更新)
- 香水消泡剂还能这样的消除泡沫,厂家不服不行
- html 动画接口,Web动画API教程1:创建基本动画
- 使用XRECODE II转换几乎任何音频格式
- 如何打造一款适合中老年人群体的产品?
- 5年后 又听王菲98-99香港唱游大世界演唱会
- 如何查看手机型号,最好的查询方法
- html button半透明效果,【笔记JS/HTML/CSS】用div实现个性化button,背景半透明
- 系统架构设计——网购秒杀系统架构设计
- 用C语言编程画出图形,C语言图形编程(六) -图形程序设计实例:零件图形的绘制...