GAMES101作业1
声明:使用的是vs2022版,以下内容如有问题,感谢各位大佬指正!
作业要求:

作业目的:模拟一个基于 CPU 的光栅化渲染器的简化版本
我们需要做的:
关键词:模型、视图、投影矩阵;旋转矩阵;透视投影矩阵;屏幕坐标
1.一个在3维中绕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.
//旋转矩阵
float a = rotation_angle / 180.0 * MY_PI;
//传入的角度参数是使用角度制表示,而std三角函数接收弧度制,因此要做一个转换
model << cos(a), -sin(a), 0, 0,
sin(a), cos(a), 0, 0,
0, 0, 1, 0,
0, 0, 0, 1;
return model;
}
2.一个透视投影矩阵
分两步:
1.透视转正交

2.正交映射正则立方体中
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.
//透视矩阵先要转换为正交,然后转到正则立方体
// 1. 透视投影转为正交投影矩阵
float n = zNear;
float f = zFar;
Eigen::Matrix4f M_persp2Ortho;
M_persp2Ortho << n, 0, 0, 0,
0, n, 0, 0,
0, 0, n + f, -n * f,
0, 0, 1, 0;
//对应关系
//由于采用的是右手坐标系,相机朝着 - z 方向,所以t是负数,这样可以保证渲染出的图像方向是正确的。
float fov = eye_fov * MY_PI / 180.0;
float t = -n * tan(fov / 2.);//解决原三角倒着的方法,将t换为-t,所以在等式右边加负号
// 近平面上边缘的y坐标
float b = -t;// 近平面下边缘的y坐标(与上边缘对称)
float r = aspect_ratio * t;// 近平面右边缘的x坐标,aspect_ratio宽高比
float l = -r;// 近平面左边缘的x坐标
//转正则立方体
Eigen::Matrix4f M_ortho, trans, scale;
// 平移矩阵:将中心移至原点
trans << 1, 0, 0, -(r + l) / 2,
0, 1, 0, -(t + b) / 2,
0, 0, 1, -(n + f) / 2,
0, 0, 0, 1;
// 缩放矩阵:将长方体缩放为正则立方体
scale << 2 / (r - l), 0, 0, 0,
0, 2 / (t - b), 0, 0,
0, 0, 2 / (n - f), 0,
0, 0, 0, 1;
// 正交投影矩阵 = 缩放矩阵 × 平移矩阵
M_ortho = scale * trans;
//最终投影矩阵的合成
//矩阵相乘的顺序是从右到左,也就是先进行透视到正交的转换,再进行正交规范化处理。
projection = M_ortho * M_persp2Ortho;
return projection;
}
最后运行,得到这幅图,按AD可以左右旋转

GAMES101作业1的更多相关文章
- GAMES101作业2
作业任务: 填写并调用函数 rasterize_triangle(const Triangle& t). 即实现光栅化 该函数的内部工作流程如下: 创建三角形的 2 维 bounding bo ...
- 【UE4】GAMES101 图形学作业2:光栅化和深度缓存
总览 在上次作业中,虽然我们在屏幕上画出一个线框三角形,但这看起来并不是那么的有趣.所以这一次我们继续推进一步--在屏幕上画出一个实心三角形,换言之,栅格化一个三角形.上一次作业中,在视口变化之后,我 ...
- GAMES101课程 作业6 源代码概览
GAMES101课程 作业6 源代码概览 Written by PiscesAlpaca(双鱼座羊驼) 一.概述 本篇将从main函数为出发点,按照各cpp文件中函数的调用顺序和层级嵌套关系,简单分析 ...
- 【UE4】GAMES101 图形学作业5:光线与物体相交(球、三角面)
总览 在这部分的课程中,我们将专注于使用光线追踪来渲染图像.在光线追踪中最重要的操作之一就是找到光线与物体的交点.一旦找到光线与物体的交点,就可以执行着色并返回像素颜色. 在这次作业中,我们要实现两个 ...
- 【UE4】GAMES101 图形学作业4:贝塞尔曲线
总览 Bézier 曲线是一种用于计算机图形学的参数曲线. 在本次作业中,你需要实现de Casteljau 算法来绘制由4 个控制点表示的Bézier 曲线(当你正确实现该算法时,你可以支持绘制由更 ...
- 【UE4】GAMES101 图形学作业3:Blinn-Phong 模型与着色
总览 在这次编程任务中,我们会进一步模拟现代图形技术.我们在代码中添加了Object Loader(用于加载三维模型), Vertex Shader 与Fragment Shader,并且支持了纹理映 ...
- 【UE4】GAMES101 图形学作业1:mvp 模型、视图、投影变换
总览 到目前为止,我们已经学习了如何使用矩阵变换来排列二维或三维空间中的对象.所以现在是时候通过实现一些简单的变换矩阵来获得一些实际经验了.在接下来的三次作业中,我们将要求你去模拟一个基于CPU 的光 ...
- 【UE4】GAMES101 图形学作业0:矩阵初识
作业描述 给定一个点P=(2,1), 将该点绕原点先逆时针旋转45◦,再平移(1,2), 计算出变换后点的坐标(要求用齐次坐标进行计算). UE4 知识点 主要矩阵 FMatrix FBasisVec ...
- python10作业思路及源码:类Fabric主机管理程序开发(仅供参考)
类Fabric主机管理程序开发 一,作业要求 1, 运行程序列出主机组或者主机列表(已完成) 2,选择指定主机或主机组(已完成) 3,选择主机或主机组传送文件(上传/下载)(已完成) 4,充分使用多线 ...
- SQLServer2005创建定时作业任务
SQLServer定时作业任务:即数据库自动按照定时执行的作业任务,具有周期性不需要人工干预的特点 创建步骤:(使用最高权限的账户登录--sa) 一.启动SQL Server代理(SQL Server ...
随机推荐
- MaxKB+Ollama 离线部署
主题:在 Centos7 环境部署 MaxKB 以及 Ollama 实现基于离线大模型的的小助手调用. 选择离线部署的原因:原计划是打算直接使用 1Panel 进行 MaxKB 和 Ollama 一键 ...
- [源码系列:手写spring] IOC第九节:应用上下文ApplicationContext
内容介绍 在Spring中应用上下文ApplicationContext是相较于BeanFacotry更为先进的IOC容器,BeanFacotry是Spring实现IOC最基础最核心的接口,使得Spr ...
- 终于有人把ROS机器人操作系统讲明白了
终于有人把ROS机器人操作系统讲明白了 导读:机器人是多专业知识交叉的学科,通常涉及传感器.驱动程序.多机通信.机械结构.算法等,为了更高效地进行机器人的研究和开发,选择一个通用的开发框架非常必要,R ...
- [T.3] 团队项目:团队基础设施及 DevOps 准备
项目 内容 这个作业属于哪个课程 首页 - 2025年春季软件工程(罗杰.任健) - 北京航空航天大学 - 班级博客 - 博客园 这个作业的要求在哪里 T.3 团队项目:团队基础设施及 DevOps ...
- AIR780E引脚复用笔记
1.应用场景: 使用AIR780E模块驱动TM1637数码管驱动芯片,原有方案是AIR724UG+TM1637.为了降低成本,按照官方方案进行代码迁移. 伴随着代码迁移,硬件引脚也需要做相应调 ...
- zk源码—3.单机和集群通信原理
大纲 1.单机版的zk服务端的启动过程 (1)预启动阶段 (2)初始化阶段 2.集群版的zk服务端的启动过程 (1)预启动阶段 (2)初始化阶段 (3)Leader选举阶段 (4)Leader和Fol ...
- FastAPI中的依赖注入与数据库事务管理
title: FastAPI中的依赖注入与数据库事务管理 date: 2025/04/09 00:10:29 updated: 2025/04/09 00:10:29 author: cmdragon ...
- WPF静态资源StaticResource和动态资源DynamicResource有什么区别,x:Static又是什么意思?
什么叫WPF的资源(Resource) 资源是保存在可执行文件中的一种不可执行数据.WPF中资源用ResourceDictionary类表示,这个类就是一个字典,字典的key和value都是objec ...
- 抽象方法(abstract)、虚方法(virtual)及接口(interface)
抽象方法(abstract).虚方法(virtual)及接口(interface) 抽象方法(abstract) 定义:abstract关键词标记的方法--抽象方法 特征: 抽象方法只能定义在抽象类里 ...
- 【已解决】戴尔 Inspiron 5457 和 5557 启动报错:Invalid configuration information - please run SETUP program.
场景 我使用的是戴尔15-5557的笔记本电脑,在某次开机的时候系统提示:Invalid configuration information - please run SETUP program. 虽 ...