GAMES101课程学习笔记1——图形学基础

前言

这篇文章主要记录GAMES101课程中一些易混淆的概念的理解。自己图形学很多知识都是自学,难免产生很多混淆与错误理解;有些当时理解对了,但随着时间的流逝,知识产生了变形和曲解;这里重新做一些梳理与记录,便于随时回顾;

Overview of Computer Graphics

课程的主要内容涵盖四个part:

  1. Rasterization;
  2. Curves and Meshes(Geometry);
  3. Ray Tracing(Rendering);
  4. Animation / Simulation(Physics);

计算机图形学(Computer Graphics,后统称CG)与计算机视觉(Computer Vision,后统称CV)的区别在于,CG创建各种模型来 生成 图片,CV从各种图片中来 识别 模型特征;

Review of Linear Algebra(线性代数回顾)

点乘在CG中的应用

针对两个向量来说:

  1. 计算两个向量的夹角(cos θ \theta θ);
  2. 计算一个向量在另一个向量的投影(向量或长度);
  3. 计算两个向量有多近(方向的一致程度);
  4. 分解一个向量(一个平行于另一个向量,一个垂直于另一个向量);
  5. 判断两个向量的同向性(点乘大于0还是小于0);

叉乘在CG中的应用

针对两个向量来说:

  1. 可以判断一个向量在另一个向量的左侧还是右侧(常用于三角形的内外判断);
  2. 可以用来获取三个互相垂直的向量;

针对一个点和两个向量来说,可以判断该点在两个向量所决定平面的里面还是外面(几何体的内外判断);

矩阵

值得注意的一点是:点乘与叉乘都可以表示成矩阵乘积的形式;
点乘相当于:
d o t ( a , b ) = ( x a , y a , z a ) ( x b y b z b ) = ( x a x b , y a y b , z a z b ) dot(a,b) = (x_a,y_a,z_a)\left(\begin{matrix} x_b\\ y_b\\ z_b \end{matrix}\right) = (x_ax_b,y_ay_b,z_az_b) dot(a,b)=(xa,ya,za)xbybzb=(xaxb,yayb,zazb)
叉乘相当于:
c r o s s ( a , b ) = ( 0 − z a y a z a 0 − x a − y a x a 0 ) ( x b y b z b ) cross(a,b) = \left(\begin{matrix} 0&-z_a&y_a\\ z_a&0&-x_a\\ -y_a&x_a&0 \end{matrix}\right)\left(\begin{matrix} x_b\\ y_b\\ z_b \end{matrix}\right) cross(a,b)=0zayaza0xayaxa0xbybzb

Transformation(变换)

Homogeneous Coordinates(齐次坐标系)

齐次坐标系可以认为是独立于笛卡尔坐标系的,另外一个坐标系统;齐次坐标将一个原本是n维的向量用一个n+1维向量来表示,常用于投影几何;
更多可以参考百度百科

齐次坐标系的用途:

  1. 既能够用来明确区分向量和点;
  2. 更易用于进行仿射(线性)几何变换。

在齐次坐标系中:

  1. 向量表示为 ( x , y , z , 0 ) (x,y,z,0) (x,y,z,0);
  2. 点表示为 ( x , y , z , 1 ) (x,y,z,1) (x,y,z,1);
  3. ( x , y , z , w ) (x,y,z,w) (x,y,z,w) ( x / w , y / w , z / w , 1 ) (x/w,y/w,z/w,1) (x/w,y/w,z/w,1)在w不为0的情况下等价;

Model、View、Projection Transformation

在实时渲染中,常用到MVP矩阵,即小标题中的Model、View、Projection矩阵;每一部分矩阵变换都含有大量的知识,课程中只介绍了基础部分,应用部分要在实际项目中才能体会到;

Model Matrix:

M矩阵没太多要求,唯一需要注意的是矩阵变换的顺序性,以及一些特殊矩阵的生成,比如Translate、Rotate、Scale、Shear、Mirror、Rotate around axis;

  • Rotate矩阵的计算可以用基向量旋转后的向量来组成,顺带帮助理解;
  • Rotate around axis矩阵的计算,课程里给了相应的公式;另外一种方法为现将axis旋转到x轴,然后绕x轴旋转相应角度,再从x旋转到axis;
  • Rotate transform常常伴随着万向节锁与旋转插值的问题,这个时候就需要用到四元数来帮忙解决;
View Martix:

V矩阵只与相机的位置和转向有关,属于相对容易计算的模块,V矩阵的计算一般先计算Translate、在计算Rotate;即V=RT;

  • 对于第一人称视角以及第三人称视角的游戏,都需要自己来计算相应的V矩阵;
  • 同样V矩阵计算时也要注意Rotate这一块的问题;
Projection Matrix:

一般P矩阵担任将物体投影到一个平面的任务,计算完后xyz应该都处于一个(-1,1)的NDC空间;
Orthographic Projection(正交投影):正交投影相对简单,先平移再缩放即可,即P=ST;
Perspective Projection(透视投影):透视投影相对较难,但是我们使用的齐次坐标系可以帮我们较为简单的解决这个问题,我们只要借助齐次坐标系统完成了Perspective到Orthographic的转换,后面就能使用正交投影的P矩阵计算即可;课程中介绍了Perspective到Orthographic转换的推导过程;

  • OpenGL Projection Matrix给出了OpenGL里面P矩阵的更为完整的推导过程;
  • 实际的图形api中在这一块中也有差异,GL的P矩阵输出的Z值范围为(-1,1);DX的P矩阵输出的Z值范围为(0,1),在开启Reverse Z的情况下为(1,0);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在这部分的课程中,我们将专注于使用光线追踪来渲染图像。在光线追踪中 最重要的操作之一就是找到光线与物体的交点。一旦找到光线与物体的交点,就 可以执行着色并返回像素颜色。在这次作业中,我们需要实现两个部分:光线的 生成和光线与三角的相交。本次代码框架的工作流程为: 1. 从 main 函数开始。我们定义场景的参数,添加物体(球体或三角形)到场景 中,并设置其材质,然后将光源添加到场景中。 2. 调用 Render(scene) 函数。在遍历所有像素的循环里,生成对应的光线并将 返回的颜色保存在帧缓冲区(framebuffer)中。在渲染过程结束后,帧缓冲 区中的信息将被保存为图像。 3. 在生成像素对应的光线后,我们调用 CastRay 函数,该函数调用 trace 来 查询光线与场景中最近的对象的交点。 4. 然后,我们在此交点执行着色。我们设置了三种不同的着色情况,并且已经 为你提供了代码。 你需要修改的函数是: • Renderer.cpp 中的 Render():这里你需要为每个像素生成一条对应的光 线,然后调用函数 castRay() 来得到颜色,最后将颜色存储在帧缓冲区的相 应像素中。 • Triangle.hpp 中的 rayTriangleIntersect(): v0, v1, v2 是三角形的三个 顶点, orig 是光线的起点, dir 是光线单位化的方向向量。 tnear, u, v 是你需 要使用我们课上推导的 Moller-Trumbore 算法来更新的参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值