GAMES101-LAB1
文章目录
- 一、问题简述
- 二、框架准备
- 三、作业参考
- 3.1 模型矩阵
- 3.1 参考代码
- 3.2 投影矩阵
- 3.2.1 压扁操作(透视投影)
- 3.2.2 正交投影
- 3.2.3 参考代码
- 四、附件
一、问题简述
- 接下来的三次作业,将模拟一个基于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(): 自行补充你所需的其他操作
二、框架准备
- 首先需要安装OpenCV, 我选择的是OpenCV–3.4.10
- 安装过程可以参考这篇博文: https://blog.csdn.net/public669/article/details/99044895
- rasterizer.hpp 和main.cpp。其中rasterizer.hpp 文件作用是生成渲染器
界面与绘制- 可以参考我的GitHub,已添加了部分代码注释
- https://github.com/luhexin/GAMES101-LAB/tree/main/Assignment1
三、作业参考
3.1 模型矩阵

- 题目要求围绕z轴进行旋转,注意弧度制与角度制之间的转换
3.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 rotate;float radian_angle = rotation_angle / 180 * MY_PI; rotate << std::cos(radian_angle), -std::sin(radian_angle), 0, 0, std::sin(radian_angle), std::cos(radian_angle), 0, 0,0, 0, 1, 0,0, 0, 0, 1;model = model * rotate;return model;
}
3.2 投影矩阵
- 如何做透视投影?
- 压扁操作(透视投影),将锥体压为立方体
- 近平面点不变
- 远平面中心点不变,其余点向中心挤压
- 正交投影
- 平移、缩放为正交矩形
- 压扁操作(透视投影),将锥体压为立方体
3.2.1 压扁操作(透视投影)


- 近平面和远平面上点的z坐标不变,但是模型其他面上的z可能会发生改变
- 根据相似三角形(x,y,z,1) => (nx, ny, unknown, z);
-
对于任意一个点,要求有矩阵M满足: M · (x, y, z, 1)T = (nx, ny, unknown, z)T;
-
n是近平面距离相机的距离

- 由于x,y,z时变量,而矩阵M为常量矩阵,因此可以推出如上矩阵,第三行仍未知
-

- 近平面上的点(离镜头距离为n)不发生变化
- 矩阵的第三行乘以向量应该得到的是n2
- n是一个常数,所以变量x、y对应的系数为0,所以第三行是(0, 0, A, B),AB不确定

- 考虑远平面,远平面中心点(0, 0, f)不变
- f是远平面距离镜头的距离

- 联立上述方程,得到将视锥体压扁成立方体的变换矩阵
- n:近平面与相机距离;f: 远平面与相机距离
( n 0 0 0 0 n 0 0 0 0 n + f − n f 0 0 1 0 ) \left( \begin{matrix} n & 0 & 0 & 0 \\ 0 & n & 0 & 0 \\ 0 & 0 & n + f & -nf \\ 0 & 0 & 1 & 0 \end{matrix} \right) n0000n0000n+f100−nf0
- n:近平面与相机距离;f: 远平面与相机距离
3.2.2 正交投影

- 先平移、再缩放
- 这里n t f b r l是矩形各个面,距离相机(坐标原点)的距离
- 将x, y, z的范围均投射到[-1, 1],因此缩放2/…
3.2.3 参考代码
Eigen::Matrix4f get_projection_matrix(float eye_fov, float aspect_ratio,float zNear, float zFar)
{Eigen::Matrix4f projection = Eigen::Matrix4f::Identity();// TODO: Implement this function// Create the projection matrix for the given parameters.// Then return it.Eigen::Matrix4f persp_matrix;//透视矩阵 Eigen::Matrix4f translate_matrix;//移动矩阵Eigen::Matrix4f scale_matirx;//缩放矩阵persp_matrix << zNear, 0, 0, 0,0, zNear, 0, 0,0, 0, zNear + zFar, -zNear * zFar,0, 0, 1, 0;float halfAngle = eye_fov / 2 / 180 * MY_PI;float height = -2 * std::tan(halfAngle) * zNear;//没有负号则三角形上下颠倒float width = height * aspect_ratio;translate_matrix << 1, 0, 0, 0,0, 1, 0, 0, 0, 0, 1, -(zNear + zFar) / 2,0, 0, 0, 1;scale_matirx << 2 / width, 0, 0, 0,0, 2 / height, 0, 0,0, 0, 2 / (zNear - zFar), 0,0, 0, 0, 1;projection = scale_matirx * translate_matrix * persp_matrix;return projection;
}
四、附件
作业1压缩包
相关文章:
GAMES101-LAB1
文章目录 一、问题简述二、框架准备三、作业参考3.1 模型矩阵3.1 参考代码 3.2 投影矩阵3.2.1 压扁操作(透视投影)3.2.2 正交投影3.2.3 参考代码 四、附件 一、问题简述 接下来的三次作业,将模拟一个基于CPU的光栅化渲染器的简化版本本次作业的任务是实现一个旋转矩…...
Docker 编译OpenHarmony 4.0 release
一、背景介绍 1.1、环境配置 编译环境:Ubuntu 20.04OpenHarmony版本:4.0 release平台设备:RK3568 OpenHarmony 3.2更新至OpenHarmony 4.0后,公司服务器无法编译通过,总是在最后几十个文件时报错,错误码4000…...
Vue 3 表单处理精讲:打造响应式注册表单的艺术
🧙♂️ 诸位好,吾乃诸葛妙计,编程界之翘楚,代码之大师。算法如流水,逻辑如棋局。 📜 吾之笔记,内含诸般技术之秘诀。吾欲以此笔记,传授编程之道,助汝解技术难题。 &…...
浅谈Guava Cache的参数使用
CacheLoader 用于数据加载方式比较固定且统一的场景,在缓存容器创建的时候就需要指定此具体的加载逻辑。通常开发中使用时我们需要继承CacheLoader类或写一个匿名实现类实现其load方法和reload方法 load方法 当执行get操作没有命中缓存或者判断缓存已经超出expir…...
交通流预测 | Matlab基于KNN-BiLSTM的交通流预测(对比SVR、LSTM、GRU、KNN-LSTM)
目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 交通流预测 | Matlab基于KNN-BiLSTM的交通流预测(对比SVR、LSTM、GRU、KNN-LSTM) 程序设计 完整程序和数据获取方式:私信博主回复Matlab基于KNN-BiLSTM的交通流预测(对…...
云卷云舒:面向业务的智能运维(上)
1、BAIOPS-业务智能运维 智能运维(AIOps-Algorithmic IT Operations基于算法的IT运维)是人工智能技术在IT运维领域的运用,引用Gartner 的报告的一段话“到2020年,将近50%的企业将会在他们的业务和IT运维方面采用AIOps,…...
centos 7.4 docker
centos 7.4 docker 1.查看系统版本 cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core)哈1 cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) 哈1-02 cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) 哈1-22 cat /etc/redhat…...
零基础学人工智能:TensorFlow 入门例子
识别手写图片 因为这个例子是 TensorFlow 官方的例子,不会说的太详细,会加入了一点个人的理解,因为TensorFlow提供了各种工具和库,帮助开发人员构建和训练基于神经网络的模型。TensorFlow 中最重要的概念是张量(Tenso…...
go从0到1项目实战体系二一:gin框架安装
(1). 设置公用的代理服务地址: 如果设置了全局可忽略. $ export GOPROXYhttps://goproxy.io // linux > go env可以查看 $ export GOPROXYhttps://goproxy.cn // linux国内镜像 $ set GOPROXYhttps://goproxy.io // windows(2). 创建以下目录: 请忘记GOPATH目录…...
运用JavaSE知识实现图书管理系统
目录 一.Main函数二.用户类三.普通用户类四.管理员类五.图书类六.书架类七.操作类1.操作接口2.增加操作3.删除操作4.查找操作5.展示操作6.借阅操作7.归还操作8.退出系统 总结 这篇图书管理系统是对JavaSE知识总结复习的一个小作业,检测自己对知识的掌握程度。 一.Ma…...
微信小程序生成一个天气查询的小程序
微信小程序生成一个天气查询的小程序 基本的页面结构和逻辑 页面结构:包括一个输入框和一个查询按钮。 页面逻辑:在用户输入城市名称后,点击查询按钮,跳转到天气详情页面,并将城市名称作为参数传递。 主要代码 index…...
Seata源码——TCC模式解析02
初始化 在SpringBoot启动的时候通过自动注入机制将GlobalTransactionScanner注入进ioc而GlobalTransactionScanner继承AbstractAutoProxyCreatorAbstract 在postProcessAfterInitialization阶段由子类创建代理TccActionInterceptor GlobalTransactionScanner protected Obje…...
缓存-Redis
Springboot使用Redis 引入pom依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>在application.yml、application-dev.yml中配置Redis的访…...
PADS Layout安全间距检查报错
问题: 在Pads Layout完成layout后,进行工具-验证设计安全间距检查时,差分对BAK_FIXCLK_100M_P / BAK_FIXCLK_100M_N的安全间距检查报错,最小为3.94mil,但是应该大于等于5mil;如下两张图: 检查&…...
ebpf基础篇(二) ----- ebpf前世今生
bpf 要追述ebpf的历史,就不得不提bpf. bpf(Berkeley Packet Filter)从早(1992年)诞生于类Unix系统中,用于数据包分析. 它提供了数据链路层的接口,可以在数据链路层发送和接收数据.如果网卡支持混杂模式,所有的数据包都可以被接收,即使这些数据包的目的地址是其它主机. BPF最为…...
我的一天:追求专业成长与生活平衡
早晨的序幕:奋斗的开始 今天的一天始于清晨的6点47分。实现了昨天的早睡早起的蜕变计划。洗漱完成之后,7点17分出门,7点33分我抵达公司,为新的一天做好准备。7点52分,我开始我的学习之旅。正如我所体会的,“…...
【动态规划】斐波那契数列模型
欢迎来到Cefler的博客😁 🕌博客主页:那个传说中的man的主页 🏠个人专栏:题目解析 🌎推荐文章:题目大解析(3) 前言 算法原理 1.状态表示 是什么?dp表(一维数组…...
机器人运动学分析与动力学分析主要作用
机器人运动学分析和动力学分析是两个重要的概念,它们在研究和设计工业机器人时起着关键作用。 1. 机器人运动学分析: 机器人运动学是研究机器人运动的科学,它涉及机器人的位置、速度、加速度和轨迹等方面。机器人运动学分析主要包括正解和逆…...
【Java 基础】33 JDBC
文章目录 1. 数据库连接1)加载驱动2)建立连接 2. 常见操作1)创建表2)插入数据3)查询数据4)使用 PreparedStatement5)事务管理 3. 注意事项总结 Java Database Connectivity(JDBC&…...
Unity中Shader缩放矩阵
文章目录 前言一、直接相乘缩放1、在属性面板定义一个四维变量,用xyz分别控制在xyz轴上的缩放2、在常量缓存区申明该变量3、在顶点着色器对其进行相乘,来缩放变换4、我们来看看效果 二、使用矩阵乘法代替直接相乘缩放的原理1、我们按如下格式得到缩放矩阵…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
