前言:图形学第四弹,透视投影!来吧,我们开始
先上图
原图

经过透视投影后的图

之前我们都是直接将图片投影到 的平面上,没有用透视投影的方法。其实不难,来,让我们开始吧。
一图解决所有问题

在之前的博客中,我们直接用的是,代替投影以后的图。学习透视投影之后,我们将计算新的
如图由相似三角形可得
c 是相机的位置。也就是说,我们用透视投影,新的来代替直接投影。
实现
引入线性变换(Linear transformations)
有线性代数的基础的同学可以跳过
基础线性变化
公式

比如

实现这样的变化,红绿线是数轴

旋转
公式

:)
比如

引入齐次坐标(Homogeneous coordinates)
这一点可能很多人不知道,建议看看,有助于完成后面的代码
啥是齐次坐标
所谓齐次坐标就是将一个原本是 n 维的向量用一个 n+1 维向量来表示。比如二维 [1, 2] 可表示为三维 [1, 2, 1],也可表示为 [2, 4, 2]也就是说将前面两个数除以后面那个数就可以得到二维平面的坐标。
注意!
- 如果最后一个数字不为 0 。那么表示点
- 如果最后一个数字为 0 。那么表示向量
为啥要用「齐次坐标」
齐次坐标的作用有很多,我也没搞透。只能举出一个应用于本次学习的例子。
齐次坐标应用在计算机图形中,可以用来计算投影。
记得我们在一开始提出的吗?它其实是
而且,在我们的模型中,他其实是还有 z 的值。这个 z 值有关于我们之前 3d 到 2d 的转换。
通过齐次坐标,我们可以用表示我们新的坐标
代码
运行
$ g++ tgaimage.cpp model.cpp geometry.cpp main.cpp -o main