GAMES101:作业1记录

news2025/2/24 20:13:04

主要记录一下GAMES101作业的记录和思考。

  • 1 总览
  • 2. 代码编写
    • get_model_matrix(float rotation_angle)
    • get_projection_matrix(float eye_fov,float aspect_ratio,float zNear,f1 oat zFar)
    • 进阶代码 Eigen::Matrix4f get_model_matrix_anyaxis(Vector3f axis, float angle)
  • 3. 其他
  • 4. 最终效果

1 总览

到目前为止,我们已经学习了如何使用矩阵变换来排列二维或三维空间中的对象。所以现在是时候通过实现一些简单的变换矩阵来获得一些实际经验了。在接下来的三次作业中,我们将要求你去模拟一个基于CPU的光栅化渲染器的简化版本。

本次作业的任务是填写一个旋转矩阵和一个透视投影矩阵。给定三维下三个点 v 1 ( 2.0 , 0.0 , − 2.0 ) , v 1 ( 0.0 , 2.0 , − 2.0 ) , v 2 ( − 2.0 , 0.0 , − 2.0 ) v_1(2.0,0.0,-2.0),v_1(0.0,2.0,-2.0),v_2(-2.0,0.0,-2.0) v1(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,f1 oat zFar):使用给定的参数逐个元素地构建透视投影矩阵并返回该矩阵。

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

2. 代码编写

get_model_matrix(float rotation_angle)

三维中绕z轴旋转的变换矩阵的定义(按照要求写就行)

R = [ cos ⁡ α − sin ⁡ α 0 sin ⁡ α cos ⁡ α 0 0 0 1 ] \mathbf{R}=\begin{bmatrix}\cos\alpha & -\sin\alpha & 0\\ \sin\alpha & \cos\alpha & 0\\ 0 & 0 &1\end{bmatrix} R= cosαsinα0sinαcosα0001

代码

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 rotation_angle_rad = rotation_angle * MY_PI  / 180;
    model(0, 0) = cos(rotation_angle_rad);
    model(0, 1) = -sin(rotation_angle_rad);
    model(1, 0) = sin(rotation_angle_rad);
    model(1, 1) = cos(rotation_angle_rad); 

    return model;

}

get_projection_matrix(float eye_fov,float aspect_ratio,float zNear,f1 oat zFar)

在这里插入图片描述
在这里插入图片描述
根据Lecture5的ppt我们知道eye_fov和aspect_ratio的含义,其中:

tan ⁡ eye_fov 2 = t ∣ n ∣ \tan\frac{\text{eye\_fov}}{2} = \frac{t}{|n|} tan2eye_fov=nt

aspect_ratio = r / t \text{aspect\_ratio} = r/t aspect_ratio=r/t

我们使用投影矩阵的最后的表达式:

M per  = [ 2 n r − l 0 l + r l − r 0 0 2 n t − b b + t b − t 0 0 0 f + n n − f 2 f n f − n 0 0 1 0 ] \mathbf{M}_{\text {per }}=\left[\begin{array}{cccc} \frac{2 n}{r-l} & 0 & \frac{l+r}{l-r} & 0 \\ 0 & \frac{2 n}{t-b} & \frac{b+t}{b-t} & 0 \\ 0 & 0 & \frac{f+n}{n-f} & \frac{2 f n}{f-n} \\ 0 & 0 & 1 & 0 \end{array}\right] Mper = rl2n0000tb2n00lrl+rbtb+tnff+n100fn2fn0
要注意的是,由于作业里的zNear和zFar都是正值,和闫老师在课上讲的是负值不一样,如果直接这样最后会导致三角形最后是颠倒的(左手系和右手系的区别吧)

关于投影矩阵错误导致图形颠倒推荐看看文章:

  • 《GAMES101》作业框架问题详解

代码

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.
    float t = abs(zNear) * tan(eye_fov * MY_PI / 180);
    float r = aspect_ratio * t;
    float l = -r;
    float b = -t;
    float n = -zNear;
    float f = -zFar;
    
    projection(0, 0) = 2 * n / (r - l);
    projection(0, 2) = (l + r) / (l - r);
    projection(1, 1) = 2 * n / (t - b);
    projection(1, 2) = (b + t) / (b - t);
    projection(2, 2) = (f + n) / (n - f);
    projection(2, 3) = 2 * f * n / (f - n);
    projection(3, 2) = 1.0;
    projection(3, 3) = 0.0;
    return projection;
}

进阶代码 Eigen::Matrix4f get_model_matrix_anyaxis(Vector3f axis, float angle)

这里使用了罗德里格斯公式,任意轴的矢量为 v = [ v 1 , v 2 , v 3 ] \mathbf{v}=[v_1,v_2,v_3] v=[v1,v2,v3],旋转的角度为 θ \theta θ,罗德里格斯的旋转矩阵的公式( 3 × 3 3\times3 3×3)为:

R = I + sin ⁡ θ [ v ] + ( 1 − cos ⁡ θ ) [ v ] 2 \mathbf{R} = \mathbf{I}+\sin\theta[\mathbf{v}]+ (1-\cos\theta)[\mathbf{v}]^2 R=I+sinθ[v]+(1cosθ)[v]2

其中

[ v ] = [ 0 − v 3 v 2 v 3 0 − v 1 − v 2 v 1 0 ] [\mathbf{v}] = \begin{bmatrix}0 & -v_3 & v_2\\v_3 & 0 &-v_1\\-v_2& v_1 & 0\end{bmatrix} [v]= 0v3v2v30v1v2v10

最后我们要给让旋转矩阵扩展为 4 × 4 4\times 4 4×4的齐次变换矩阵:
T = [ R 0 3 × 1 0 1 × 3 1 ] \mathbf{T} = \begin{bmatrix}\mathbf{R} & \mathbf{0}_{3\times 1}\\\mathbf{0}_{1\times 3} & 1\end{bmatrix} T=[R01×303×11]

Eigen::Matrix4f get_model_matrix_anyaxis(Vector3f axis, float angle)
{
    Eigen::Matrix4f model = Eigen::Matrix4f::Identity();
    float rotation_angle_rad = angle * MY_PI  / 180;
    Eigen::Matrix3f R_screw;
    R_screw << 0.0, -axis.z(), axis.y(), axis.z(), 0.0, -axis.x(), -axis.y(), axis.x(), 0.0;
    Eigen::Matrix3f E = Eigen::Matrix3f::Identity();
    model.block(0,0,3,3) = E + sin(rotation_angle_rad) * R_screw + (1 - cos(rotation_angle_rad)) * R_screw * R_screw;

    return model;

}

要调用这个函数,在main函数凡是调用了绕z轴旋转函数get_model_matrix的地方都改成get_model_matrix_anyaxis函数就好了,然后记得设定旋转轴,我这里设置的是x轴 ( 1 , 0 , 0 ) (1,0,0) (1,0,0)

要改的有两个地方

在这里插入图片描述

3. 其他

在main函数里面有一个小bug,当输入3个参数的命令行:

./Rasterizer −r 20

并没有按照作业的文档说的那样生成output.png。

原来的代码:

    if (argc >= 3) {
        command_line = true;
        angle = std::stof(argv[2]); // -r by default
        if (argc == 4) {
            filename = std::string(argv[3]);
        }
        else
            return 0;
    }

修改的代码,删掉else return 0

    if (argc >= 3) {
        command_line = true;
        angle = std::stof(argv[2]); // -r by default
        if (argc == 4) {
            filename = std::string(argv[3]);
        }
    }

4. 最终效果

绕z轴旋转90度
在这里插入图片描述
绕x轴旋转90度
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/863277.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何学习嵌入式软件开发?

首先就是认知和基础阶段的学习。这部分一般都是要求学习一些行业认知类的课程&#xff0c;指导嵌入式未来的发展前景和就业趋势&#xff0c;C语言的入门&#xff0c;开发工具的使用&#xff0c;常见的命令&#xff0c;数据结构算法等内容。这一部分主要的就是要靠记忆力&#x…

odoo-034 float 浮点数比较

文章目录 前提问题解决总结 前提 odoo 版本&#xff1a;13 python&#xff1a;3.6.9 问题 比较销售订单行中已送货跟已开票&#xff0c;在 tree 视图显示搜索后的结果。发现搜索条件为已送货 > 已开票时&#xff0c;结果中会包含已送货已开票的。 解决 把这两个值打印出…

【ARM 调试】如何从 crash 信息找出问题原因

一、问题背景 粉丝在进行 ARM-A 系列软件编程时遇到以下问题&#xff0c;串口打印这段日志后就重启了&#xff0c;粉丝求助问是什么原因&#xff1f; Unhandled Exception in EL3. x30 0x0000000000b99b84 x0 0x00000000179a25b0 x1 …

【LeetCode】1572.矩阵对角线元素的和

题目 给你一个正方形矩阵 mat&#xff0c;请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1&#xff1a; 输入&#xff1a;mat [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;25 解释&#xff1a;对角线的和为&a…

『向阳花赠书活动 | 第一期』《互联网广告系统:架构、算法与智能化》

大家好&#xff0c;我是向阳花&#xff0c;数据科学路上&#xff0c;与你同行。&#x1f680; 个人主页&#xff1a;向阳花个人主页 声明&#xff1a;赠书活动是博主与出版社达成合作&#xff0c;为粉丝专属福利&#xff0c;免费参与&#xff0c;非粉丝中奖不算&#xff01; 『…

Server - WandB 统计运行 Epoch 以及 手动上传日志

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132227253 WandB (Weights & Biases) 是在线的模型训练可视化工具&#xff0c;可以帮助跟踪机器学习项目&#xff0c;记录运行中的超参数和输…

yum仓库简介

yum仓库网络服务 一.yum仓库简介二.yum配置文件2.1yum主配置文件2.2仓库设置2.3日志文件 三.yum命令详解3.1查询软件包命令3.2查询软件包组命令3.3yum安装升级3.4软件卸载 四.搭建yum仓库4.1 http方式搭建仓库 一.yum仓库简介 yum是基于RPM包构建的软件更新机制&#xff0c;能够…

从初学者到专家:Java运算符的完整指南

目录 1.算数运算符 2.增量运算符 2.1自增/自减运算符 4. 逻辑运算符 5.位运算符 6.移位运算符 7. 条件运算符 导言&#xff1a; Java作为一门广泛使用的编程语言&#xff0c;其运算符是编写代码时必不可少的一部分。本篇博客将为你详细介绍Java中的各种运算符&#xf…

【AndV】ant-design-vue中select使用mode=“combobox“无效:

文章目录 一、问题:二、解决: 一、问题: Warning: [antdv: Select] The combobox mode of Select is deprecated,it will be removed in next major version,please use AutoComplete instead 二、解决: 将mode"combobox"改为mode"SECRET_COMBOBOX_MODE_DO_NOT_…

Docker启动一个Centos镜像

搜索可用的centos的docker镜像 docker search <image>&#xff1a;在docker index中搜索imagedocker search centos 下载centos镜像&#xff08;拉取镜像&#xff09; docker pull centos:latest查看镜像docker images&#xff1a;列出imagesdocker images -a&#xff…

Paddle OCR V4 测试Demo

效果 项目 VS2022.net4.8OCRV4 代码 using OpenCvSharp; using Sdcb.PaddleInference; using Sdcb.PaddleOCR; using Sdcb.PaddleOCR.Models; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; usin…

java连接sqlserver细节处理

这个文章记录一下java连接sqlserver细节处理 &#xff0c;有其他的细节可以评论。 首先是 驱动 driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriverpom文件 将mysql的改成这个 <!-- 数据库驱动 --><dependency><groupId>com.microsoft.sqlserve…

iOS字体像素与磅的对应关系

注意&#xff1a;低于iOS10的系统&#xff0c;显示的字宽和字高比高于iOS10的系统小。 这就是iOS10系统发布时&#xff0c;很多app显示的内容后面出现…&#xff0c;因而出现很多app为了适配iOS10系统而重新发布新版本。 用PS设计的iOS效果图中&#xff0c;字体是以像素&#x…

2023年大数据与计算国际会议 (WBDC 2023)| EI、Scoups检索

会议简介 Brief Introduction 2023年大数据与计算国际会议&#xff08;WBDC 2023&#xff09; 会议时间&#xff1a;2023年11月17 -19日 召开地点&#xff1a;中国西安 大会官网&#xff1a;www.iwbdc.org 2023年大数据与计算国际会议&#xff08;WBDC 2023&#xff09;将围绕“…

PostgreSQL中根据时间段范围查询数据,如19:29:10到20:29:10范围内的数据,排除年月日

数据格式如下 问题描述 我的SQL语句条件是 WHERE (TO_CHAR(cti.binder_gen_time, YYYY-MM-DD HH:mm:ss) > 19:29:10 AND TO_CHAR(cti.binder_gen_time, YYYY-MM-DD HH:mm:ss) < 20:29:10)为什么我数据的时间是2023-07-20 17:58:29也能被查出来&#xff1f; 问题解决…

Centos7.9系统_亲测成功_磁盘满了_分区和挂载新盘_创建文件夹并挂载分区---Linux工作笔记057

由于在某些部署环境下,运维管理员,仅仅是给分配一些硬盘容量,但是并没有进行分区和挂载到对应的合适的目录下,因此这个时候就需要我们自己去处理了. 这个是自己亲测成功的:由于是后面记录的,尽量记录详细 free -h 查看一下内存情况 df -h查看 硬盘的使用情况,还有是否有没挂载…

Drools用户手册翻译——第四章 Drools规则引擎(十五)复杂事件处理(CEP)查询、事件监听、调试日志和性能调优

甩锅声明&#xff1a;本人英语一般&#xff0c;翻译只是为了做个笔记&#xff0c;所以有翻译错误的地方&#xff0c;错就错了&#xff0c;如果你想给我纠正&#xff0c;就给我留言&#xff0c;我会改过来&#xff0c;如果懒得理我&#xff0c;就直接划过即可。 Drools查询和实时…

瑞数信息《2023 API安全趋势报告》重磅发布: API攻击持续走高,Bots武器更聪明

如今API作为连接服务和传输数据的重要通道&#xff0c;已成为数字时代的新型基础设施&#xff0c;但随之而来的安全问题也日益凸显。为了让各个行业更好地应对API安全威胁挑战&#xff0c;瑞数信息作为国内首批具备“云原生API安全能力”认证的专业厂商&#xff0c;近年来持续输…

pve7.2虚拟机 lvm磁盘扩容,增加硬盘操作

之前安装pve时候只有256的ssd,最近安装的虚拟机较多&#xff0c;给加块闲置硬盘&#xff0c;顺便学习一下&#xff0c;像pve这种虚拟机系统&#xff0c;硬盘应该可以像nas你这样随时增加&#xff0c;而不影响上层应用&#xff0c;我自己也是摸索着做。 一、安装好硬盘后打开pv…

对于企业:数字化的趋势不可阻挡.以无代码开发实现敏捷交付

在科技日新月异的今天&#xff0c;我们正处在一个由数据驱动的时代。为了在这个时代中占据一席之地&#xff0c;我们需要不断探索新的开发模式&#xff0c;以适应不断变化的市场需求。其中&#xff0c;无代码开发模式正逐渐成为引领未来科技的关键。 一、什么是无代码开发 无代…