基于Unity3D的相机功能的实现(二)——AR相机
AR相机的实现,功能包括:
1.双指进行放大缩小操作;
2.单指水平滑动时,水平旋转;
3.单指垂直滑动时,垂直旋转。
代码如下:
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
public class ARCamera : MonoBehaviour
{//目标public GameObject target;//当前camera距离public float distance = 3.5f;//camera 最远距离public float maxDistance=5f;//camera 最近距离public float minDistance=2f;//camera 移动速度public float moveSpeed = 0.3f;//水平移动速度public float xSpeed = 250.0f;//垂直移动速度public float ySpeed = 120.0f;//垂直旋转最小角度public float yMinLimit = -20;//垂直旋转最大角度public float yMaxLimit = 80;private float x = 0.0f;private float y = 0.0f;//前一帧手指位置private Vector2 oldPosition1;private Vector2 oldPosition2;private Vector3 tempPositon;//PC端测试模式public bool bDebug=false;void Start(){Vector2 angles = transform.eulerAngles;x = angles.y;y = angles.x;//确保刚体不会改变旋转if (GetComponent<Rigidbody>())GetComponent<Rigidbody>().freezeRotation = true;}void Update(){//PC端测试if (bDebug) {if (Input.GetAxis ("Mouse ScrollWheel") > 0.01f) {if (distance > minDistance) {distance -= moveSpeed;} } else if(Input.GetAxis ("Mouse ScrollWheel") < -0.01f){if (distance < maxDistance) {distance += moveSpeed;}}if (Input.GetMouseButton (0)) {x += Input.GetAxis ("Mouse X") * xSpeed * 0.02f;y -= Input.GetAxis ("Mouse Y") * ySpeed * 0.02f;y = ClampAngle (y, yMinLimit, yMaxLimit);}} else {if (Input.touchCount == 1) {if (Input.GetTouch (0).phase == TouchPhase.Moved) {x += Input.GetAxis ("Mouse X") * xSpeed * 0.02f;y -= Input.GetAxis ("Mouse Y") * ySpeed * 0.02f;y = ClampAngle (y, yMinLimit, yMaxLimit);}}if (Input.touchCount > 1) {if (Input.GetTouch (0).phase == TouchPhase.Moved || Input.GetTouch (1).phase == TouchPhase.Moved) {Vector3 tempPosition1 = Input.GetTouch (0).position;Vector3 tempPosition2 = Input.GetTouch (1).position;if (IsEnlarge (oldPosition1, oldPosition2, tempPosition1, tempPosition2)) {if (distance > minDistance) {distance -= moveSpeed;} } else {if (distance < maxDistance) {distance += moveSpeed;}}oldPosition1 = tempPosition1;oldPosition2 = tempPosition2;}}}}void LateUpdate(){if (target){ClampAngle(y, yMinLimit, yMaxLimit);Quaternion rotation = Quaternion.Euler(y, x, 0);tempPositon.Set(0.0f, 0.0f, (-1) * distance);Vector3 position = rotation * tempPositon + target.transform.position - Vector3.down * 0.5f;transform.rotation = rotation;transform.position = position;}}//检测是否放大还是缩小private bool IsEnlarge(Vector2 oldPos1, Vector2 oldPos2, Vector2 newPos1, Vector2 newPos2){float leng1 = Vector2.Distance (oldPos1, oldPos2); float leng2 = Vector2.Distance (newPos1, newPos2);if (leng1 < leng2){return true;}else{return false;}}private float ClampAngle(float angle, float min, float max){if (angle < -360)angle += 360;if (angle > 360)angle -= 360;return Mathf.Clamp(angle, min, max);}
}
挂载在相机上即可。
基于Unity3D的相机功能的实现(二)——AR相机相关推荐
- 从零开始安卓端相机功能开发(二)让我们来开发一个相机
目前已有章节大家可以去学习也可以参考一下 1.从零开始安卓端相机功能开发(一)了解用什么去开发以及流程 2.从零开始安卓端相机功能开发(二)让我们来开发一个相机 3.从零开始开发Android相机ap ...
- 基于Unity3D的绘画功能实现
using UnityEngine; using System.Collections; /// <summary> /// 鼠标画图功能 /// </summary> pub ...
- 从零开始安卓端相机功能开发(一)了解用什么去开发以及流程
目前已有章节大家可以去学习也可以参考一下 1.从零开始安卓端相机功能开发(一)了解用什么去开发以及流程 2.从零开始安卓端相机功能开发(二)让我们来开发一个相机 3.从零开始开发Android相机ap ...
- 【Android笔记67】Android之使用系统中的相机功能(拍照、保存照片、显示拍摄的照片、照片保存到图库等操作)
这篇文章,主要介绍Android如何使用系统中的相机功能(拍照.保存照片.显示拍摄的照片.照片保存到图库等操作). 目录 一.使用Android相机功能 1.1.如何调用相机功能 1.2.调用相机功能
- 基于Unity3D的相机功能的实现(一)——VR相机
Unity自带陀螺仪功能,今天就利用陀螺仪实现一个VR相机功能.步骤如下: 打开Unity,创建一个新的C#脚本GyroController.cs,并挂在MainCamera游戏对象上,代码如下: u ...
- Android 基于Zxing的扫码功能实现(二)
本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 引言 本篇博文是基于 Android 二维码的扫码功能实现(一) 文章写的,建议阅读这篇文章之前,先看看上篇文章.还有建议阅读本文的 ...
- unity 陶瓷质感_一种基于Unity3D的虚拟陶瓷设计方法与流程
本发明涉及虚拟现实领域,特别涉及一种基于Unity3D的虚拟陶瓷设计方法. 背景技术: 陶艺工艺制作环境要求严格:不仅在拉坯成型需要利用旋转机器,在烧制过程则需要窑炉锻造,如何将陶瓷制作工艺与虚拟现实 ...
- 机器视觉工业缺陷检测的那些事(二、相机)
目录 机器视觉工业缺陷检测的那些事(二) 2.相机的选择 (1)工业数字相机的分类: (2)相机的主要参数 ①分辨率 ②速度(帧频/行频) ⑥像元深度 (3)工业数字摄像机主要接口类型 CCD和COM ...
- 【聆思CSK6 视觉AI开发套件试用】基于CSK6的头肩手势检测控制会议相机进行数字变焦
本篇文章来自极术社区与聆思科技组织的CSK6 视觉AI开发套件活动,更多开发板试用活动请关注极术社区网站.作者:海锋 基于CSK6的头肩手势检测控制会议相机实现变倍功能 首先感谢极术社区与聆思科技的信 ...
最新文章
- C++中的 typedef Vec<uchar> Vec3b; 是何意?
- C语言基础:数组作为函数参数传递演示源码
- C和C++中的默认类型
- Linux网络协议栈(三)——网络设备(1)
- SpringBoot 简单实现仿CAS单点登录系统
- c语言中被调用函数只需在主调函数中声明,其他函数中不用声明,求助,函数在其他函数中使用时要先声明后调用,这个没声明就用了...
- android基础面试题(一)
- 国产服务器虚拟化产品,国内主流虚拟化厂商之间比较.doc
- 微信小程序大赛介绍文档
- 信息安全风险评估 要素关系
- 今天QQ被盗,异常情况调查与反思
- Invalid configuration of tez jars, tez.lib.uris is not defined in the configuration
- 计算机无法启动安装程序,安装Win10系统提示安装程序无法正常启动怎么办
- 滑动验证码自动化实现(1)
- 国产大数据系统通过验收,”核高基”基础软件再下一城
- 为大家介绍一下自制DIY面膜的好地方
- grunt教程--初涉grunt
- 介绍一种新的群智能算法---黏菌算法
- 深度强化学习 - 无人驾驶自行车
- 判断素数的三种方法详解
热门文章
- OkHttp3网络编程代码总结
- 9.24吉比特测试工程师
- 多媒体课程设计android,基于android的多媒体播放器课程设计报告-20210410041625.docx-原创力文档...
- win7ue4崩溃问题汇总
- 数学,金融,计算机优秀博客
- Openvino IGPU(GPU) 读取模型(加载时间过长)中的读取缓存加速方式
- python程序暂停和继续_如何“暂停”和“继续”下载工作?
- UE4 MotionBuilder快速动画重定向
- 计算机组成原理——输入输出(I/O)系统考研题
- NISP一级模拟题(五、六)