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

【基础】Unity中Camera组件知识点

一、投影模式 (Projection)

1. 透视模式 (Perspective)

  • 原理:模拟人眼,近大远小(锥形体视锥)

  • 核心参数

    • Field of View (FOV):垂直视场角

      • 典型值:第一人称 60°-90°,驾驶舱 30°-45°

      • 特效:FOV↑=视野变广(鱼眼效果),FOV↓=视野变窄(望远镜)

    • Clipping Planes

      • Near:近裁面(0.01-0.3,避免穿模)

      • Far:远裁面(100-1000,过大影响性能)

2. 正交模式 (Orthographic)

  • 原理:无视距离,物体恒定大小(立方体视锥)

  • 核心参数

    • Size:视口高度的一半(单位:世界坐标)

      • 计算:若想显示10单位高度区域 → Size=5

    • Clipping Planes同透视模式(控制Z轴范围)

二、清除与背景 (Clear Flags & Background)

1. Clear Flags(帧缓存清除策略)

模式清除颜色清除深度典型用途
Skybox开放世界(需设置天空盒)
Solid Color纯色背景(太空/抽象场景)
Depth Only×UI摄像机必选
Don't Clear××特殊效果(极少用)

2. Background

  • 仅当 Clear Flags = Solid Color 时生效

  • 建议用深灰色(RGB:30,30,30)替代纯黑避免色偏

三、渲染过滤 (Culling Mask)

  • 本质:32位图层掩码(对应Layer面板的32个层)

  • 操作逻辑

  • // 代码示例:只渲染UI层和Enemy层
    camera.cullingMask = (1 << LayerMask.NameToLayer("UI")) | (1 << LayerMask.NameToLayer("Enemy"));
  • 经典用例

    • 主摄像机:排除UI层

    • 小地图摄像机:仅显示Terrain层

    • 阴影摄像机:仅渲染Cast Shadows的物体

四、深度与渲染顺序 (Depth)

  • 核心规则:深度值大的摄像机后渲染(覆盖先渲染的画面)

  • 多摄像机协作模板

Camera_Main(场景渲染):  Depth = 0  Culling Mask = Everything & ~UI  // 排除UI层  Clear Flags = Skybox  Camera_UI(界面渲染):  Depth = 1  Culling Mask = UI  Clear Flags = Depth Only  // 保留场景颜色,只清深度

五、视口控制 (Viewport Rect)

  • 归一化坐标:[0,0]左下角 → [1,1]右上角

  • 参数详解

    • X:视口左下角起始X坐标

    • Y:视口左下角起始Y坐标

    • W:视口宽度(0~1)

    • H:视口高度(0~1)

  • 应用场景

    • 双人分屏:Player1: (0,0,0.5,1) + Player2: (0.5,0,0.5,1)

    • 小地图:(0.7,0.7,0.3,0.3)

六、目标纹理 (Target Texture)

工作流
  1. 创建Render Texture:Assets > Create > Render Texture

  2. 绑定到Camera:拖入Camera组件的Target Texture槽

  3. 应用输出:

    • 3D材质:赋给MeshRenderer的材质

    • UI显示:RawImage组件的Texture参数

高级技巧
// 动态创建渲染纹理
RenderTexture rt = new RenderTexture(512, 512, 16); 
camera.targetTexture = rt;
// 完成后释放资源
rt.Release(); 

七、坐标转换(核心API)

1. 屏幕坐标 → 世界坐标

// 转换到3D世界(z为摄像机前方距离)
Vector3 worldPos = camera.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y,10) // z=10表示摄像机前方10单位
);

2. 世界坐标 → 屏幕坐标

// 用于UI跟随3D物体
Vector3 screenPos = camera.WorldToScreenPoint(enemy.transform.position);
uiElement.transform.position = screenPos;

3. 射线检测(物体拾取)

Ray ray = camera.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out RaycastHit hit, 100)) 
{Debug.Log("点击了:" + hit.collider.name);
}

八、高级功能

1. 物理摄像机 (URP/HDRP)

  • Focal Length:焦距(毫米)→ 控制FOV

  • Sensor Size:胶片尺寸 → 影响视野比例

  • Aperture:光圈 → 控制景深强度

2. 摄像机堆栈 (URP专属)

Base Camera(基础场景)
  ↓
Overlay Camera 1(特效层)
  ↓
Overlay Camera 2(UI层)

  • 优势:比传统Depth排序更节省性能

3. 回调事件

void OnPreCull() { /* 裁剪前调用 */ } 
void OnPreRender() { /* 渲染前调用 */ }
void OnPostRender() { /* 渲染后调用 */ }
http://www.lqws.cn/news/104329.html

相关文章:

  • 49套夏日小清新计划总结日系卡通ppt模板
  • 《Effective Python》第六章 推导式和生成器——使用类替代生成器的 `throw` 方法管理迭代状态转换
  • 香橙派3B学习笔记6:基本的Bash脚本学习_UTF-8格式问题
  • 使用 Python + ExecJS 获取网易云音乐歌曲歌词
  • 红黑树与红黑树的插入——用C++实现
  • 关于list集合排序的常见方法
  • JAVA获取ES连接并查询所有数据
  • Eigen实现非线性最小二乘拟合 + Gauss-Newton算法
  • Server2003 B-1 Windows操作系统渗透
  • Java项目OOM排查
  • 华为云Flexus+DeepSeek征文|基于华为云Flexus X实例的小说转语音助手应用构建实录
  • JS对数据类型的检测
  • CppCon 2014 学习:Lightning Talk: Writing a Python Interpreter for Fun and Profit
  • Java 调用第三方接口注意事项
  • Axure设计案例:滑动拼图解锁
  • 电子电路:全面深入了解晶振的定义、作用及应用
  • WordPress 6.5版本带来的新功能
  • 接口重试的7种常用方案!
  • Eureka 高可用集群搭建实战:服务注册与发现的底层原理与避坑指南
  • C++:优先级队列
  • SOC-ESP32S3部分:28-BLE低功耗蓝牙
  • 【数学】高斯积分+伽马函数公式自用背诵笔记
  • Rust 学习笔记:Cargo 工作区
  • CppCon 2014 学习:Rolling Your Own Circuit Simulator
  • 应用智能化转型—MCP原理分析
  • 帝可得 - 策略管理
  • 【MATLAB去噪算法】基于CEEMD联合小波阈值去噪算法(第三期)
  • c++基础(三)
  • Trae CN IDE自动生成注释功能测试与效率提升全解析
  • Linux: network : switch:hp5500