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

【C++游戏引擎开发】第14篇:视图空间与相机坐标系

一、视图空间的基础数学框架

1.1 齐次坐标与变换矩阵

三维坐标系变换采用4×4齐次坐标矩阵,其通用形式为:
M = [ A 3 × 3 b 3 × 1 0 1 × 3 1 ] \mathbf{M} = \begin{bmatrix} \mathbf{A}_{3×3} & \mathbf{b}_{3×1} \\ \mathbf{0}_{1×3} & 1 \end{bmatrix} M=[A3×301×3b3×11]
其中:

  • A \mathbf{A} A 包含旋转、缩放变换
  • b \mathbf{b} b 为平移向量
  • 坐标点表示为 ( x , y , z , 1 ) T (x,y,z,1)^T (x,y,z,1)T

1.2 相机参数化表示

相机状态由六自由度参数定义:

  • 位置坐标: C = ( X , Y , Z ) \mathbf{C} = (X,Y,Z) C=(X,Y,Z)
  • 欧拉角: ( θ x , θ y , θ z ) (θ_x,θ_y,θ_z) (θx,θy,θz)(俯仰、偏航、滚动)
  • 缩放因子: s s s

二、相机坐标系变换原理

2.1 刚体变换分解

2.1.1 平移变换矩阵

将世界坐标原点平移至相机位置:
T = [ 1 0 0 − X 0 1 0 − Y 0 0 1 − Z 0 0 0 1 ] \mathbf{T} = \begin{bmatrix} 1 & 0 & 0 & -X \\ 0 & 1 & 0 & -Y \\ 0 & 0 & 1 & -Z \\ 0 & 0 & 0 & 1 \end{bmatrix} T= 100001000010XYZ1

2.1.2 旋转变换矩阵

构造基于观察方向的正交基:

  1. 前向向量: f = g ∥ g ∥ \mathbf{f} = \frac{\mathbf{g}}{\|\mathbf{g}\|} f=gg
  2. 右向向量: r = t × f ∥ t × f ∥ \mathbf{r} = \frac{\mathbf{t} \times \mathbf{f}}{\|\mathbf{t} \times \mathbf{f}\|} r=t×ft×f
  3. 上向向量: u = f × r \mathbf{u} = \mathbf{f} \times \mathbf{r} u=f×r

旋转矩阵的解析形式:
R = [ r x r y r z 0 u x u y u z 0 − f x − f y − f z 0 0 0 0 1 ] \mathbf{R} = \begin{bmatrix} r_x & r_y & r_z & 0 \\ u_x & u_y & u_z & 0 \\ -f_x & -f_y & -f_z & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} R= rxuxfx0ryuyfy0rzuzfz00001

2.2 视图矩阵合成

组合平移与旋转得到视图矩阵:
M v i e w = R ⋅ T = [ r − r ⋅ C u − u ⋅ C − f f ⋅ C 0 1 ] \mathbf{M}_{view} = \mathbf{R} \cdot \mathbf{T} = \begin{bmatrix} \mathbf{r} & -\mathbf{r}\cdot\mathbf{C} \\ \mathbf{u} & -\mathbf{u}\cdot\mathbf{C} \\ -\mathbf{f} & \mathbf{f}\cdot\mathbf{C} \\ 0 & 1 \end{bmatrix} Mview=RT= ruf0rCuCfC1


三、投影变换原理

3.1 正交投影

3.1.1 规范视体定义

正交投影将立方体视体映射到规范立方体[-1,1]³:
M o r t h o = [ 2 r − l 0 0 − r + l r − l 0 2 t − b 0 − t + b t − b 0 0 2 n − f − n + f n − f 0 0 0 1 ] \mathbf{M}_{ortho} = \begin{bmatrix} \frac{2}{r-l} & 0 & 0 & -\frac{r+l}{r-l} \\ 0 & \frac{2}{t-b} & 0 & -\frac{t+b}{t-b} \\ 0 & 0 & \frac{2}{n-f} & -\frac{n+f}{n-f} \\ 0 & 0 & 0 & 1 \end{bmatrix} Mortho=

相关文章:

  • MySQL 进阶 - 2 ( 12000 字详解)
  • C++ Cereal序列化库的使用
  • C++Cherno 学习笔记day19 [76]-[80] std::optional、variant、any
  • java.lang.OutOfMemoryError: GC overhead limit exceeded如何解决
  • 《Python星球日记》第23天:Pandas基础
  • AGI|AutoGen入门食用手册,搭建你的智能体流水线
  • Position属性实现元素精准定位
  • source insight编码对齐与中文乱码问题以及CRT中文乱码处理
  • 基于支持向量回归(SVR)的空气质量预测
  • 电商中的购物车(redis的hash类型操作)
  • NutriJarvis:AI慧眼识餐,精准营养触手可及!—— 基于深度学习的菜品识别与营养计算系统
  • halcon模板匹配(一)create_shape_model_xld
  • Python全栈开发项目实战——日历事件管理系统
  • QuarkPi-CA2 RK3588S卡片电脑:6.0Tops NPU+8K视频编解码+接口丰富,高性能嵌入式开发!
  • 2020年INS SCI1区TOP:平衡复合运动优化算法BCMO,深度解析+性能实测
  • Unity VideoPlayer 播放无声音
  • 【leetcode hot 100 300】最长递增子序列
  • NoV病毒抗原抗体,助力疫苗研究与诊断试剂开发!
  • 大型语言模型智能应用Coze、Dify、FastGPT、MaxKB 对比,选择合适自己的LLM工具
  • 某局jsvmp算法分析(dunshan.js/lzkqow23819/lzkqow39189)
  • 新零售网站建设/外贸网站优化推广
  • 领卷网站如何做代理/病毒什么时候才能消失
  • 微网站如何做微信支付宝支付宝/学seo网络推广
  • 怎么免费做带音乐的网站/公司广告推广方案
  • 淄博做网站小程序的公司/郑州疫情最新消息
  • 专门做餐厅设计的网站/搜索引擎排名竞价