当前位置: 首页 > news >正文

Unity的Camera类——视觉掌控与深度解析(下)

前言

欢迎阅读本篇博客,这章我们将深入探讨 Unity 游戏引擎中 Camera 类的委托和枚举。摄像机在游戏开发中扮演着关键角色,它不仅定义了玩家视角的窗口,还影响着游戏的视觉表达和整体体验。理解和正确使用 Camera 类的枚举和委托,可以极大地提升你的游戏视觉效果和性能表现。


Camera的委托:

Camera.CameraCallback:

Camera.CameraCallback

Unity 中的一个委托类型,它用于定义一系列与摄像机相关的事件的签名。这些事件是上一章有说到的 onPreCull、onPreRender 和 onPostRender。当摄像机即将裁剪、渲染或完成渲染时,会触发这些事件。

 
定义:

public delegate void CameraCallback(Camera cam);

这个委托类型接受一个 Camera 类型的参数。这意味着,任何要作为这些事件处理函数的方法都必须接受一个 Camera 类型的参数。

要使用 CameraCallback,你首先需要定义一个符合这个委托签名的方法,然后将这个方法添加到对应的摄像机事件上。

示例:
如果你想在每次摄像机渲染后执行一些操作,你可以将方法添加到 Camera.onPostRender 事件上。

void OnPostRender(Camera cam)
{// 这里是在摄像机渲染完成后要执行的代码
}
void OnEnable()
{Camera.onPostRender += OnPostRender;
}
void OnDisable()
{Camera.onPostRender -= OnPostRender;
}

在这个例子中,OnPostRender 方法就是一个符合 CameraCallback 委托签名的方法。
同样的方式可以用于 Camera.onPreCull 和 Camera.onPreRender 事件,只需将方法添加到这些事件即可,可以参照上一章节的Camera事件示例。


Camera的枚举

Camera.FieldOfViewAxis:
Camera.GateFitMode:
Camera.MonoOrStereoscopicEye:
Camera.RenderRequestMode:
Camera.RenderRequestOutputSpace:
Camera.StereoscopicEye:

Camera.FieldOfViewAxis

用于确定摄像机的视场(Field of View, FOV)是围绕哪个轴进行调整。在 Unity 中,这通常涉及两个选项:Vertical和Horizontal

  1. Vertical (垂直轴): 当视场基于垂直轴时,无论屏幕的宽高比如何变化,摄像机视场的垂直部分保持不变。这是最常用的设置,特别是在需要保持垂直视角一致性的场景中,比如第一人称或第三人称射击游戏。
  2. Horizontal (水平轴): 当视场基于水平轴时,摄像机视场的水平部分保持不变,而垂直视场会根据屏幕的宽高比进行调整。这种设置在宽屏显示器上特别有用,因为它可以在不裁剪水平视野的情况下适应不同的屏幕尺寸。

Camera.GateFitMode

这个枚举控制摄像机视野如何适应画幅尺寸的变化,尤其重要于影视制作中的画幅比例适配

  1. Vertical: 垂直适配。在此模式下,摄像机的垂直视野保持不变,而水平视野根据画幅比例变化而自动调整。这常用于确保特定的垂直视觉元素不受画幅比例变化的影响。
  2. Horizontal: 水平适配。与垂直适配相反,此模式保持水平视野不变,垂直视野随画幅比例变化而调整。适用于水平视角更为重要的场景。
  3. Fill: 填充模式。摄像机的视野会扩展以填充整个画幅,但这可能导致画幅边缘的部分图像被裁剪。
  4. Overscan: 保留图像的全部内容。摄像机的视野会进一步扩展以确保画幅内的每个部分都被覆盖,可能会捕捉到通常不可见的场景部分。
  5. None: 摄像机不进行任何画幅适配。这意味着摄像机视野依赖于传感器尺寸,无视画幅比例。

Camera.MonoOrStereoscopicEye

用于区分渲染单眼(Mono)和双眼(Stereoscopic)视图的设置。这对于虚拟现实(VR)和增强现实(AR)应用尤其重要。

  1. Left: 左眼。用于立体视觉渲染的左眼视图。
  2. Right: 右眼。用于立体视觉渲染的右眼视图。
  3. Mono: 单眼。标准的2D视觉渲染,不涉及立体视觉效果。

Camera.RenderRequestMode

与摄像机的渲染请求相关,允许开发者在高级渲染场景中进行更细致的控制,如在后期处理、图像分析或高级渲染技术中

  1. None: 默认值,表示没有特定的渲染请求模式。
  2. ObjectId: 输出一个对象的 InstanceID 缓冲区。这通常用于识别渲染场景中的特定对象。
  3. Depth: 输出深度值。这对于实现深度相关的效果,如景深、阴影等,非常有用。
  4. VertexNormal: 输出插值后的顶点法线。这对于实现某些类型的光照效果很重要。
  5. WorldPosition: 输出世界坐标位置缓冲区。这可以用于计算对象在世界空间中的位置。
  6. EntityId: 输出一个实体ID。这通常用于实现复杂的渲染效果,需要跟踪特定实体。
  7. BaseColor: 输出材质的基色(Albedo/Base Color)。这对于提取或修改对象的主要颜色非常有用。
  8. SpecularColor: 返回材质的镜面反射颜色缓冲区。用于实现高级的光照效果。
  9. Metallic: 输出材质的金属度值。这对于实现金属材质的渲染效果非常重要。
  10. Emission: 输出材质的发光值。用于渲染自发光材质。
  11. Normal: 输出每像素的法线。这对于实现复杂的光照和表面效果至关重要。
  12. Smoothness: 返回材质的光滑度缓冲区。这对于实现高质量的反射和光泽效果非常有用。
  13. Occlusion: 返回材质的环境遮蔽(Ambient Occlusion)缓冲区。这对于增强场景的深度感和细节非常重要。
  14. DiffuseColor: 输出材质的漫反射颜色。这对于分析或修改对象的漫反射颜色非常有用。

Camera.RenderRequestOutputSpace

这个枚举定义了渲染请求的输出空间,即渲染请求的数据将以哪种形式输出

  1. ScreenSpace: 渲染请求将在屏幕空间中渲染,从摄像机的视角出发。这意味着输出将是基于摄像机视角和屏幕坐标系统的。
  2. UV0 - UV8: 这些值表示渲染请求将输出在被渲染网格的特定UV空间中。UV空间是用于映射纹理到3D模型的坐标系统,每个UV值(从UV0到UV8)代表模型上不同的纹理坐标集。这使得开发者可以对模型上特定的纹理坐标进行高级渲染操作。
    UV0: 输出在UV0空间中。
    UV1: 输出在UV1空间中。
    UV2: 输出在UV3空间中。
    (剩余的同理)

这些选项允许开发者在不同的坐标系统中进行渲染操作,为渲染过程提供了更多的灵活性和控制。例如,选择屏幕空间可以用于实现与屏幕坐标相关的效果,如屏幕空间反射(Screen Space Reflections)。而选择UV空间可以用于实现复杂的纹理效果,如纹理映射、纹理变换等。这为在Unity中实现高级图形处理和自定义渲染技术提供了强大的工具。


Camera.StereoscopicEye

这个枚举用于指定立体视觉渲染中的眼睛类型

  1. Left: 左眼。用于生成立体视觉中的左眼图像。
  2. Right: 右眼。用于生成立体视觉中的右眼图像。

希望这篇博客能够帮助你更好地理解 Unity 的 Camera 类。
在下一篇文章,我们会继续深度解析Camera的实例对象,上面说到的枚举用法也会在之后的章节中使用。如有任何疑问或想要进一步讨论,欢迎在评论区留言。

相关文章:

Unity的Camera类——视觉掌控与深度解析(下)

前言 欢迎阅读本篇博客,这章我们将深入探讨 Unity 游戏引擎中 Camera 类的委托和枚举。摄像机在游戏开发中扮演着关键角色,它不仅定义了玩家视角的窗口,还影响着游戏的视觉表达和整体体验。理解和正确使用 Camera 类的枚举和委托&#xff0c…...

【模型评估 06】超参数调优

对于很多算法工程师来说,超参数调优是一件非常头疼的事情。除了根据经验设定所谓的“合理值”之外,一般很难找到合理的方法去寻找超参数的最优取值。而与此同时,超参数对于模型效果的影响又至关重要。有没有一些可行的办法去进行超参数的调优…...

Matlab 字符识别OCR实验

Matlab 字符识别实验 图像来源于屏幕截图,要求黑底白字。数据来源是任意二进制文件,内容以16进制打印输出,0-9a-f’字符被16个可打印字符替代,这些替代字符经过挑选,使其相对容易被识别。 第一步进行线分割和字符分割…...

Docker Compose 部署 jenkins

Docker Compose 部署 jenkins jenkins 部署 Docker-Compose 部署 version: 3.1 services:jenkins:image: jenkinsci/blueoceanvolumes:- /data/jenkins/:/var/jenkins_home- /var/run/docker.sock:/var/run/docker.sock- /usr/bin/docker:/usr/bin/docker- /usr/lib/x86_64-…...

QT:使用QStyle实现QMenu的滚动效果

项目中,使用QMenu,多个QAction时 超出页面范围,需要菜单栏可以上下滚动。 实际QMenu是带滚动的,但是要知道怎么使用 还是需要查看QT源码,现在简单记录下我的使用方法。 QT源码中:q->style()->style…...

双指针问题——求只包含两个元素的最长连续子序列(子数组)

一,题目描述 你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必…...

Unity组件开发--短连接HTTP

1.网络请求管理器 using LitJson; using Cysharp.Threading.Tasks; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking; using UnityEngine.Events;using System.Web; using System.Text; using Sy…...

真正的强大,原来是不动声色的

当一个人走过了绝境,他就会发现,真正的强大,原来是不动声色的。 他会停止一切自证,不再解释,话越来越少,眼神越来越坚定。 他不再模棱两可,唯唯诺诺,而是敢于断然拒绝,…...

git 查看tag和创建tag以及上传tag命令

文章目录 git 查看tag和创建tag以及上传tag命令git tagtag操作常用命令 git 查看tag和创建tag以及上传tag命令 git tag 如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 git tag 给它打上标签。 Git 的 tag 功能是一个非常有用…...

代码随想录二刷 |二叉树 | 二叉搜索树的最小绝对差

代码随想录二刷 |二叉树 | 二叉搜索树的最小绝对差 题目描述解题思路 & 代码实现递归法迭代法 题目描述 530.二叉搜索树的最小绝对差 给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。 示例&#…...

【Linux】Linux 系统编程——tree 命令

文章目录 1. 命令概述2. 命令格式3. 常用选项4. 相关描述4.1 tree 命令安装 5. 参考示例5.1 创建树形目录5.2 使用 tree 命令查看树形目录 1. 命令概述 tree 命令用于在命令行界面以树状图形式显示目录及其子目录的内容。这个命令递归地列出所有子目录,并可选择显示…...

Android简单控件

1.文本显示 设置文本内容的两种方式&#xff1a; 在XML文件中通过属性 android:text 设置文本 <resources><string name"app_name">chapter03</string><string name"hello">你好&#xff0c;世界</string> </resources&…...

【Java 干货教程】Java实现分页的几种方式详解

一、前言 无论是自我学习中&#xff0c;还是在工作中&#xff0c;固然会遇到与前端搭配实现分页的功能&#xff0c;发现有几种方式&#xff0c;特此记录一下。 二、实现方式 2.1、分页功能直接交给前端实现 这种情况也是有的&#xff0c;(根据业务场景且仅仅只能用于数据量…...

关于Python里xlwings库对Excel表格的操作(三十一)

这篇小笔记主要记录如何【如何使用“Chart类”、“Api类"和“Axes函数”设置绘图区外框线型、颜色、粗细及填充颜色】。前面的小笔记已整理成目录&#xff0c;可点链接去目录寻找所需更方便。 【目录部分内容如下】【点击此处可进入目录】 &#xff08;1&#xff09;如何安…...

QML使用QCustomPlot笔记

这里在QML中使用QCustomPlot是定义一个继承自QQuickPaintedItem的类&#xff0c;它包含一个QCustomPlot对象&#xff0c;在paint函数中将这个对象转化为pixmap绘制到布局中显示。 在QML中使用QT的Widget控件也可以借鉴这个思路实现 顺便记录一下QCustomPlot的简单设置与使用。…...

【REST2SQL】06 GO 跨包接口重构代码

【REST2SQL】01RDB关系型数据库REST初设计 【REST2SQL】02 GO连接Oracle数据库 【REST2SQL】03 GO读取JSON文件 【REST2SQL】04 REST2SQL第一版Oracle版实现 【REST2SQL】05 GO 操作 达梦 数据库 对所有关系数据的操作都只有CRUD&#xff0c;采用Go 的接口interface{}重构代码…...

《NLP入门到精通》栏目导读

一、说明 栏目《NLP入门到精通》本着从简到难得台阶式学习过度。将自然语言处理得知识贯穿过来。本栏目得前导栏目是《深度学习》、《pytorch实践》&#xff0c;因此&#xff0c;读者需要一定得深度学习基础&#xff0c;才能过度到此栏目内容。 二、博客建设理念 本博客基地&am…...

C++学习笔记——类继承

目录 一、一个简单的基类 1.1封装性 1.2继承性 1.3虚函数 1.4多态性 二、基类 2.1一个简单的C基类的示例 2.2 Animal是一个基类。 三、继承 3.1概念 3.2is-a关系 3.3多态公有继承 3.4静态联编和动态联编 3.5访问控制 3.6ABC理念 一、一个简单的基类 C中的基类是一…...

ARCGIS PRO SDK 使用条件管理 Pro UI

ARCGIS PRO UI简单介绍以下&#xff1a; 第一步&#xff1a;在Config.daml中在</AddInfo>标签下加上条件<conditions>标签&#xff08;必须添加的&#xff09; <conditions><!-- 定义条件 &#xff0c;此处定义了两个--Tab 另一个为 group><insert…...

Halcon经典的边缘检测算子Sobel/Laplace/Canny

Halcon经典的边缘检测算子 文章目录 Halcon经典的边缘检测算子1. Sobel算子2. Laplace 算子3. Canny 算子4. 总结 关于边缘检测&#xff0c;有许多经典的算子&#xff0c;各大图形处理库都有各自的边缘检测算子&#xff0c;这里简要介绍几种。 1. Sobel算子 Sobel算子结合了高…...

用单片机设计PLC电路图

自记&#xff1a; 见另一篇文章&#xff0c;MOS驱动差了一个充电电容&#xff0c;栅极电容充电会有问题&#xff1b; 光耦用的直插&#xff0c;但板子用的贴片&#xff0c;此文档仅供参考 基本列出了PCB板情况&#xff0c;基础元器件&#xff0c;部分连接&#xff0c;原理等…...

【设计模式-6】建造者模式的实现与框架中的应用

建造者模式又被成为生成器模式&#xff0c;是一种使用频率比较低&#xff0c;相对复杂的创建型模式&#xff0c;在很多源码框架中可以看到建造者的使用场景&#xff0c;稍后我们会在本文末尾展示几个框架的使用案例。  建造者模式所构造的对象通常是比较复杂而且庞大的&#x…...

PositiveSSL和Sectigo的多域名证书

首先&#xff0c;我们要知道PositiveSSL是Sectigo旗下的子品牌&#xff0c;提供多种类型的SSL数字证书&#xff0c;包括DV基础型的多域名SSL证书。Sectigo的SSL证书产品同样比较丰富&#xff0c;不仅有DV基础型多域名SSL证书&#xff0c;还有OV企业型以及EV增强型的多域名SSL证…...

Docker:docker exec命令简介

介绍 docker exec [OPTIONS] 容器名称 COMMAND [ARG...] OPTIONS说明&#xff1a; -d&#xff0c;以后台方式执行命令&#xff1b; -e&#xff0c;设置环境变量 -i&#xff0c;交互模式 -t&#xff0c;设置TTY -u&#xff0c;用户名或UID&#xff0c;例如myuser:myu…...

【大数据进阶第三阶段之Hive学习笔记】Hive的数据类型与数据操作

目录 1、Hive数据类型 1.1、基本数据类型 1.2、集合数据类型 1.3、类型转化 2、DDL数据定义 2.1、创建数据库 2.2、查询数据库 2.3删除数据库 2.4、创建表 2.4.1、内部表 2.4.2、外部表 2.4.3管理表与外部表的互相转换 2.5、分区表&#xff08;partition&#xff…...

GPT2:Language Models are Unsupervised Multitask Learners

目录 一、背景与动机 二、卖点与创新 三、几个问题 四、具体是如何做的 1、更多、优质的数据&#xff0c;更大的模型 2、大数据量&#xff0c;大模型使得zero-shot成为可能 3、使用prompt做下游任务 五、一些资料 一、背景与动机 基于 Transformer 解码器的 GPT-1 证明…...

微创新与稳定性的权衡

之前做过一个项目&#xff0c;业务最高峰CPU使用率也才50%&#xff0c;是一个IO密集型的应用。里面涉及一些业务编排&#xff0c;所以为了提高CPU使用率&#xff0c;我有两个方案&#xff1a;一个是简单的梳理将任务可并行的采用并行流、额外线程池等方式做并行&#xff1b;另外…...

对回调函数的各种讲解说明

有没有跟我师弟一样的童靴~&#xff0c;学习和使用ROS节点时&#xff0c;对其中的callback函数一直摸不着头脑的&#xff0c;以下这么多回调函数的讲解&#xff0c;挨个看&#xff0c;你总会懂的O.o 回调函数怎么调用,如何定义回调函数&#xff1a; 回调函数怎么调用,如何定义…...

Java多线程:创建多线程的三种方式

在Java中&#xff0c;有三种方式创建多线程&#xff0c;继承类Thread&#xff0c;继承接口Runnable&#xff0c;继承接口Callable。其中Thread和Runnable需要重写方法run&#xff0c;方法run没有返回值&#xff1b;Callable需要重写方法call&#xff0c;方法call可以返回值。 …...

Unity中打印信息的两种方式

不继承MonoBehaviour的普通C#类中打印信息&#xff1a; 使用Debug类的方法&#xff1a; Unity提供了Debug类&#xff0c;其中包含了一些用于打印信息的静态方法。以下是常用的几种方法&#xff1a; Debug.Log(message)&#xff1a;打印普通信息。Debug.LogWarning(message)&a…...

做网站学多长时间可以学会/软文代写公司

好啦&#xff0c;101-200的文章阶段记录开始啦&#xff0c;新的开始&#xff0c;加油&#xff01; 上一篇文章写到了递归遍历所有文件&#xff0c;提到了压缩包的问题&#xff0c;现在就来介绍一下&#xff1a; python解压缩文件常用shutil模块 直接上代码&#xff1a; 压缩…...

中山企业网站制作/珠海seo推广

人脸识别库–face_recognition库官中文档 想做人脸识别,参考大佬用到了face_recognition库,所以自己就像去装上实现以下 首先遇到下载速度问题 100M的库,6K的下载速度,可以使用国内镜像地址,大幅度提升下载速度 国内镜像地址&#xff1a; &#xff08;1&#xff09;阿里云 h…...

wordpress 图片质量/全网软文推广

为什么80%的码农都做不了架构师&#xff1f;>>> http://www.mkyong.com/eclipse/eclipse-ide-tomcat-version-6-0-only-supports-j2ee-1-2-1-3-1-4-and-java-ee-5-web-modules/ 转载于:https://my.oschina.net/macleo/blog/149586...

电商网站布局设计/网上电商平台开发

大家对于微软的Surface系列想必都已经非常熟悉了&#xff0c;但是Surface家族中还有一款大家伙&#xff0c;它自从2015年上市开始便一直处于供不应求的状态&#xff0c;这就是Surface Hub&#xff0c;一台拥有84寸屏幕的巨型平板电脑。微软Surface Hub的工程总监Peter Oehler先…...

风机网站怎么做/故事式软文广告300字

原文地址&#xff1a;http://blog.csdn.net/totogo2010/article/details/8016129 介绍&#xff1a; Grand Central Dispatch 简称&#xff08;GCD&#xff09;是苹果公司开发的技术&#xff0c;以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统。这建立在任务并行…...

用别人的电影网站做公众号/企业文化设计

wamp修改php.ini的方法&#xff1a;1、找到“/bin/php/php7.0.10/php.ini”并修改&#xff1b;2、找到“phpForApache.ini”并修改&#xff1b;3、打开“apache2.4.23/bin/php.ini”并修改即可。推荐&#xff1a;《PHP视频教程》在wamp中总共有三个地方可以修改 php.ini配置1. …...