赞
踩
预备知识:线性代数、高等数学
目录
2D变换
缩放
拉伸
旋转
变换都可写成矩阵形式
对于2D有
2D_point=(x,y,1)^T
2D_vector=(x,y,0)^T
对于3D有
3D_point=(x,y,z,1)^T
3D_vector=(x,y,z,0)^T
3D齐次坐标表示
将虚拟世界中以(x,y,z)为坐标的物体变换到 以一个个像素位置(x,y) 来表示的屏幕坐标系之中(2维)
模型变换:旋转,平移,缩放
摄像机变换:
相机或眼睛位置 (eye postion) e
观察方向 (gaze postion) g
视点正上方向 (view-up vector ) t
投影变换
正交投影:坐标的相对位置都不会改变,全部转换到一个的空间之中
透视投影:透视投影就是最类似人眼所看东西的方式,遵循近大远小
先压缩后正交投影,变换矩阵为:
最后将将这个被压缩过的空间,重新正交投影成标准小立方体,故定义透视投影变换:
补充:视图变换
模型变换(modeling tranformation):将一个物体自身进行变换(缩放、旋转、位移)
视角变换(view tranformation):根据眼睛来判断物体的相对位置
投影变换(projection tranformation):将三维空间内的物体投影至标准二维平面([-1,1]^2)之上
视口变换(viewport transformation):将处于标准平面映射到屏幕分辨率范围之内,即[-1,1]^2→\rightarrow→[0,width]*[0,height], 其中width和height指屏幕分辨率大小
旋转变换:
视口变换:
games101 作业1
- Eigen::Matrix4f get_model_matrix(float rotation_angle)
- {
- Eigen::Matrix4f model = Eigen::Matrix4f::Identity();
-
- // TODO: Implement this function
- // Create the model matrix for rotating the triangle around the Z axis.
- // Then return it.
- Eigen::Matrix4f tran;
- float angle = rotation_angle / 180.0 * MY_PI;
- tran << cos(angle), -1 * sin(angle), 0, 0,
- sin(angle), cos(angle), 0, 0,
- 0, 0, 1, 0,
- 0, 0, 0, 1;
- model = tran * model;
-
- return model;
- }
-
- Eigen::Matrix4f get_projection_matrix(float eye_fov, float aspect_ratio,
- float zNear, float zFar)
- {
- // Students will implement this function
-
- Eigen::Matrix4f projection = Eigen::Matrix4f::Identity();
- Eigen::Matrix4f per2orth;
- per2orth << zNear, 0, 0, 0,
- 0, zNear, 0, 0,
- 0, 0, zNear + zFar, -zNear * zFar,
- 0, 0, 1, 0;
- float angle = eye_fov * MY_PI / 180.0;
- float t = zNear * tan(angle / 2.0);
- float b = -t;
- float r = t * aspect_ratio;
- float l = -r;
-
- Eigen::Matrix4f orth;
- orth << 2.0 / (r - l), 0, 0, 0,
- 0, 2.0 / (t - b), 0, 0,
- 0, 0, 2 / (zNear - zFar), 0,
- 0, 0, 0, 1;
- Eigen::Matrix4f trans;
- trans << 1, 0, 0, -(r + l) / 2.0,
- 0, 1, 0, -(t + b) / 2.0,
- 0, 0, 1, -(zNear + zFar) / 2.0,
- 0, 0, 0, 1;
- projection = projection * orth * trans * per2orth;
-
- // TODO: Implement this function
- // Create the projection matrix for the given parameters.
- // Then return it.
-
-
- return projection;
- }
光栅化的目的就是将想要展现的物体给真正现实到屏幕上的过程
屏幕中的每一个像素点我们都用整数坐标进行表示,最大最小值与分辨率相对应,考虑到每个像素都有一定的面积,我们定义(x+0.5,y+0.5)为该(x,y)像素的中心,如图中黑圈所示。
像素:
1)是一个一个的小的方块.
2)每个方块内的颜色是完全一致的,像素就是最小的单位了,像素内部不会再发生变化。
3)我们用256个等级0-255来表示灰度(如等级0表示是黑的,等级255表示是白的),一个像素内的颜色可以用
rgb(red,green,blue)三个值来定义,用红绿蓝的各种组合来表示每一种红色蓝色绿色的密度,例如红色是(255,0,0),白色是(255,255,255)。4)一个像素内颜色不会发生任何差异。
屏幕空间就是以屏幕左下角为原点建立一个二维坐标系
1)用(x,y)表示像素的位置。(蓝色像素表示为(2,1)坐标来表示)
2)如果一个屏幕分辨率为width * height,那么我们定义像素下标从(0,0)到(width - 1,height - 1),
且(x,y)像素的中心在(x + 0.5, y + 0.5),如蓝色像素的中心为(2.5,1.5)。
3)屏幕范围从(0,0)到(width,height)
现在我们要将一个中心在坐标原点,棱长为2的立方体显示在长为height、宽为width的屏幕中
具体操作要进行一次视口变换,准确地说是通过缩放与平移变换,
光栅化就是考虑如何将图像呈现在光栅显示器中.般将图像拆分成许多不同的三角形
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。