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 摄像机搭配陀螺仪的使用相关推荐

  1. Unity摄像机对象锁定旋转运镜模拟

    问题简述 在3D模式下如何模拟实现Unity摄像机对象锁定旋转运镜,可以分为两个部分,第一是实现对象锁定,第二是实现旋转运镜.对象锁定就是无论摄像机如何运动,始终保持对象位于摄像机成像区域的固定位置, ...

  2. Unity摄像机拍照并显示在小窗口里(RenderTexture和RawImage将摄像机图像渲染到GUI屏幕上小图显示)

    Unity摄像机拍照并显示在小窗口里(RenderTexture和RawImage将摄像机图像渲染到GUI屏幕上小图显示) 1.实现效果和实现思想 1.实现效果和实现思想 实现效果: 本文使用飞机模型 ...

  3. Unity摄像机画面制作全景图片|截图制作全景图

    Unity摄像机画面制作全景图片 目录 效果展示 Unity编辑器中使用脚本部分 Unity编辑器中使用方法 Unity动态存储图片脚本部分 Unity动态存储图片使用方法 目录 你好! 这是你第一次 ...

  4. unity 摄像机追随指定物体

    unity 摄像机追随指定物体, 摄像机离远离近,围绕物体旋转using System.Collections; using System.Collections.Generic; using Uni ...

  5. Unity摄像机控制

    Unity摄像机控制: 控制摄像机移动,旋转,缩放,跳跃:有视野限制,且摄像机高度越高运动幅度越大. 视野缩放:通过向前滚动鼠标滑轮可拉近视野,向后滚动鼠标滑轮可拉远视野. 视野移动:按住鼠标左键不放 ...

  6. Unity摄像机跟随转动分析

    前言 最近在做一个赛车的项目,赛车操控和镜头控制都需要和策划配合实现.分析了几个插件的摄像机,留个记录,以后跑路了也能有点参考的东西. 自己的想法 具体思路: 镜头转动使用transform.Rota ...

  7. Unity 摄像机简介

    摄像机,Unity的核心组件之一.显示场景中,摄像机所照射的部分,是向玩家捕获和显示世界的设备. 摄像机的特性: 1.可以自定义和操纵摄像机: 2.可以在场景中不受限制其数量: 3.可以设定成任意的渲 ...

  8. Unity摄像机控制插件移动旋转缩放聚焦自动居中

    目录 前言 一.主要特点 二.使用步骤 1.导入插件 2.拖入SR_Camera Prefab到Hierarchy场景中 3.设置场景中需要交互的物体和默认射线检测的地面层 4.限制摄像机的可移动范围 ...

  9. unity摄像机环绕物体旋转

    实现原理: 把摄像机作为一个空物体的子对象,空物体自旋,摄像机也会旋转,并且视角一直注释着物体 具体实现: 要环视的物体 新建一个空对象 在空对象下新建一个相机 旋转空对象即可

最新文章

  1. 瞬间几千次的重复提交,我用 SpringBoot+Redis 扛住了!
  2. 日常英语---五、英语句子翻译和读的选择什么工具好
  3. 一行代码搞定Python逐行内存消耗分析
  4. 让 Hangfire 使用 MongoDB 存储
  5. Leetcode--19. 删除链表的倒数第N个节点
  6. MATLAB基础教程(5)——斐波那契数列
  7. 面向人工智能“新基建”的知识图谱行业白皮书
  8. 计蒜客——数位反转问题(代码+解析)
  9. JAVA基础知识|进程与线程
  10. [转]SQL Server 阻止了对组件 /'Ad Hoc Distributed Queries/' 的访问
  11. 全国大学生数学建模竞赛2018A题高温作业专用服装设计MATLAB程序
  12. eos 钱包 nacos 安装文档
  13. 给扔物线 HenCoder Plus 学员的一次分享文字版
  14. android 连接蓝牙耳机 播放音乐,Android连接蓝牙耳机播放音乐
  15. Webpack4 配置 Output
  16. 行列式(Determinants)
  17. Dell R410 broadcom网卡驱动更新失败
  18. patch 修补文件命令
  19. 随机点名器(java基础)
  20. word 合并 两个文件 合并成一个

热门文章

  1. 谈一谈安防行业人工智能发展情况
  2. 机器学习已能翻译失传已久的语言
  3. ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  4. 科大讯飞年报出炉,2018每天赚148万元,53%是政府补助
  5. “三巨头”齐获图灵奖!沉浮30载终于开启AI复兴时代
  6. CTO多要会刷脸--
  7. 【机器学习】机器学习Top10算法,教你选择最合适的那一个!一文读懂ML中的解析解与数值解...
  8. SAP MM MM17里不能修改物料主数据'Purchasing Value Key'字段值?
  9. 《数学之美》第11章 如何确定网页和查询的相关性
  10. 眼耳鼻舌身意,严肃地聊一聊元宇宙的“技术拼图”