Lecture 04 模型变换、视图变换、投影变换
1488字约5分钟
2024-11-20
以拍照为比喻的话, 寻找拍照场地就是模型变换, 寻找拍照机位就是视图变换, 将三维空间拍摄成照片就是投影变换.
1 模型视图变换
1.1 相机位置
相机位置可以由三个属性定义:
- 位置 e
- 视线方向 $\hat{ \boldsymbol{g}} $
- 向上方向 t^
一个很明显的现象是:当相机和物体一起运动(或者说二者没有相对运动)时,物体的投影是不变的。因此在图形学中,总是让相机保持不动,而被投影的物体围绕相机运动.
通常令相机位于原点,视线方向为z轴负方向,向上方向为y轴正方向:
e=(0,0,0)T
g^=(0,0,−1)T
t^=(0,1,0)T
1.2 模型视图变换
上面提到模型和视图通常都是进行相同的变换,因此模型变换和视图变换有时也合称为模型视图变换.
如下图所示,将一个任意位置、任意朝向的相机移动到标准位置,需要经过以下步骤:
- 将相机移动到原点;
Tview=100001100010−xe−ye−ze1
- 将g^旋转到−z轴;
- 将t^旋转到y轴;
- 将g^×t^旋转到x轴.
然而将任意向量旋转至坐标轴上并不容易,因此考虑其逆过程,即将坐标轴旋转至指定方向:
- 将x轴旋转到g^×t^;
- 将y轴旋转到t^;
- 将−z轴旋转到g^.
因此有
Rview−1=xg^×t^yg^×t^zg^×t^0xtytzt0x−gy−gz−g00001
容易验证R是一个正交矩阵,于是:
Rview=(Rview−1)T=xg^×t^xtx−g0yg^×t^yty−g0zg^×t^ztz−g00001
因此视图变换矩阵为:
Mview=RviewTview=xg^×t^xtx−g0yg^×t^yty−g0zg^×t^ztz−g00001100001100010−xe−ye−ze1
2 投影变换
投影变换有两种:正交投影和透视投影.
正交投影中所有的投影线相互平行,透视投影的投影线交于一点(焦点).
正交投影可以视为焦点在无限远处的透视投影.
2.1 正交投影
正交投影可以由下述操作得到:
- 将相机和物体变换至标准位置;
- 令z=0;
- 通过平移和缩放变换将第2步的结果置于[−1,1]2中.
通常使用下面的方法,将一个任意立方体[l,r]×[b,t]×[f,n]变换到标准立方体[−1,1]3:
Mortho=r−l20000t−b20000n−f200001100001100010−2r+l−2t+b−2n+f1
2.2 透视投影
透视投影的模型可以看做是一个四棱台. 那么只要将这个四棱台变换为一个立方体,就可以按照正交投影的方法再将其变换到标准立方体.
2.2.1 透视投影矩阵
沿着x轴方向从正向负观察模型,可以看到下图所示的内容.
由相似三角形原理不难得到:
y′=zny
x′=znx
写成矩阵形式为:
n0?00n?000?100?0xy?z
矩阵的第三行仍然未知,下面求解矩阵第三行的内容。
观察模型发现,近平面和远平面上的点的z坐标都不会发生变化,即:
(xyn1)T=(nxnyn2n)T
(xyf1)T=(fxfyf2f)T
那将第三行单独拿出来计算,于是有:
(00AB)xyn1=n2
(00AB)fxfyf1=f2
于是有方程组:
An+B=n2Af+B=f2
求解即可得到:
A=n+f
B=−nf
因此将四棱台变换为立方体的矩阵为:
Mpersp→ortho=n0000n0000n+f100−nf0
透视投影矩阵为:
Mpersp=MorthoMpersp→ortho=r−l20000t−b20000n−f200001100001100010−2r+l−2t+b−2n+f1n0000n0000n+f100−nf0
2.2.2 视场角与宽高比
从相机位置看向近平面,可以得到视场角和宽高比.
视场角是相机与近平面上下两条边的中心的连线形成的角,它可以用来定义相机的广角或者长焦.
借助视场角和长宽比的概念,可以从中得到模型的l,r,b,t四个参数:
tan2fovY=∣n∣t
aspect=tr