0% found this document useful (0 votes)
14 views

Assignment 1

game101

Uploaded by

w1ingslemon
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
14 views

Assignment 1

game101

Uploaded by

w1ingslemon
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 6

作业 1: 旋转与投影

GAMES101, 2020 年春季

教授: 闫令琪
计算机图形学与混合现实研讨会

GAMES: Graphics And Mixed Environment Seminar

发布日期为北京时间 2020 年 2 月 25 日 (星期二) 上午 12:00

截止日期为北京时间 2020 年 3 月 3 日 (星期二) 上午 10:00

注意:

• 任何更新或更正都将发布在论坛上,因此请偶尔检查一下。

• 论坛链接:http://games-cn.org/forums/forum/graphics-intro/。

• 你必须独立完成自己的作业。

• 你可以在论坛上发布帖子求助,但是发布问题之前,请仔细阅读本文档。

• 在截止时间之前将你的作业提交到 SmartChair 上。

1
1 总览

到目前为止,我们已经学习了如何使用矩阵变换来排列二维或三维空间中的

对象。所以现在是时候通过实现一些简单的变换矩阵来获得一些实际经验了。在

接下来的三次作业中,我们将要求你去模拟一个基于 CPU 的光栅化渲染器的简

化版本。

本次作业的任务是填写一个旋转矩阵和一个透视投影矩阵。给定三维下三个

点 v0 (2.0, 0.0, −2.0), v1 (0.0, 2.0, −2.0), v2 (−2.0, 0.0, −2.0), 你需要将这三个点的坐

标变换为屏幕坐标并在屏幕上绘制出对应的线框三角形 (在代码框架中,我们已

经提供了 draw_triangle 函数,所以你只需要去构建变换矩阵即可)。简而言之,

我们需要进行模型、视图、投影、视口等变换来将三角形显示在屏幕上。在提供

的代码框架中,我们留下了模型变换和投影变换的部分给你去完成。

如果你对上述概念有任何不清楚或疑问,请复习课堂笔记或询问助教。

以下是你需要在 main.cpp 中修改的函数(请不要修改任何的函数名和其他

已经填写好的函数,并保证提交的代码是已经完成且能运行的):

• get_model_matrix(float rotation_angle): 逐个元素地构建模型变换矩

阵并返回该矩阵。在此函数中,你只需要实现三维中绕 z 轴旋转的变换矩阵,

而不用处理平移与缩放。

• get_projection_matrix(float eye_fov, float aspect_ratio, float

zNear, float zFar): 使用给定的参数逐个元素地构建透视投影矩阵并返回

该矩阵。

• [Optional] main(): 自行补充你所需的其他操作。

2
当你在上述函数中正确地构建了模型与投影矩阵,光栅化器会创建一个窗口

显示出线框三角形。由于光栅化器是逐帧渲染与绘制的,所以你可以使用 A 和

D 键去将该三角形绕 z 轴旋转 (此处有一项提高作业,将三角形绕任意过原点的

轴旋转)。当你按下 Esc 键时,窗口会关闭且程序终止。

另外,你也可以从命令行中运行该程序。你可以使用以下命令来运行和传递

旋转角给程序,在这样的运行方式下,是不会生成任何的窗口,输出的结果图像

会被存储在给定的文件中 (若未指定文件名,则默认存储在 output.png 中)。图

像的存储位置在可执行文件旁,所以如果你的可执行文件是在 build 文件夹中,

那么图像也会在该文件夹内。

命令行的使用命令如下:
1 ./Rasterizer // 循 环 运 行 程 序 , 创 建 一 个 窗 口 显 示 , 且 你 可 以
2 // 使 用 A 键 和 D 键 旋 转 三 角 形 。
3

4 ./Rasterizer −r 20 // 运 行 程 序 并 将 三 角 形 旋 转20度 , 然 后 将
5 // 结 果 存 在output.png 中
6

7 ./Rasterizer −r 20 image.png // 运 行 程 序 并 将 三 角 形 旋 转 20 度 ,
8 // 然 后 将 结 果 存 在image.png 中 。

2 代码框架

在本次作业中,因为你并不需要去使用三角形类,所以你需要理解与修改的

文件为:rasterizer.hpp 和 main.cpp。其中 rasterizer.hpp 文件作用是生成渲染器

界面与绘制。

光栅化器类在该程序系统中起着重要的作用,其成员变量与函数如下。

成员变量:

3
• Matrix4f model, view, projection: 三个变换矩阵。

• vector<Vector3f> frame_buf: 帧缓冲对象,用于存储需要在屏幕上绘制的

颜色数据。

成员函数:

• set_model(const Eigen::Matrix4f& m): 将内部的模型矩阵作为参数传

递给光栅化器。

• set_view(const Eigen::Matrix4f& v): 将视图变换矩阵设为内部视图矩

阵。

• set_projection(const Eigen::Matrix4f& p): 将内部的投影矩阵设为给

定矩阵 p,并传递给光栅化器

• set_pixel(Vector2f point, Vector3f color): 将屏幕像素点 (x, y) 设

为 (r, g, b) 的颜色,并写入相应的帧缓冲区位置。

在 main.cpp 中,我们模拟了图形管线。我们首先定义了光栅化器类的实例,然

后设置了其必要的变量。然后我们得到一个带有三个顶点的硬编码三角形 (请不

要修改它)。在主函数上,我们定义了三个分别计算模型、视图和投影矩阵的函数,

每一个函数都会返回相应的矩阵。接着,这三个函数的返回值会被 set_model(),

set_view() 和 set_projection() 三个函数传入光栅化器中。最后,光栅化器在

屏幕上显示出变换的结果。

在用模型、视图、投影矩阵对给定几何体进行变换后,我们得到三个顶点的

正则化空间坐标 (canonical space coordinate)。正则化空间坐标是由三个取值范围

4
在 [-1,1] 之间的 x, y, z 坐标构成。我们下一步需要做的就是视口变换,将坐标映

射到我们的屏幕中 (window_width * window_height),这些在光栅化器中都已完

成,所以不需要担心。但是,你需要去理解这步操作是如何运作的,这一点十分

重要。

3 编译

如果使用自己的系统,本次程序作业中使用到的库为 Eigen 与 OpenCV,请

确保这两个库的配置正确。

如果使用虚拟机并用 CMake 进行编译,请在终端 (命令行) 下输入以下内容:


1 mkdir build // 创 建build 文 件 夹 以 保 留 的 工 程 文 件 。
2 cd build // 进 入build 文 件 夹 。
3 cmake .. // 通 过 提 供CMakeLists.txt 文 件 的 路 径
4 // 作 为 参 数 来 运 行CMake 。
5 make −j4 // 通 过make 编 译 代 码 , −j4 表 示 通 过
6 // 4 个 内 核 进 行 并 行 化 编 译 。
7 ./Rasterizer // 运 行 代 码 。

如果没有对虚拟机的核心数进行过设置,可以在 Virtual Box 里点击“设

置”
,在弹出的窗口中选择“系统—处理器”
,然后就可以设置虚拟机的核心数了。

具体操作可见下图:

5
4 评分与提交

评分:

每次作业的评分,分为基础与提高两部分,即在作业批改时会给大家反馈两

个成绩。由于作业不是强制要求必须提交,所以在完成全部作业后,我们会统计

所有的基础分数。若基础分数及格则视为通过课程,反之视为不通过。

• [5 分] 正确构建模型矩阵。

• [5 分] 正确构建透视投影矩阵。

• [10 分] 你的代码可以在现有框架下正确运行,并能看到变换后的三角形。

• [10 分] 当按 A 键与 D 键时,三角形能正确旋转。或者正确使用命令行得

到旋转结果图像。

• [提高项 5 分] 在 main.cpp 中构造一个函数,该函数的作用是得到绕任意

过原点的轴的旋转变换矩阵。

Eigen::Matrix4f get_rotation(Vector3f axis, float angle)

提交:

当你完成作业后,请清理你的项目,记得在你的文件夹中包含 CMakeLists.txt

和所有的程序文件 (无论是否修改)。同时,请添加一个 README.md 文件写下

是否完成提高题。最后,将上述内容打包,并用“姓名_Homework1.zip”的命名

方式提交到 SmartChair 平台。

平台链接:http://smartchair.org/GAMES2020Course-YLQ

You might also like