GAMES101-LAB1

2023-12-24 19:44
文章标签 games101 lab1

本文主要是介绍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 投影矩阵

  • 如何做透视投影?
    1. 压扁操作(透视投影),将锥体压为立方体
      • 近平面点不变
      • 远平面中心点不变,其余点向中心挤压
    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+f100nf0

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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/532913

相关文章

GAMES101(5~6节,光栅化)

光栅化Rasterization 透视投影已知field和近平面,如何推导宽度? 根据三角函数:tan field / 2 = (height / 2) / ||n||近平面,从而可以求出高度 因为知道宽高比,所以可以求出宽度,高度 * 宽/高 视口变换 经过MVP变换,顶点位于正则化空间坐标,是一个在 [-1,1] ^3 之间的 x, y, z 坐标构成(标准立方体),我们下一步需要做

Games101学习 - 线性代数综述

1. 叉积矩阵形式 叉乘矩阵形式通常在物理模拟中有运用,处理四元数旋转也类似这样的形式。 // 定义两个向量 A 和 BFVector A(1.0f, 2.0f, 3.0f);FVector B(4.0f, 5.0f, 6.0f);// 计算叉积FVector CrossProduct = FVector::CrossProduct(A, B);if (GEngine){GEngine

GAMES101图形学笔记1

一、图形学的应用 1.游戏渲染、光照 2.电影特效 3.面部、动作捕捉,如Avatar(阿凡达)中的面部捕捉 4.设计 建筑设计,汽车设计 5.虚拟现实VR 增强现实AR 6.数码插画 笔刷 PS软件等 7.模拟、仿真 8.GUI 界面设计等 9.字体设计typography 二、为什么学习图形学 1.图形学是一门Awesome的学科,能够创造很多有意思的东西,有意思的图像 2.了解并学习一

cs144 LAB1 基于滑动窗口的碎片字节流重组器

一.StreamReassembler.capacity 的意义 StreamReassembler._capacity 的含义: ByteStream 的空间上限是 capacityStreamReassembler 用于暂存未重组字符串片段的缓冲区空间 StreamReassembler.buffer 上限也是 capacity蓝色部分代表了已经被上层应用读取的已重组数据绿色部分代

CSAPP 六个重要实验 lab1

CSAPP && lab1 --------------------------------------------------------------------实验要求-------------------------------------------------------------------- The Bit Puzzles

北京微芯区块链与边缘计算研究院使用qemu执行并调试lab1中的软件

北京微芯区块链与边缘计算研究院使用qemu执行并调试lab1中的软件。 Question1: 从CPU加电后执行的第一条指令开始,单步跟踪BIOS的执行。 Answer: 北京微芯区块链与边缘计算研究院根据附录中的说明, 修改 lab1/tools/gdbinit, set architecture i8086 target remote :1234 在 lab1目录下,执行 make deb

Games101-动画与模拟(求解常微分方程,刚体与流体)

Single Particle Simulation 规定了任何一个物体任何时刻的速度,知道它的初始位置,求它某个时间后的位置? 如果一个物体是匀速直线运动,用初始位置加上速度和时间的乘积即可 如上图,如果想描述一个粒子在一个速度场(理想的情况:只要知道位置,就知道它这个时刻的速度)中如何运动 任何一个粒子在上面的速度场会沿着类似水流的方向往前走 任何一个位置x和任何时间t,都知道有一个速度

Games101-相机与透镜

成像:光栅化成像(上图)和光线追踪成像(下图) 都是用合成的方法来成像。还可以用捕捉的方法来成像 利用小孔成像原理制作的相机就是针孔相机 如果一个相机没有针孔/透镜,是无法拍照的。 因为任何一个点都有可能收集到来自不同方向上的光。这个点本身作为传感器是不区分来自各个方向上的radiance。则各个方向上能量都被收集到一起,该点收集到的是irradiance,而不是radiance。最终所有东

Games101 光栅化笔记, 作业二

光栅化笔记 1、屏幕、像素、屏幕空间: (1)屏幕: 1、像素的二维数组 2、分辨率:数组的规模 3、典型的光栅成像设备 (2)像素的抽象理解: 1、内部颜色不会变化的小方块 2、RGB三者的颜色混合 (3)对光栅化的理解:对像素进行着色 (4)屏幕空间(在闫老师课上的规定): 1、屏幕的左下角是原点 2、x和y坐标都取整数,下图中蓝色像素坐标为(2,1) 3、像素的索引范围是(0,0)->

Games101 作业一 构建模型变换,和透视投影矩阵

知识总结:变换的流程 (1) 模型(Model)变换,pa中模型只绕z轴旋转 (2)视图(View)变换,作用是调整摄像机的位置 (3)投影(Projection)变换,pa中要求是透视投影,透视投影可看成挤压 + 正交变换 (4)视口(Viewport)变换,将投影变换所得的[-1,1]²变换到屏幕空间 代码分析: (1)获得视图变换矩阵(main.cpp) 视图变换的作用是移动摄像机,可看