0
点赞
收藏
分享

微信扫一扫

【GAMES101】作业0与Lesson 4课后思考

彪悍的鼹鼠 2022-03-30 阅读 87

作业描述

给定一个点 P=(2,1), 将该点绕原点先逆时针旋转 45◦,再平移 (1,2), 计算出变换后点的坐标(要求用齐次坐标进行计算)

代码:

#include <iostream>
#include <Eigen\Dense>
#include <cmath>

using namespace std;
using namespace Eigen;
void main()
{
	Vector3d v(2, 1, 1);//齐次坐标
	Matrix3d m, n;

	m << 1 / sqrt(2), -1 / sqrt(2), 0,
		1 / sqrt(2), 1 / sqrt(2), 0,
		0, 0, 1;//旋转矩阵,逆时针45°
	
	n << 1, 0, 1,
		0, 1, 2,
		0, 0, 1;//平移矩阵,平移 (1,2)
	
	cout << n * m * v << endl;//先旋转后平移
	system("pause");
}

输出:
在这里插入图片描述

课后思考

老师在第四课的最后给我们留了一个问题:在透视投影的时候z轴一半距离处的图像在变换后它的z轴坐标值是向n面靠拢还是向f面靠拢了?为什么中间的坐标在变换后z轴坐标值也会改变?

首先分析透视投影的原理:
在这里插入图片描述
首先看到左边的四棱台,我们可以把平面n看作相机的成像镜头(因为得到的照片是矩形的嘛),整个四棱台就是相机的视线(即相机照片包含的空间)
在这里插入图片描述

那么这么大一个空间内的所有图像怎么投影到平面n上呢?首先想象我们从n到f平面之间划分为无数个小平面,然后把每个小平面压缩到n平面的形状,而且我们规定n平面所有点坐标不变,f平面的z轴坐标不变以及它的(0,0)点不变,这样就得到之前对照图右边的那个立方体,然后我们利用正交投影将立方体图像投影到n平面,这就是透视投影的工作原理。

从公式上来看,对于每个平面上的点,我们可以利用相似三角形来先求出x,y的坐标:

在这里插入图片描述
然后利用齐次坐标的性质同乘以一个z:
在这里插入图片描述

根据这个坐标,我们就可以求出透视投影矩阵的其中三行:
在这里插入图片描述
接下来第三行就利用n平面不变,f平面的(0,0)不变两个性质来求:
在这里插入图片描述

在这里插入图片描述那么得到了这么一个公式,我们就来求(n+f)/2处平面坐标的z轴坐标吧:

设被投影点齐次坐标为:
[x’,y’,(n+f)/2,1]

透视投影矩阵为:
(n,0,0,0)
(0,n,0,0)
(0,0,n+f,-nf)
(0,0,1,0)

相乘后得到坐标:
[nx’,ny’,(n+f)^2/2-nf,(n+f)/2]

约分后为:
[x’,y’,(n+f)/2-2nf/(n+f),1]

显而易见的,(n+f)/2-2nf/(n+f)明显要小于(n+f)/2,所以一半距离处的图像在投影后会向n平面靠拢

可是这样一番梳理下来,我们发现还是不能解决中间平面z轴坐标为什么会变的原因啊,这个其实我们可以用日常经验来解释:
在这里插入图片描述
像这么一张图片

举报

相关推荐

0 条评论