Unity打开摄像头占满全屏

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)。。场景里面的配置如下~

7305b707jw1f7s2ir4kymj205k09474c.jpg

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

7305b707jw1f7s2m5bw6hj20aq0mewg7.jpg

7305b707jw1f7s2map2mnj20aw0hp75a.jpg

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

首先,第一步。打开相机~
在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调用摄像头,大家可以参考参考~

版权声明:本文为a1148342765原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a1148342765/article/details/102357236

智能推荐

Intellij IDEA 搭建Spring Boot项目(一)

Intellij IDEA 搭建Spring Boot项目 标签(空格分隔): SpringBoot JAVA后台 第一步 选择File –> New –> Project –>Spring Initialer –> 点击Next  第二步 自己修改 Group 和 Artif...

CentOS学习之路1-wget下载安装配置

参考1: https://blog.csdn.net/zhaoyanjun6/article/details/79108129 参考2: http://www.souvc.com/?p=1569 CentOS学习之路1-wget下载安装配置 1.wget的安装与基本使用 安装wget yum 安装软件 默认安装保存在/var/cache/yum ,用于所有用户使用。 帮助命令 基本用法 例子:下载...

深入浅出Spring的IOC容器,对Spring的IOC容器源码进行深入理解

文章目录 DispatcherServlet整体继承图 入口:DispatcherServlet.init() HttpServletBean.init() FrameworkServlet.initServletBean() 首先大家,去看Spring的源码入口,第一个就是DispatcherServlet DispatcherServlet整体继承图 入口:DispatcherServlet....

laravel框架的课堂知识点概总

1. MVC 1.1 概念理解 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑 MVC 是一种使用 MVC(Model View Controller ...

Unity人物角色动画系统学习总结

使用动画系统控制人物行走、转向、翻墙、滑行、拾取木头 混合树用来混合多个动画 MatchTarget用来匹配翻墙贴合墙上的某一点,人物以此为支点翻墙跳跃 IK动画类似于MatchTarget,控制两只手上的两个点来指定手的旋转和位置,使得拾取木头时更逼真 创建AnimatorController: 首先创建一个混合树,然后双击 可以看到该混合树有五种状态机,分别是Idle、WalkForward、...

猜你喜欢

Composer 安装 ThinkPHP6 问题

Composer 安装 ThinkPHP6 问题 先说说问题 一.运行环境要求 二.配置 参考: ThinkPHP6.0完全开发手册 先说说问题 执行ThinkPHP6的安装命令 遇到问题汇总如下: 看提示是要更新版本,执行命令更新。 更新之后,再次安装ThinkPHP,之后遇到如下问题。 尝试了很多方法,依然不能解决。其中包括使用https://packagist.phpcomposer.com...

Spring Boot 整合JDBC

今天主要讲解一下SpringBoot如何整合JDBC,没啥理论好说的,直接上代码,看项目整体结构 看一下对应的pom.xml 定义User.java 定义数据源配置,这里使用druid,所以需要写一个配置类 上面指定druid的属性配置,和用户登录的账号信息以及对应的过滤规则: 下面定义数据访问接口和对应的实现: 数据访问层很简单,直接注入JdbcTemplate模板即可,下面再看对应的servi...

html鼠标悬停显示样式

1.显示小手:     在style中添加cursor:pointer 实现鼠标悬停变成小手样式     实例:         其他参数: cursor语法: cursor : auto | crosshair | default | hand | move | help | wait | tex...

Yupoo(又拍网)的系统架构

Yupoo!(又拍网) 是目前国内最大的图片服务提供商,整个网站构建于大量的开源软件之上。以下为其使用到的开源软件信息: 操作系统:CentOS、MacOSX、Ubuntu 服务器:Apache、Nginx、Squid 数据库:MySQLmochiweb、MySQLdb 服务器监控:Cacti、Nagios、 开发语言:PHP、Python、Erlang、Java、Lua 分布式计算:Hadoop...

创建一个Servlet项目流程(入门)

版本 IDEA 2020.2 JDK1.8 apache-tomcat-9.0.36 项目流程 一、IDEA中新建JaveEE项目 项目起名,选择项目存放地址,点击finish创建成功 进入项目后,右键选择项目,选择add Framework Support 选择Web Application,点击OK 此时项目文件夹 在WEB-INF下创建两个目录classes和lib 按ctrl+alt+sh...