games101_Homework1
本次作业的任务是填写一个旋转矩阵和一个透视投影矩阵。给定三维下三个 点 v0(2.0, 0.0, −2.0), v1(0.0, 2.0, −2.0), v2(−2.0, 0.0, −2.0), 你需要将这三个点的坐 标变换为屏幕坐标,并在屏幕上绘制出对应的线框三角形 (在代码框架中,我们 已经提供了 draw_triangle 函数,所以你只需要去构建变换矩阵即可)。简而言 之,我们需要进行模型、视图、投影、视口等变换来将三角形显示在屏幕上。在 提供的代码框架中,我们留下了模型变换和投影变换的部分给你去完成。
作业解答:
作业1:get_model_matrix(float rotation_angle): 逐个元素地构建模型变换矩 阵并返回该矩阵。在此函数中,你只需要实现三维中绕 z 轴旋转的变换矩阵, 而不用处理平移与缩放。该项只要求我们传入一个旋转角度然后返回一个旋转矩阵即可。(很简单)


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. // Rz matrix is (cosa, -sina, 0, 0)(sina, cosa, 0, 0)(0, 0, 1, 0)(0, 0, 0, 1)
Eigen::Matrix4f Rz;
Rz << cos(rotation_angle / 180.0 * MY_PI), -sin(rotation_angle / 180.0 * MY_PI), 0, 0,
sin(rotation_angle / 180.0 * MY_PI), cos(rotation_angle / 180.0 * MY_PI), 0, 0,
0, 0, 1, 0,
0, 0, 0, 1; return Rz * model;
}
作业2:get_projection_matrix(float eye_fov, float aspect_ratio, float zNear, float zFar): 使用给定的参数逐个元素地构建透视投影矩阵并返回 该矩阵。该项要求通过已知条件写出投影矩阵,这个需要用到L4、L5中提到的知识,即MVP变换。


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(); // TODO: Implement this function
// Create the projection matrix for the given parameters.
// Then return it. // Get t、r、l、b by eye_fov and aspect_ration
float t = abs(zNear) * tanf(eye_fov / 2); // tan需传入角度,tanf传入一个float弧度返回一个float,此处fov/2为弧度值
float r = t * aspect_ratio;
float l = -r;
float b = -t; // Create the perspective projection matrix Mpo
Eigen::Matrix4f Mpo = Eigen::Matrix4f::Identity();;
Mpo << zNear, 0, 0, 0,
0, zNear, 0, 0,
0, 0, zNear + zFar, -(zFar * zFar),
0, 0, 1, 0; // Create the orthographic projection matrix Mor
Eigen::Matrix4f MorTran = Eigen::Matrix4f::Identity(); //Mor平移矩阵
MorTran << 1, 0, 0, -((l + r) / 2),
0, 1, 0, -((t + b) / 2),
0, 0, 1, -((zNear + zFar) / 2),
0, 0, 0, 1; Eigen::Matrix4f MorScal = Eigen::Matrix4f::Identity(); //Mor大小变换矩阵
MorScal << 2 / (r - l), 0, 0, 0, //Notice: t\r\l\b need be float
0, 2 / (t - b), 0, 0,
0, 0, 2 / (zNear - zFar), 0,
0, 0, 0, 1; projection = MorScal * MorTran * Mpo * projection;
return projection;
}
附加作业:在 main.cpp 中构造一个函数,该函数的作用是得到绕任意 过原点的轴的旋转变换矩阵。 Eigen::Matrix4f get_rotation(Vector3f axis, float angle) 。直接使用罗德里格斯公式返回一个旋转矩阵。


Eigen::Matrix4f get_rotation(Vector3f axis, float angle){
//R1 = cosa * I
Eigen::Matrix3f I = Eigen::Matrix3f::Identity();
Eigen::Matrix3f R1 = cosf(angle) * I; //R2 = (1 - cosa) * n*nT 即 (1 - cosa)* (a[0], a[1], a[2])T * (a[0], a[1], a[2])
Eigen::Matrix3f R2;
R2 << axis[0] * axis[0], axis[0] * axis[1], axis[0] * axis[2],
axis[1] * axis[0], axis[1] * axis[1], axis[1] * axis[2],
axis[2] * axis[0], axis[2] * axis[1], axis[2] * axis[2];
R2 = (1 - cosf(angle)) * R2; //R3 = sina * (0, -nz, ny)(nz, 0, -nx)(-ny, nx, 0)
Eigen::Matrix3f R3;
R3 << 0, -axis[2], axis[1],
axis[2], 0, -axis[0],
-axis[1], axis[0], 0;
R3 = sinf(angle) * R3; Eigen::Matrix3f R = R1 + R2 + R3;
Eigen::Matrix4f Res;
Res << R(0,0), R(0,1), R(0,2), 0,
R(1,0), R(1,1), R(1,2), 0,
R(2,0), R(2,1), R(2,2), 0,
0, 0, 0, 1;
return Res;
}
这里贴出绕x轴旋转效果
随机推荐
- 移动端100vh的问题与解决方案
之所以100vh在移动端出现问题,原因大致如上图,真搞不懂,为什么总是有反人类的设计出现. 经过多方参考,实测有效的方案如下: <style> :root { --vh: 1vh; } & ...
- 安装 Oh My Posh
Oh My Posh Oh My Posh 官网 安装 winget install JanDeDobbeleer.OhMyPosh -s winget Oh My Posh 更新很快,有时会被杀毒软 ...
- python pyqt6 QComboBox 设定下拉框背景颜色
设定QComboBox 的背景颜色,边框设定,以及下拉框的背景颜色以及边框设定, selection-background-color 不生效可忽略 xxx_source = QComboBox(se ...
- 总结篇4:redis 核心数据存储结构及核心业务模型实现应用场景
总结篇4:redis 核心数据存储结构及核心业务模型实现应用场景 redis 和memcached 有什么区别?为什么在高并发下,单线程的redis 比多线程的效率高? mc 可以缓存图片和视频,re ...
- TypeScript – Decorator Metadata
前言 在 TypeScript – Decorator 装饰器 里,我有提到 TypeScript 只实现了 decorate 的特性,把 metadata 的特性独立了出来. 本来我以为还需要等待很 ...
- Angular 18+ 高级教程 – Dependency Injection 依赖注入
前言 本来是想先介绍 Angular Component 的,但 Component 里面会涉及到一些 Dependency Injection (简称 DI) 的概念,所以还是先介绍 DI 吧. 温 ...
- ASP.NET Core – Work with Environment (Development, Staging, Production)
前言 这篇讲一讲发布和环境 (development, staging, production) 介绍 我的网站是 host 在 Azure 的 Virtual Machine, 跑 IIS, 没有使 ...
- 月薪20k以上的软件测试工程师的必备知识点?全部拿走吧!
我们都知道作为一个软件测试工程师,入门相对比较简单,但是要达到技术精通,甚至薪资能达到20k以上的话,那绝对需要对测试开发有一个系统的了解,以及对这些系统的知识能够熟练掌握. 今天的话是我从阿里以为做 ...
- Maven高级——依赖管理
依赖管理 依赖指向当前项目运行所需的jar包,一个项目可以设置多个依赖 依赖传递 依赖具有传递性 直接依赖:在当前项目中通过依赖配置建立的依赖关系 间接依赖:被依赖的资源如果依赖其他资源.当前项目间接 ...
- Advanced .Net Debugging 11:完结篇
一.介绍 这是我的<Advanced .Net Debugging>这个系列的第十一篇文章,也是这个系列的最后一篇了.我已经把原书的前八章内容全部写完了,本来打算继续写第九章和第十章的内容 ...