Games101图形学学习笔记——图形学基础

这里写目录标题

图形学基础

基础数学:线性代数,几何

基础物理:力学,光学

其他:信号处理,数值分析

线性代数

Vector向量


向量的归一化

向量的加法(平行四边形法则,三角形法则)

向量的坐标表示

向量的点乘


向量点乘的一些属性

点乘的坐标运算

可以判断向量前与后的信息

点乘>0 同方向

点乘<0 反方向

向量的叉乘


叉乘的一些属性

叉乘的矩阵形式

作用:判定左和右

判定内与外

矩阵

线性变换是操纵空间的一种手段,他保持网格线平行且等距分布,并保持原点不动

矩阵是一种描述线性变换的语言,而矩阵向量乘法就是计算线性变换作用域给定向量的一种途径
矩阵的乘积

首先两个矩阵必须要可以相乘

(M x N)(N x P) = (M x P)

第一个矩阵的列==第二个矩阵的行。才能相乘

如:

第一个矩阵M行N列

第二个矩阵N行P列

得到M行P列的新矩阵

新矩阵a行b列的元素怎么得出来呢?

第一个矩阵a行和第二个矩阵b列做点积运算

矩阵的性质

矩阵乘向量

矩阵的转置

单位矩阵,矩阵的逆

向量的点乘,叉乘(矩阵形式)

向量的投影

Transform

Scale 缩放

Reflection 镜像变换

Shear 错切

Rotate(旋转)

如果用一个矩阵乘以输入可以得到输出的坐标,那么称这个变换叫线性变换

齐次坐标

给二维坐标增加一个维度,将线性变换也可以用矩阵形式表达

用齐次坐标可以将线性用矩阵统一表示

缺点:引入了额外的数字

矩阵不满足交换律

先旋转在平移写作 (T·R·向量) 从右往左写,矩阵的应用是从右到左的

三维空间中的线性变换也可以用齐次坐标表示

3D变换

3D变换相对于2D变换来说只是多增加了一个维度,可由2D变换举一反三得来

3D旋转在绕Y轴旋转时理解有些特殊

以xyz三个轴来说

X x Y = Z Y x Z = X X x Z = -Y

所以绕Y轴旋转的矩阵表现出来是转置的状态

罗德里格斯旋转公式

在三维空间内绕某一轴旋转,默认这个轴是过原点的

罗德里格斯旋转公式就是总结了绕任意过原点的轴旋转的公式

对于绕不过原点的轴旋转,我们可以将其拆分为

  • 将旋转轴平移到原点
  • 绕轴旋转
  • 将旋转后的模型平移回去

MVP变换:模型,视图,投影变换

视图/相机变换

图形学的最终目的是为了将三维中的物体渲染成二维里的图像

在现实生活中如何照一张照片?

  • 找个好地方摆pose(Model变换)
  • 把相机放个好角度(View变换)
  • 按快门(Projection变换)

    View变换--如何摆放相机的角度

决定相机的位置

决定相机看向的方向

决定相机头朝上的方向

规定相机永远在(0,0,0),沿着-Z看

变化的永远是其他物体

所以要先把摄像机归到原点

平移摄像机至(0,0,0)

将相机lookat的方向旋转到-z

旋转相机头朝上的方向到Y

第一步的平移可以简单的写成下图Tview

但是要将任意向量旋转到轴上比较难写(也就是第2步和第三步)

但是将轴(如X轴(1,0,0))旋转到任意向量比较好写

所以我们先求将X轴旋转到任意向量的矩阵,之后将该矩阵求逆,即可得到任意向量旋转到轴的矩阵Rview

Rview x Tview = Mview

Mview即为视图变换,将Mview应用到相机,相机归零,同时也需要将Mview应用到其他所有物体,让物体和相机的相对位置保持不变

正交投影和透视投影

区别:是否有近大远小的性质

正交投影

满足近大远小的性质

先将相机归零lookat -Z轴

对于二维投影来说,直接把Z轴坐标舍弃,就能得到物体在xy平面上的投影

要把得到的图像平移并且缩放到[-1,1]²中,方便之后的计算

对于正交投影来说,视口是个[l,r][b,t][f,n]的长方体,想让他变成[-1,1]³中的话只需要

  • 先将立方体的中心平移到原点
  • 在将立方体缩放到[-1,1]³中

首先要找到立方体的中心点,也就是

将边长r-l、t-b、n-f缩放到长度2

所以正交投影矩阵如下

(此时物体肯定会被拉伸,在之后的视口操作中会恢复拉伸)

透视投影

传统的欧式几何是在同一平面内生效的法则

对于不同平面就会造成照片中近大远小的情况

如何做透视投影呢?

老师的方法是,先将Frustum远平面及远平面到近平面之间的所有平面挤压到近平面大小,

变成Cuboid的样子,然后做一次正交投影

那么如何做挤压呢?

  • 对于除近平面外的任意一个点,通过挤压后该点的高度y要变成和近平面一样的y'
  • 从侧面看Frustum的话,如下图,可以形成两个相似三角形,即可得出y'=(n/z)y
  • 同理x'=(n/z)x

通过上面推导出来的两个公式可得,对于任意一点(x,y,z,1)T 可得

这里为了方便书写,用T来表示转置矩阵,下文同

将这个点同时乘z得

(齐次坐标同时乘k(k!=0),还得到相同的点)

  • 所以我们推导出了变化后的点的一部分
    就是
  • 那么一个矩阵乘以任意一点(x,y,z,1)T得到上图,我们就可以推导出这个矩阵的一部分了
  • 矩阵的一部分如下图

    想补全这个矩阵,需要用到两条已知的性质
  1. 近平面的点不会发生变化
  2. 远平面的点z的值不会发生变化
  • 对于近平面上的点来说,他的z值就是n
    见下图

    由性质1可得

对于近平面上的点(x,y,n,1)T经过矩阵变换后该点还为(x,y,n,1)T,同时乘n后得(nx,ny,n²,n)T

所以当z等于n时,也就是说近平面的点通过矩阵运算后变为(nx,ny,n²,n)T

所以矩阵第三行乘以(x,y,n,1)T= n²

可得第三行前两个数一定为0,即(0,0,A,B)

可得

  1. An+B=n²

    由性质2可得

    选一远平面上的点x=0,y=0,即中间点(0,0,f,1)T,经矩阵变化后还是中间点(0,0,f,1)T,同时乘f后得(0,0,f²,f)T

    即(0,0,A,B)(0,0,f,1)T=(0,0,f²,f)T

    可得

  2. Af+B=f²

    联立1、2得

    A=n+f

    B=-nf

    至此可解出Mpersp -> ortho

    所以对于空间中任意一点进行透视变换可以通过如下公式解出

相关推荐
听忆.几秒前
手机屏幕上进行OCR识别方案
笔记
幼儿园老大*36 分钟前
走进 Go 语言基础语法
开发语言·后端·学习·golang·go
Selina K38 分钟前
shell脚本知识点记录
笔记·shell
1 小时前
开源竞争-数据驱动成长-11/05-大专生的思考
人工智能·笔记·学习·算法·机器学习
ctrey_1 小时前
2024-11-4 学习人工智能的Day21 openCV(3)
人工智能·opencv·学习
啦啦右一1 小时前
前端 | MYTED单篇TED词汇学习功能优化
前端·学习
霍格沃兹测试开发学社测试人社区2 小时前
软件测试学习笔记丨Flask操作数据库-数据库和表的管理
软件测试·笔记·测试开发·学习·flask
今天我又学废了2 小时前
Scala学习记录,List
学习
幸运超级加倍~2 小时前
软件设计师-上午题-16 算法(4-5分)
笔记·算法
王俊山IT2 小时前
C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(5)
开发语言·c++·笔记·学习