unity-Camera参数介绍、种类、操作以及获取相机截图画面

2023-10-29

总结一下学到的Camera 相关知识。

unity中的Camera

相机是我们观察游戏世界的窗口,在unity中至少需要一个相机,可以使用多个相机来对世界不同视角的观察,加上脚本之后,可以对相机进行一些操作,比如旋转,平移等等。

unity中相机参数介绍

1.因为每个相机在渲染时会存储颜色和深度信息,所以多个相机时,可以设置不同选项来清除缓冲区的信息。

Clear Flags skybox soild color depth only don’t clear
清除标记 天空盒 纯色 仅深度 不清除

2.Background :背景色,当clear flags选择soild color时,世界中没有色彩的地方会显示背景色。
3.Culling Mask:剔除遮罩,根据对象所指定的层来控制渲染的对象。这个简单主要是选择摄像机渲染哪些Layer层。
4.Projection:投影方式,分为透视和正交。
5.Clipping Planes:剪裁平面,摄像机的渲染范围。Near为最近的点,Far为最远的点。
6.Normalized View Port Rect:标准视图矩形,用四个数值来控制摄像机的视图在屏幕中的位置及大小,该项使用屏幕坐标系,数值在0~1之间。
7.Depth:深度 ,用于控制摄像机的渲染顺序,值大的摄像机将被渲染在较小值的摄像机之上。有人用值大的摄像机来做UI,感觉脑洞挺大的。
8.Rendering Path:渲染路径,设定摄像机的渲染方法。
9.Target Texture:目标纹理。相机渲染不再显示在屏幕上,而是映射到纹理上。这个就是我们后面需要使用相机来截取画面使用的工具。
10.HDR:高动态光照渲染,用于启用摄像机的高动态范围渲染功能,因为人眼对的范围的光照强度更为敏感,所有用高动态范围渲染能让场景变得更为真实,光照的变化不会显得太突兀。


Camera种类

  unity官方资源包中,包括几种常见的摄像机,分别是:CctvCameraFreeLookCameraHandHeldCameraMultipurposeCameraRig,还有我常用的几种,ARCamera,VRCamera,包括手势识别的Camera
  主要介绍前几种camera

Camera 属性
CctvCamera 摄像机固定在远处,通过转动角度,跟踪拍摄对象,类似于足球游戏常会用到的视角。
FreeLookCamera 对象一直显示在屏幕中,可以通过鼠标上下左右移动观看周围
HandHeldCamera 可以自动变焦,可以保持对象显示大小始终一致的CctvCamera
MultipurposeCameraRig 对指定游戏物体作位置和旋转跟随的摄像机预设。

其他就不做过多介绍了。


对相机操作

  对相机的操作除了官方脚本中相机跟随,旋转等,也包含相机属性的一些操作。这是很重要的,相机毕竟是窗口,对玩家来说,越方便的相机操作会带来不一样的体验。
最简单的比如让Camera和对象的距离和角度始终保持不变,我们需要做的是:保证相机和玩家的距离与视角保持不变(需要注意的是如果玩家是刚体,一般操作物体运动的在Fixed Update()函数里,操作相机运动也应该在FixedUpdate()函数里,不然可能会发生抖动)

public GameObject target;  
public float damping = 5;  
Vector3 offset;  
void Start() {  
    offset = transform.position - target.transform.position;  
}  

void LateUpdate() {  
    if (damping > 0) {  
        Vector3 desiredPosition = target.transform.position + offset;  
        Vector3 position = Vector3.Lerp (transform.position, desiredPosition, Time.deltaTime * damping);  
        transform.position = position;  

        transform.LookAt (target.transform.position);  
    } else {  
        Vector3 desiredPosition = target.transform.position + offset;  
        transform.position = desiredPosition;  
    }  
}  

截取相机画面到本地

主要使用的是这篇博文的代码:https://blog.csdn.net/anyuanlzh/article/details/17008909

解释也很清楚,方法就是把UI和场景图像分别用不同的相机渲染。然后将其渲染到2D的材质纹理上,保存成PNG图片。

我做了一定修改让其可以保存成图像流的形式(每帧保存一张图像)

using UnityEngine;
using System.Collections;

public class CameraShoot : MonoBehaviour
{
    public Camera mainCamera;
    public Camera uiCamera;

   private bool start = false;
    int num = 1;
    /// <summary>  
    /// 对相机截图。   
    /// </summary>  
    /// <returns>The screenshot2.</returns>  
    /// <param name="camera">Camera.要被截屏的相机</param>  
    /// <param name="rect">Rect.截屏的区域</param>  
    Texture2D CaptureCamera(Camera camera, Camera camera2, Rect rect)
    {
        // 创建一个RenderTexture对象  
        RenderTexture rt = new RenderTexture((int)rect.width, (int)rect.height, -1);
        // 临时设置相关相机的targetTexture为rt, 并手动渲染相关相机  
        camera.targetTexture = rt;
        camera.Render();
        //ps: --- 如果这样加上第二个相机,可以实现只截图某几个指定的相机一起看到的图像。  
        camera2.targetTexture = rt;
        camera2.Render();
        //ps: -------------------------------------------------------------------  
        // 激活这个rt, 并从中中读取像素。  
        RenderTexture.active = rt;
        Texture2D screenShot = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24, false);
        screenShot.ReadPixels(rect, 0, 0);// 注:这个时候,它是从RenderTexture.active中读取像素  
        screenShot.Apply();

        // 重置相关参数,以使用camera继续在屏幕上显示  
        camera.targetTexture = null;
        camera2.targetTexture = null;
        RenderTexture.active = null; // JC: added to avoid errors  
        GameObject.Destroy(rt);
        // 最后将这些纹理数据,成一个png图片文件  
        byte[] bytes = screenShot.EncodeToPNG();

        string filename = Application.dataPath +"/Screenshot"+num+".png";

        System.IO.File.WriteAllBytes(filename, bytes);
        Debug.Log(string.Format("截屏了一张照片: {0}", filename));

        return screenShot;
    }

    void OnGUI()
    {
        if (GUILayout.Button("开始"))
        {
            start = true;

        }
    }
    void Update()
    {
        if (start == true)
        {
          CaptureCamera(mainCamera, uiCamera, new Rect(0, 0, Screen.width, Screen.height));
          num++;
        }

    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

unity-Camera参数介绍、种类、操作以及获取相机截图画面 的相关文章

  • Android 6.0 未经许可捕获图像

    我需要让用户使用 Android 6 0 拍照 从图库或相机应用程序 因为我不需要控制相机 所以我想使用此处描述的意图 但是 如果您不需要此类控制 则可以仅使用 ACTION IMAGE CAPTURE 意图来请求图像 当您启动意图时 系统
  • android-camera-server-died-and-camera-error-100

    我有一个问题需要跟进Android 相机服务器死机且相机错误 100 https stackoverflow com questions 8647628 android camera server died and camera error
  • 适用于图片和视频的 Android 相机

    我想在我的 Android 应用程序中启动相机活动 并且我知道该怎么做 我想问当相机活动结束时 如何检查是否是用户拍摄的照片或视频 UPDATED 我有一个对话框 它询问两件事 新照片或视频 现有照片或视频 如果没有的话 1 这意味着相机将
  • Android 致命信号 11 (SIGSEGV) at 0x00000040 (code=1) 错误

    我正在开发一个 Android 应用程序 我正在其中获取用户照片图像 5张图像 使用opencv2 4 2具有面部检测功能的相机 并使用 Web 服务保存到服务器中的数据库中 为此 我使用 Opencv2 4 2 人脸检测示例 Ksoap2
  • 以编程方式截取屏幕截图不会捕获 surfaceVIew 的内容

    我有一个应用程序 我希望能够捕获屏幕截图 布局的背景是一个 SurfaceView 显示来自后置摄像头的视频 下面的代码可以截图 但是surfaceView的内容保存为黑色 这是代码 btn setOnClickListener new O
  • 如何检测前置摄像头放置在设备上的位置?

    有什么方法可以检测 Android 设备上前置摄像头的放置位置吗 我认为在手机上它总是在它的顶部 靠近耳机 但所有平板电脑都是不同的 我检查了华硕 Transformer 前置摄像头位于侧面 如果我以横向模式握住它 则位于顶部 但三星 Ga
  • AVLayerVideoGravityResize 在新设备、iOS 10 上不匹配?

    具有全屏实时预览功能的相机 previewLayer videoGravity AVLayerVideoGravityResize 制作图像 stillImageOutput captureStillImageAsynchronously
  • Android:想要在相机预览上放置剪影叠加

    我想知道如何在相机预览上添加剪影 到目前为止 我已经完成了以下示例 它只是预览相机 http developer android com reference android view TextureView html http develo
  • 相机 API:跨设备问题

    我正在开发一个相机应用程序 基本上作为消息传递应用程序的一部分来附加图像等 该应用程序需要适用于 gt SDK 2 2 并且 I can t尽可能多地使用默认的 Android 相机 因为 该应用程序的性质决定了图像不应保存到磁盘上 一些
  • ipad 2相机支持检测

    我有一个使用以下宏的应用程序 define IS IPAD UIDevice currentDevice respondsToSelector selector userInterfaceIdiom UIDevice currentDevi
  • 如何在 AVCaptureDevice 上准确设置快速快门速度(曝光时间)?

    我正在开发适用于 IOS 13 的相机应用程序 为此 我将 AVCaptureSession 与 AVCaptureVideoPreviewLayer 结合使用 到目前为止一切正常 现在我想让用户从给定的典型快门速度值数组 以 1 3 曝光
  • 有机会通过 Android NDK 相机访问来减少快门时间吗?

    我编写了一个 Android 应用程序 可以从相机捕获实时预览 快门时间短很重要 至少应该是恒定的 目前我使用以下代码来实现低快门时间 Parameters params camera getParameters params setSce
  • Three.js 设置并读取相机外观向量

    而不是使用camera rotation或lookAt 函数旋转相机 我想将外观矢量直接传递给相机 是否可以直接设置相机外观矢量以及是否可以从相机读取外观矢量 相机没有 外观矢量 因此无法设置它 但是 您可以构造一个point通过将您的外观
  • 相机预览的有效模糊

    到目前为止我尝试过的 将每一帧转换为位图 然后用library https github com wasabeef Blurry并将其放入ImageView这是在相机预览前 显然太慢了 就像1 fps 然后我开始使用渲染脚本这会模糊每一帧
  • Ionic-Angular.js 拍照并发送到服务器:空图像

    因此 我设法使用自定义指令通过 Angular js 将图像上传到我的服务器 我还成功地实现了 Cordova 的相机功能 现在我尝试连接两者 但是当将图像发送到服务器时 它们被存储为空 我认为问题在于我使用输入字段来获取图像 并且它获取了
  • 使用 iPhone 摄像头检测心率 [重复]

    这个问题在这里已经有答案了 可能的重复 使用摄像头检测心率 https stackoverflow com questions 9274027 detecting heart rate using the camera 我正在研究 iOS
  • Flutter :已处置的 CameraController,在已处置的 CameraController 上调用了 buildPreview()

    如何正确初始化和处理相机控制器 我在用camera 0 9 4 5 与许多人一起 其他错误 https stackoverflow com questions 70592464 flutter change the path of reco
  • 如何将图片保存到文件中?

    我正在尝试使用标准意图来拍照 然后允许批准或重新拍摄 然后我想将图片保存到文件中 这是我正在使用的意图 Intent intent new Intent android provider MediaStore ACTION IMAGE CA
  • 使用 OpenCV 进行相机校准 - 如何调整棋盘方块大小?

    我正在使用 OpenCV Python 示例开发相机校准程序 来自 OpenCV 教程 http opencv python tutroals readthedocs io en latest py tutorials py calib3d
  • 是否可以通过 UIActivityViewController 共享图像并保留 exif 数据?

    我有一个应用程序 可以通过以下方式将图像保存到相机胶卷中的自定义相册中 library writeImageToSavedPhotosAlbum newTestImage CGImage metadata metadata completi

随机推荐

  • 蓝桥杯2022年第十三届省赛真题-最优清零方案

    include
  • Package xx is missing dependencies for the following libraries: libjson-c.so.2

    openwrt编译出错 Package xxx is missing dependencies for the following libraries libjson c so 2 在某个package的程序 添加了json c库的代码 在
  • DFRobot智能视觉传感器二哈识图(Huskylens)的应用

    二哈识图 HuskyLens 是国内著名开源硬件商DFRobot在人工智能领域出品的一款简单易用的智能视觉传感器 其板载的UART I2C端口 可以与主流控制器Arduino micro bit LattePanda Raspberry P
  • 【SpringMVC】SpringMVC和Spring集成

    文章目录 SpringMVC和Spring集成 首先目录结构如下 1 配置web xml
  • c语言——字符串相关的连接与应用

    1 字符数组 1 输入输出 s 2 字符数组初始化 字符串 char ch hello 2 字符串处理函数 1 函数原型 函数返回值 函数名 形参1类型 形参1 形参2类型 形参2 说明 实参必须有确定的值 并且个数与形参保持一致 类型和形
  • 22届哈工大深圳计算机854考研经验贴、过程总结贴(初试 353 复试 304 上岸哈工大深圳)

    目录 个人情况 数学 个人认为实力较强 江苏高考数学180 大一工数上下均90分以上 参加过数学竞赛 获得省一等奖 英语 较弱 就是那种音标不会 语法不会 单词不会的那种 高考勉强及格 大学英语均刚60分飘过 英语六级三次才过 479分 专
  • VTK-Windows源码编译生成VTK库

    VTK主要用于三维计算机图形学 图像处理和可视化 安装步骤如下 0 前置条件 我本地已经安装了VS 2019和CMAKE 3 20 5 下载源码 https vtk org download latest 这里我下的是8 2 0版本 解压后
  • 新买的服务器无法访问宝塔默认8888端口

    问题描述 刚买的服务器无法访问8888端口 宝塔登录面板 一 找到网络与域名下的防火墙管理规则 二 点击添加规则 三 输入端口号8888 四 添加成功后即可访问宝塔登录面板
  • sqli-labs less9详解

    作者简介 研究生在读 IT女 如果文章有错请指正 让我们一起学习 天天向上 一起进步 如果对你有帮助 还请点赞收藏哦 写在前面 建议 如果对SQL注入中SQL语句不熟悉的可以先看看SQL盲注 你需要知道的常用sql函数和语句 如果看懂了这篇
  • 一款简单易用的视频下载工具

    公众号回复 1024 免费领取程序员赚钱实操经验 大家好 我是章鱼猫 今天推荐的这个项目是 downkyi 哔哩下载姬 一个简单易用的哔哩哔哩视频下载工具 支持批量下载 支持 8K HDR 杜比视界 提供工具箱 音视频提取 去水印等 哔哩下
  • 图书管理系统(Java面向对象总结性项目)

    文章目录 前言 一 图书管理系统的总体框架是什么 1 管理员的操作 2 普通用户的操作 二 具体的实现过程 1 创建关于书的一个包 book类的具体实现 booklist类的具体实现 2 创建operation的一个包 实现IOperati
  • Spring Bean的管理(IOC 依赖注入)

    文章目录 Spring Bean 基于xml的实现 name定义别名的演示 scope作用域的演示 singleton 演示 prototype 演示 xml配置方式的依赖注入 创建对象 为对象中的值赋值 方式一 通过构造方式的注入属性值
  • 青龙面板之酷狗大字版简单抓包

    酷狗大字版 一天1元左右 下载后复制下方得打开酷狗大字版 IQ1CPA 填写 你得金币 我也得金币 操作步骤 第一步 拉库 ql raw https gitee com ajouter shiyi git raw shiyi kgdzb j
  • freeswitch:回声、会议

    回声和延迟回声 关于回声 没什么需要多解释的 我们已经非常熟悉这一段了 如果拨9196 就能听到自己的回声 Dialplan如下 与echo类似 delay echo可以使用回声有一定延迟 Dialplan如下 其中5000是毫秒数 将通话
  • 执行hibernate的max()等聚合函数

    Exception in thread main java lang IllegalStateException No data type for node org hibernate hql ast tree AggregateNode
  • c++ map

    map是标准的关联式容器 一个map是一个键值对序列 映射 map提供基于key的快速检索能力 map中key值是唯一的 集合中的元素按一定的顺序排列 map元素插入过程是按排序规则插入 所以不能插入指定位置 map的具体实现采用红黑树变体
  • Sublime Text和Webstorm快速编写HTML/CSS代码的技巧

    1 初始化模板 HTML文档需要包含一些固定的标签 比如 等 现在你只需要1秒钟就可以输入这些标签 比如输入 或 html 5 然后按Tab键 html 5 或 用于HTML5文档类型 html xt 用于XHTML过渡文档类型 html
  • 归并排序(C)递归与分治策略

    归并排序 C 习题描述 题目描述 采用归并排序算法 并利用递归函数完成n个数字 n lt 100 的从小到大排序 输入描述 输入包括两行 第一行1个数字n 表示要排序的数字的个数 第二行有连续n个待排序数字 输出描述 输出只有一行 有n个排
  • Weex内置组件的使用——Weex的学习之路(二)

    最近公司项目不是很忙 就和组内成员商量利用时间学学新技术 最终在Weex和Flutter做选择 Weex是由阿里的大牛们开发出来语言 Flutter是由Google公司开发的 各种网上查找得出的评论都是Flutter更有前景 但是最终我们还
  • unity-Camera参数介绍、种类、操作以及获取相机截图画面

    总结一下学到的Camera 相关知识 unity中的Camera unity中相机参数介绍 Camera种类 对相机操作 截取相机画面到本地 unity中的Camera 相机是我们观察游戏世界的窗口 在unity中至少需要一个相机 可以使用