Unity 摄像机搭配陀螺仪的使用
2019独角兽企业重金招聘Python工程师标准>>>
项目起因:
前段时间自己在做的一个项目中需要实现一个类似AR的相机实现。举例来说就是App中打开照相机,然后屏幕中显示相机背景然后再显示一个模型,但是模型的世界坐标是不会变化的,不会随着手机的转动而跟着转动、
1.相机实现原理:
- 获取手机的姿态(陀螺仪)
- 实例化3D模型且固定
- 根据陀螺仪修改场景内相机的位置,姿态
2.ARCamera的结构:
;
3.代码实现:
ARCamera上的Cs脚本:
using UnityEngine;
using System.Collections;
public class CameraTrack : MonoBehaviour {//PC上模拟陀螺仪的输入值public Vector3 debugGro = new Vector3(0f,0f,0f);public bool isDebug = false;//用来定位的模型public GameObject model;// Use this for initializationvoid Start () {//陀螺仪的设置Input.gyro.enabled = true;Input.compensateSensors = true;Input.gyro.updateInterval = 0.01f;}// Update is called once per framevoid Update () {//根据陀螺仪返回的数据设置Camera的姿态。gameObject.transform.localRotation = (isDebug ? Quaternion.Euler (debugGro) : Input.gyro.attitude)* new Quaternion(0,0,1,0);//如果第一次启动就对定位的模型进行赋值,设置其在屏幕的中央。(此处为我的项目需要用到的,可以忽略。)if(model.GetComponent<ModelPos>().enabled == false){StartCoroutine (ScriptTrue ());}}IEnumerator ScriptTrue(){yield return new WaitForSeconds (0.3f);model.GetComponent<ModelPos> ().enabled = true;}
}
Quad上的Cs脚本。
using UnityEngine;
using System.Collections;
public class CameraSetting : MonoBehaviour {public int Camertype;public int CamerFPS;public int CamerWidth;public int CamerHeight;private WebCamTexture t;private WebCamDevice[] mWebCamDevices;private bool isDebug;private bool isNeedSetCamera = true;// Use this for initializationvoid Start () {isDebug = gameObject.GetComponentInParent<CameraTrack>().isDebug;StartCoroutine (initWebCamera());}IEnumerator initWebCamera(){//权限判断,之前这里的写法没注意导致第一次进入会黑屏(iOS)yield return Application.RequestUserAuthorization (UserAuthorization.WebCam);if (Application.HasUserAuthorization(UserAuthorization.WebCam)){//拿手机上的相机mWebCamDevices = WebCamTexture.devices;//CameraType 0后置。根据不同进行判断string name = mWebCamDevices [Camertype].name;t = new WebCamTexture (name);//这里设置的分辨率都不是最终的,最终获取到的分辨率是根据相机自己的参数来的,它会给你匹配一个最接近你设置的。t.requestedFPS = CamerFPS;t.requestedHeight = CamerHeight;t.requestedWidth = CamerWidth;//设置Quad的贴图为相机拍摄到的。GetComponent<Renderer> ().material.mainTexture = t;t.Play ();//下面一句必须放在Play后面,否则t.width等获得不到数据。//旋转画布到正的位置,这里要特别注意,有些时候会出现画面横过来或者倒了。gameObject.transform.localRotation = gameObject.transform.localRotation * Quaternion.AngleAxis(t.videoRotationAngle,Vector3.forward);}}// Update is called once per framevoid Update () {//设置Quad画布的大小,如果写在play后面会导致部分时候获取的数据为1。应该是相机还没打开真正打开就开始获取了,所以数据有误,所以放在了这里。if (isNeedSetCamera && t!=null && t.width >200 && t.height >200){//判断是否翻转。gameObject.transform.localScale = new Vector3(t.width*-1, t.height*(t.videoVerticallyMirrored?1:-1), 1f);//计算场景内相机的视域(重要)gameObject.GetComponentInParent <Camera>().fieldOfView = Mathf.Atan(t.height / 2f / gameObject.transform.localPosition.z) * Mathf.Rad2Deg * 2-1;isNeedSetCamera = (t.width <200 && t.height <200);}}public void StopWebCamera(){if (t != null) {t.Stop ();}}public void PauseWebCamera(){if (t != null && t.isPlaying) {t.Pause ();}}public void StartWebCamera(){if (t != null) {t.Play ();isNeedSetCamera = true;}}
}
4.关键语句(部分伪代码):
设置相机为陀螺仪姿态:
Input.gyro.attitude * new Quaternion(0,0,1,0);
画布旋转到摄像机的正的位置:
localRotation = localRotation * Quaternion.AngleAxis(t.videoRotationAngle,Vector3.forward);
判断是否翻转:
localScale = new Vector3(t.width*-1,t.height*(t.videoVerticallyMirrored?1:-1), 1f);
计算视域
Camera.fieldOfView = Mathf.Atan(t.height / 2f / Vector3.Distance(Camera.position,Quad.position)) * Mathf.Rad2Deg * 2;
4.总结:
代码都在上面,有了注释就不在进行分析了。相机的使用这块爬了不少的坑,主要就是在旋转上,对其旋转之类的坐标不是很了解,所以花了挺多时间。
转载于:https://my.oschina.net/yaogunfantuan/blog/809345
Unity 摄像机搭配陀螺仪的使用相关推荐
- Unity摄像机对象锁定旋转运镜模拟
问题简述 在3D模式下如何模拟实现Unity摄像机对象锁定旋转运镜,可以分为两个部分,第一是实现对象锁定,第二是实现旋转运镜.对象锁定就是无论摄像机如何运动,始终保持对象位于摄像机成像区域的固定位置, ...
- Unity摄像机拍照并显示在小窗口里(RenderTexture和RawImage将摄像机图像渲染到GUI屏幕上小图显示)
Unity摄像机拍照并显示在小窗口里(RenderTexture和RawImage将摄像机图像渲染到GUI屏幕上小图显示) 1.实现效果和实现思想 1.实现效果和实现思想 实现效果: 本文使用飞机模型 ...
- Unity摄像机画面制作全景图片|截图制作全景图
Unity摄像机画面制作全景图片 目录 效果展示 Unity编辑器中使用脚本部分 Unity编辑器中使用方法 Unity动态存储图片脚本部分 Unity动态存储图片使用方法 目录 你好! 这是你第一次 ...
- unity 摄像机追随指定物体
unity 摄像机追随指定物体, 摄像机离远离近,围绕物体旋转using System.Collections; using System.Collections.Generic; using Uni ...
- Unity摄像机控制
Unity摄像机控制: 控制摄像机移动,旋转,缩放,跳跃:有视野限制,且摄像机高度越高运动幅度越大. 视野缩放:通过向前滚动鼠标滑轮可拉近视野,向后滚动鼠标滑轮可拉远视野. 视野移动:按住鼠标左键不放 ...
- Unity摄像机跟随转动分析
前言 最近在做一个赛车的项目,赛车操控和镜头控制都需要和策划配合实现.分析了几个插件的摄像机,留个记录,以后跑路了也能有点参考的东西. 自己的想法 具体思路: 镜头转动使用transform.Rota ...
- Unity 摄像机简介
摄像机,Unity的核心组件之一.显示场景中,摄像机所照射的部分,是向玩家捕获和显示世界的设备. 摄像机的特性: 1.可以自定义和操纵摄像机: 2.可以在场景中不受限制其数量: 3.可以设定成任意的渲 ...
- Unity摄像机控制插件移动旋转缩放聚焦自动居中
目录 前言 一.主要特点 二.使用步骤 1.导入插件 2.拖入SR_Camera Prefab到Hierarchy场景中 3.设置场景中需要交互的物体和默认射线检测的地面层 4.限制摄像机的可移动范围 ...
- unity摄像机环绕物体旋转
实现原理: 把摄像机作为一个空物体的子对象,空物体自旋,摄像机也会旋转,并且视角一直注释着物体 具体实现: 要环视的物体 新建一个空对象 在空对象下新建一个相机 旋转空对象即可
最新文章
- 瞬间几千次的重复提交,我用 SpringBoot+Redis 扛住了!
- 日常英语---五、英语句子翻译和读的选择什么工具好
- 一行代码搞定Python逐行内存消耗分析
- 让 Hangfire 使用 MongoDB 存储
- Leetcode--19. 删除链表的倒数第N个节点
- MATLAB基础教程(5)——斐波那契数列
- 面向人工智能“新基建”的知识图谱行业白皮书
- 计蒜客——数位反转问题(代码+解析)
- JAVA基础知识|进程与线程
- [转]SQL Server 阻止了对组件 /'Ad Hoc Distributed Queries/' 的访问
- 全国大学生数学建模竞赛2018A题高温作业专用服装设计MATLAB程序
- eos 钱包 nacos 安装文档
- 给扔物线 HenCoder Plus 学员的一次分享文字版
- android 连接蓝牙耳机 播放音乐,Android连接蓝牙耳机播放音乐
- Webpack4 配置 Output
- 行列式(Determinants)
- Dell R410 broadcom网卡驱动更新失败
- patch 修补文件命令
- 随机点名器(java基础)
- word 合并 两个文件 合并成一个
热门文章
- 谈一谈安防行业人工智能发展情况
- 机器学习已能翻译失传已久的语言
- ​一文看懂数据清洗:缺失值、异常值和重复值的处理
- 科大讯飞年报出炉,2018每天赚148万元,53%是政府补助
- “三巨头”齐获图灵奖!沉浮30载终于开启AI复兴时代
- CTO多要会刷脸--
- 【机器学习】机器学习Top10算法,教你选择最合适的那一个!一文读懂ML中的解析解与数值解...
- SAP MM MM17里不能修改物料主数据'Purchasing Value Key'字段值?
- 《数学之美》第11章 如何确定网页和查询的相关性
- 眼耳鼻舌身意,严肃地聊一聊元宇宙的“技术拼图”