GAMES101-现代计算机图形学学习笔记(作业01)

Assignment 01

    • GAMES101-现代计算机图形学学习笔记(作业01)
  • 作业
    • 作业描述
    • 需要补充的函数
    • 思路
    • 结果

原课程视频链接以及官网
b站视频链接: link.
课程官网链接: link.

作业

作业描述

本次作业的任务是填写一个旋转矩阵和一个透视投影矩阵。给定三维下三个 点
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):使用给定的参数逐个元素地构建透视投影矩阵并返回该矩阵。

思路

①model 变换
model矩阵是MVP变换中的第一个矩阵,它用于将物体从自身局部坐标变换到世界坐标,题目要求实现三维中绕z轴旋转的变换矩阵和任意轴旋转的变换矩阵。
对于绕z轴旋转的变换矩阵有如下特点:
Rz(α)=(cos⁡α−sin⁡α00sin⁡αcos⁡α0000100001)\mathbf{R}_{z}(\alpha)=\left(\begin{array}{cccc} \cos \alpha & -\sin \alpha & 0 & 0 \\ \sin \alpha & \cos \alpha & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{array}\right)Rz​(α)=⎝⎜⎜⎛​cosαsinα00​−sinαcosα00​0010​0001​⎠⎟⎟⎞​

Eigen::Matrix4f get_model_matrix(float rotation_angle)
{Eigen::Matrix4f model = Eigen::Matrix4f::Identity();Eigen::Matrix4f rotate(4,4);  // z-axis rotationfloat radian = rotation_angle / 180.0 * MY_PI;rotate << cos(radian), -sin(radian), 0, 0,sin(radian), cos(radian), 0, 0,0, 0, 1, 0,0, 0, 0, 1;model = rotate * model;return model;
}

而如果想要实现任意轴旋转,我们需要先得到一个交于原点的旋转轴和旋转角度,得到了之后只需要根据轴角公式旋转即可:
R(n,α)=cos⁡(α)I+(1−cos⁡(α))nnT+sin⁡(α)(0−nznynz0−nx−nynx0)⏟N\mathbf{R}(\mathbf{n}, \alpha)=\cos (\alpha) \mathbf{I}+(1-\cos (\alpha)) \mathbf{n} \mathbf{n}^{T}+\sin (\alpha) \underbrace{\left(\begin{array}{ccc} 0 & -n_{z} & n_{y} \\ n_{z} & 0 & -n_{x} \\ -n_{y} & n_{x} & 0 \end{array}\right)}_{\mathbf{N}}R(n,α)=cos(α)I+(1−cos(α))nnT+sin(α)N⎝⎛​0nz​−ny​​−nz​0nx​​ny​−nx​0​⎠⎞​​​

Eigen::Matrix4f get_model_matrix_axis(float rotation_angle, Eigen::Vector3f axis_start, Eigen::Vector3f axis_end)
{// Eigen::Vector3f axis_start 为起点// Eigen::Vector3f axis_end 为终点Eigen::Matrix4f model = Eigen::Matrix4f::Identity();// normalize axisEigen::Vector3f axis;axis[0] = axis_end[0] - axis_start[0];axis[1] = axis_end[1] - axis_start[1];axis[2] = axis_end[2] - axis_start[2];float norm = sqrt(axis[0] * axis[0] + axis[1] * axis[1] + axis[2] * axis[2]);axis[0] /= norm;axis[1] /= norm;axis[2] /= norm;// compute radianfloat radian = rotation_angle / 180.0 * MY_PI;// compute component 计算轴角旋转矩阵分量Eigen::Matrix3f n(3, 3);n << 0, -axis[2], axis[1],axis[2], 0, -axis[0],-axis[1], axis[0], 0;Eigen::Matrix3f component1 = Eigen::Matrix3f::Identity() * cos(radian);Eigen::Matrix3f component2 = axis * axis.transpose() * (1 - cos(radian));Eigen::Matrix3f component3 = n * sin(radian);   Eigen::Matrix3f rotate_m = component1 + component2 + component3;// Eigen 自带构造轴角旋转矩阵// 下列注释用于验证我们构造的轴角旋转矩阵是否和Eigen的构造的轴角旋转矩阵一致//Eigen::AngleAxisf rotation_vector(radian, Vector3f(axis[0], axis[1], axis[2]));  //Eigen::Matrix3f rotation_matrix;//rotation_m = rotation_vector.toRotationMatrix();Eigen::Matrix4f rotate_martix = Eigen::Matrix4f::Identity();rotate_martix.block(0, 0, 3, 3) = rotate_m; // 前三个维度为旋转矩阵model = rotate_martix * model;return model;
}

②view变换
view变换用于计算相机视角,这里采用透视投影的方式,第一步先计算M_persp2ortho矩阵,用于将视锥挤压成长方体,第二步计算M_ortho,即将长方体内的坐标进行投影,最后一步通过两次变换即可计算出最终的透视投影矩阵。

Eigen::Matrix4f get_projection_matrix(float eye_fov, float aspect_ratio,float zNear, float zFar)
{Eigen::Matrix4f projection = Eigen::Matrix4f::Identity();Eigen::Matrix4f M_persp2ortho(4, 4);Eigen::Matrix4f M_ortho_scale(4, 4);Eigen::Matrix4f M_ortho_trans(4, 4);//已更正float angle = eye_fov * MY_PI / 180.0; float height = zNear * tan(angle) * 2;float width = height * aspect_ratio;auto t = -zNear * tan(angle / 2);  // 上截面auto r = t * aspect_ratio;  //右截面   auto l = -r;  // 左截面auto b = -t;  // 下截面// 透视矩阵"挤压"M_persp2ortho << zNear, 0, 0, 0,0, zNear, 0, 0,0, 0, zNear + zFar, -zNear * zFar,0, 0, 1, 0;// 正交矩阵-缩放M_ortho_scale << 2 / (r - l), 0, 0, 0,0, 2 / (t - b), 0, 0,0, 0, 2 / (zNear - zFar), 0,0, 0, 0, 1;// 正交矩阵-平移M_ortho_trans << 1, 0, 0, -(r + l) / 2,0, 1, 0, -(t + b) / 2,0, 0, 1, -(zNear + zFar) / 2,0, 0, 0, 1;Eigen::Matrix4f M_ortho = M_ortho_scale * M_ortho_trans;projection = M_ortho * M_persp2ortho * projection;return projection;
}

结果

以下依次是绕z轴旋转0/45/90度的结果:



绕任意轴旋转的结果可以通过调用get_model_matrix_axis函数实现。

GAMES101-现代计算机图形学学习笔记(作业01)相关推荐

  1. Games101计算机图形学学习笔记:线性代数-向量

    目录 一.标量与向量 1.标量 2.向量 1.向量的方向 2.向量的长度 3.向量的计算 1.向量加法 2.向量的减法 3.向量的乘法 1.点乘 1.在图形学中我们经常使用点乘来计算两个向量的夹角,比 ...

  2. 计算机图形学学习笔记——Whitted-Style Ray Tracing(GAMES101作业5讲解)

    计算机图形学学习笔记--Whitted-Style Ray Tracing GAMES101作业5讲解 遍历所有的像素生成光线 光线与平面求交 遍历所有的像素生成光线 关于作业五中如何遍历所有的像素, ...

  3. GAMES101-现代计算机图形学学习笔记(作业02)

    GAMES101-现代计算机图形学学习笔记(作业02) Assignment 02 GAMES101-现代计算机图形学学习笔记(作业02) 作业 作业描述 需要补充的函数 思路 结果 原课程视频链接以 ...

  4. GAMES101-现代计算机图形学学习笔记(作业07)

    GAMES101-现代计算机图形学学习笔记(作业07) Assignment 07 GAMES101-现代计算机图形学学习笔记(作业07) 作业 作业描述 思路 结果 原课程视频链接以及官网 b站视频 ...

  5. GAMES101-现代计算机图形学学习笔记(作业03)

    GAMES101-现代计算机图形学学习笔记(作业03) Assignment 03 GAMES101-现代计算机图形学学习笔记(作业03) 作业 作业描述 思路 原课程视频链接以及官网 b站视频链接: ...

  6. 计算机图形学 学习笔记(五):多边形裁剪(Suther land-Hodgeman),文字裁剪

    接上文 计算机图形学 学习笔记(四):直线裁剪算法:Cohen-Suther land,中点分割法,Liang-Barsky 光栅图形学算法 3.4 多边形裁剪 之前上一篇文章中,我们介绍了直线段的裁 ...

  7. 深度学习笔记:01快速构建一个手写数字识别系统以及张量的概念

    深度学习笔记:01快速构建一个手写数字识别系统 神经网络代码最好运行在GPU中,但是对于初学者来说运行在GPU上成本太高了,所以先运行在CPU中,就是慢一些. 一.安装keras框架 使用管理员模式打 ...

  8. 计算机图形学 学习笔记(七):二维图形变换:平移,比例,旋转,坐标变换等

    接上文 计算机图形学 学习笔记(六):消隐算法:Z-buffer,区间扫描线,Warnock,光栅图形学小结 在图形学中,有两大基本工具:向量分析,图形变换.本文将重点讲解向量和二维图形的变换. 5. ...

  9. 计算机图形学 学习笔记(八):三维图形变换:三维几何变换,投影变换(平行/ 透视 投影)

    接上文 计算机图形学 学习笔记(七):二维图形变换:平移,比例,旋转,坐标变换等 通过三维图形变换,可由简单图形得到复杂图形,三维图形变化则分为三维几何变换和投影变换. 6.1 三维图形几何变换 三维 ...

最新文章

  1. Xshell 配置是vi显示多种颜色
  2. linux教程期末考试,Linux-期末考试试题8套含答案.doc
  3. 第三次学JAVA再学不好就吃翔(part29)--代码块
  4. [coursera] [design] Hangman
  5. 【Python】之split()方法
  6. c程序设计停车场收费管理系统_智能车牌识别停车收费管理系统
  7. c语言求e近似值精度在10e6,中石油2013秋季学期《C语言》补考在线适用于2014年4月...
  8. P1273 有线电视网 树形dp
  9. 出现红字是电脑问题吗_苹果12还会出现信号不好的问题吗?
  10. tenorflow异常集合(自用记录)
  11. c语言秒表编程示例,求大神帮忙写一篇简单的C语言秒表程序, 谢谢。
  12. php添加开机启动脚本_php-fpm开机自动启动Shell脚本
  13. Linux 硬盘读写测速
  14. SpringCloud版本Hoxton SR5 --- 第二讲:eureka 、eureka与zookeeper的区别与使用场景。
  15. 2022年全球智能盆栽行业分析报告
  16. 【已解决】mac monterey重装系统 pkdownloaderror错误8 报错
  17. flutter 开发中问题盘锦
  18. 华为平板 M3(青春版)ROOT教程 华为平板 M3一键root步骤
  19. 利用supervisor对服务进行管理
  20. 极客时间——数据结构与算法(39) 回溯算法:从电影《蝴蝶效应》中学习回溯算法的核心思想

热门文章

  1. C语言三角分解非奇异矩阵为L、U矩阵
  2. Neo4j中的OGM(Object Graph Mapping)类似于ORM(对象关系映射)
  3. Split Pairs
  4. 秉火429笔记之十四 USART--串口通信
  5. Unbrick wr703n wifi router
  6. 关于PR安装在D盘初始化时闪退,加载到optical的时候PR直接闪退
  7. 多模态情感分析研究综述 论文笔记
  8. 应用matlab仿真几类混沌电路,典型混沌电路及分析.ppt
  9. python中使用tomorrow多线程时报错invalid syntax
  10. 三元前驱体废水除镍钴锰