Unity打开摄像头占满全屏

AR项目需求,Unity打开摄像头作为背景渲染占满全屏~ Unity对设备硬件操作的API并不是太友好~打开一个摄像头,渲染到屏幕上也都得自己写,虽然步骤少,提取摄像头texture,渲染到UGUI上(本文采取的是UGUI的方案),这时候涉及到一个屏幕适配的问题,以及Unity层级问题。。。

下面先贴上代码和场景配置~ 再说一些坑。。

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class STCamDeviceController : MonoBehaviour
{

    WebCamTexture camTexture;
    CanvasScaler CanScaler;
    Camera ca;
    Image img;

    void Start () {

        img = GetComponentInChildren<Image>();

        CanScaler = GetComponentInChildren<CanvasScaler> ();
        CanScaler.referenceResolution = new Vector2 (Screen.width, Screen.height);

        ca = GetComponentInChildren<Camera> ();
        ca.orthographicSize = Screen.width / 100.0f/ 2.0f;

        img.transform.localScale = new Vector3 (-1, -1, -1);

        img.rectTransform.anchorMin = new Vector2 (0.5f, 0.5f);
        img.rectTransform.anchorMax = new Vector2 (0.5f, 0.5f);
        img.rectTransform.pivot = new Vector2(0.5f,0.5f);

        img.rectTransform.SetSizeWithCurrentAnchors (RectTransform.Axis.Horizontal, Screen.height);
        img.rectTransform.SetSizeWithCurrentAnchors (RectTransform.Axis.Vertical, Screen.width);

        // 设备不同的坐标转换
        #if UNITY_IOS || UNITY_IPHONE
        img.transform.Rotate (new Vector3 (0, 180, 90));
        #elif UNITY_ANDROID
        img.transform.Rotate (new Vector3 (0, 0, 90));
        #endif

        StartCoroutine(CallCamera());
    }

    IEnumerator CallCamera()
    {
        yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);
        if (Application.HasUserAuthorization(UserAuthorization.WebCam))
        {
            if (camTexture != null)
                camTexture.Stop();

            WebCamDevice[] cameraDevices = WebCamTexture.devices;
            string deviceName = cameraDevices[0].name;

            camTexture = new WebCamTexture(deviceName,Screen.height,Screen.width,60);
            img.canvasRenderer.SetTexture(camTexture);

            camTexture.Play();
        }
    }
}

此脚本挂在作为打开相机渲染背景的Canvas上~ (UI是另外一个相对独立的Canvas)。。场景里面的配置如下~

再看CameraGBCanvas 和 CameraBG 的配置~ 因为背景image的大小约束都是通过代码动态设置的~

配置如上~ 说说实现思路和一些坑~

首先,第一步。打开相机~
在Start方法里通过 IEnumerator 开启了相机。判断用户是否给了摄像头哦权限,接下来获取设备列表,取第0个就是后置摄像头,取出texture并且渲染到 image上,,这里可以看到取出的texture的 宽等于其高,,高等于其宽,,那是因为取出的textur绕z轴旋转了90度。这里先做了宽高对调~

第二步,渲染成功后背景Image屏幕适配问题。。

a. 首先调整屏幕适配宽高参考值,就为当前屏幕宽高
代码:

        CanScaler = GetComponentInChildren<CanvasScaler> ();
    CanScaler.referenceResolution = new Vector2 (Screen.width, Screen.height);

    

b.摄像头渲染背景的相机已经调整为正交模式了,其中有一个正交大小的值 orthographicSize 。。根据官方文档的说法是当处于垂直转台的时候等于高的一半,也就是代码如下~

        ca = GetComponentInChildren<Camera> ();
    ca.orthographicSize = Screen.width / 100.0f/ 2.0f;

    

c. 接着做image旋转处理

    img.transform.localScale = new Vector3 (-1, -1, -1);

    img.rectTransform.anchorMin = new Vector2 (0.5f, 0.5f);
    img.rectTransform.anchorMax = new Vector2 (0.5f, 0.5f);
    img.rectTransform.pivot = new Vector2(0.5f,0.5f);

    img.rectTransform.SetSizeWithCurrentAnchors (RectTransform.Axis.Horizontal, Screen.height);
    img.rectTransform.SetSizeWithCurrentAnchors (RectTransform.Axis.Vertical, Screen.width);
    

d.最后根据设备不同,判断image的rotae,这一点感觉Unity一点儿都不友好,为什么不能自己判断设备自动适配坐标系统叻? Unity API 给我的感觉是发展空间还挺大的,好多地方都需要改进~

    // 设备不同的坐标转换
    #if UNITY_IOS || UNITY_IPHONE
    img.transform.Rotate (new Vector3 (0, 180, 90));
    #elif UNITY_ANDROID
    img.transform.Rotate (new Vector3 (0, 0, 90));
    #endif
    

好了~上文就是Unity打开摄像头,并且渲染为背景的方法,网上也有一部分博文讲解的是Unity调用摄像头,大家可以参考参考~

Unity打开摄像头占满全屏的更多相关文章

  1. 【Android 应用开发】Android中使用ViewPager制作广告栏效果 - 解决ViewPager占满全屏页面适配问题

    . 参考界面 : 携程app首页的广告栏, 使用ViewPager实现        自制页面效果图 : 源码下载地址: http://download.csdn.net/detail/han1202 ...

  2. Android中使用ViewPager制作广告栏效果 - 解决ViewPager占满全屏页面适配问题

    . 参考界面 : 携程app首页的广告栏, 使用ViewPager实现        自制页面效果图 : 源码下载地址: http://download.csdn.net/detail/han1202 ...

  3. 换了XCode版本之后,iOS应用启动时不占满全屏,上下有黑边

    原因是没有Retina4对应的启动图片,解决方法很简单,就是把Retina4对应的图片给补上就只可以了

  4. 关于 web 页面 占满全屏

    页面一般可以分成三部分,头部,底部,中间内容部分. 一般不用考虑中间高度部分,因为可以靠内容撑开,然后让底部到达底部.但是当中间内容太少时,底部就会顶不到底部. 方法1.中间部分给一个最小高度(min ...

  5. 转载 html div三列布局占满全屏(左右两列定宽或者百分比、中间自动适应,div在父div中居底)

    原文地址:http://blog.csdn.net/duyelang/article/details/20558899 <p><!DOCTYPE html> <html ...

  6. html盒子铺满全屏

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. OpenCV设置摄像头分辨率及全屏显示

    OpenCV3.0下 设置摄像头分辨率为1920*1440,并全屏显示图像窗口. int _tmain(int argc, _TCHAR* argv[]) { Mat frame; VideoCapt ...

  8. css3 的 calc()函数在布局中的使用----头部高度固定,页面正好占满一屏

    最近项目遇到一个布局需求,头部高度固定,页面需要刚好占满一屏幕. 如下示意图: 方法:使用calc .wrap{ position: relative; margin-left: 24px; marg ...

  9. Javascript实现打开或退出浏览器全屏

    废话不多说,直接上代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www. ...

随机推荐

  1. 用cmd命令合并N个文件

    今天早上朋友发我一篇小说(42个TXT文件),让我给他合并为一个文件.我首先想到的是“Copy”命令,它可以复制文件,也可以合并文件. 例如:合并1.txt和2.txt到12.txt(其为ASCII文 ...

  2. Pagekit安装

    Pagekit 是一个模块化,轻量的 CMS 系统,基于现代化的技术,如 Symfony 组件和 Doctrine.它提供了一个很好的平台,用于主题和延伸开发.Pagekit 为您提供了工具来创造美丽 ...

  3. ubuntu安装Eclipse无图标(手动创建软件图标) —— 其他的软件也一样

    //退回根目录 cd / //进入图标存放目录 cd usr/share/applications/ //用文本编辑器打开打开eclipse的图标文件,没有会自动创建 sudo gedit eclip ...

  4. 设计模式C++学习笔记之十三(Decorator装饰模式)

      装饰模式,动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 13.1.解释 main(),老爸 ISchoolReport,成绩单接口 CFourt ...

  5. Python 线程同步锁, 信号量

    同步锁 import time, threading def addNum(): global num num -= 1 num = 100 thread_list = [] for i in ran ...

  6. 【工具】我的Eclipse使用习惯

    查看代码结构 查看类的层级结构,可用选中类名,按F4,可查看: 类的层级结构: 类的上级结构: 类的下级结构: 安装反编译工具Eclipse Class Decompiler 在Eclipse Mar ...

  7. mysql索引覆盖之innodb和myisam效率问题

    问题: create table A (    id varchar(64) primary key,    ver int,    ... ) 我的表有几个很长的字段varchar(3000) 在i ...

  8. Setup Factory打包winform程序

    摘要 Setup Factory是一款软件安装工具.Setup Factory支持创建一个安装文件或一个单间的setup.exe文件,生成文件可以运行于任意版本的windows中. 步骤 1.安装Se ...

  9. Python3.4下使用sqlalchemy

    一. 1.用sudo apt-get install python3-numpy之后,会默认把numpy安装到  /usr/lib/python3/dist-packages目录下,而且版本比较低. ...

  10. 16-spring学习-配置文件操作

    实际使用:配置文件 spring的核心就是一个配置文件.所以只有将表达式应用到配置文件上才会特别有意义. 范例:利用配置文件,编写表达式应用 <bean id="str" c ...