没有合适的资源?快使用搜索试试~ 我知道了~
MIT6.837作业实验报告1
需积分: 0 0 下载量 131 浏览量
2022-08-08
23:15:57
上传
评论
收藏 1.65MB DOCX 举报
温馨提示
试读
17页
1.2 光线追踪(Assignment 1~7,核心内容)光线追踪算法的实现和优化是整个课程的核心内容 1.3 OpenGL的使用和rendering pipe
资源详情
资源评论
资源推荐
MIT 6.837 作业实验报告
1. 实验内容概述
1.1 分形(预备作业)
这是一个预备作业,不涉及到课程的核心内容。作业的具体内容是利用 IFS(Iterated
Function System)画一些自相似的分形的图形。
1.2 光线追踪(Assignment 1~7,核心内容)
光线追踪算法的实现和优化是整个课程的核心内容。其基础包括根据相机投射射线,射
线与空间物体求交,交点处利用 Phong shading 光照模型计算光照以及计算阴影。这样实现
的光线追踪不能模拟自然中光线的反射和折射,不能实现镜面或者透明的物体的效果,为解
决这一问题,改进了算法采用递归的方法,射线与物体求交后,该交点处的颜色由三部分组
成,第一部分是自身用光照模型着色的颜色,第二部分是反射光线的颜色(结果需要乘反射
的系数),第三部分是折射光线的颜色(需要乘折射的系数),这三部分组合起来才构成一个
交点的颜色。后两部分需要继续进行光线追踪,因此是一个递归的调用。
第二个改进是速度的改进。由于场景中很可能有大量三角形面片,如果每一次都全部求
交将涉及大量运算,而这些运算有很大一部分是不需要的。作业中涉及了一种优化方法,将
空间划分成均匀大小的立方体(三维网格),然后将物体放入与之相交的格子中,这样,与
一条射线有交点的物体必须存在于他经过的格子中,于是只需要对路径上的格子中的物体求
交。
除了上述改进,另外一个优化不仅仅属于光线追踪,而是对信号采样都有效的优化——
反走样。光线追踪得到的是一个二维的连续函数,这个函数根据光线追踪算法来定义,并且
作为光线追踪算法的结果其实是已经完成了光线追踪的工作了,剩下的就是将这个函数显示
出来,这就必须涉及到采样,于是立刻就有走样的问题,需要进行反走样。
1.3 OpenGL 的使用和 rendering pipeline(Assignment 3)
OpenGL 是一套图形 API,在作业中使用 OpenGL 的方式类似于传递命令,一部分函数用
来设置状态,一部分函数用于传输数据,例如顶点坐标。使用的模式一般就是,打开(或关
闭)某些开关,设置参数,传输数据。这一部分了解还比较浅,作业中也一般以基础代码的
形式提供,需要下个作业的时候更加深入学习。
渲染管线是对场景中每一个对象做变换得到屏幕空间中的对象,同时能够计算顶点的属
性值并对三角形面片进行插值计算像素。
1.4 曲线和曲面(Assignment 8)
作业中主要使用到两种曲线:Bezier 曲线和 B-spline 曲线。这两种曲线性质有一些不
同,作业中主要讨论的是两种曲线的 3 次的版本。三次 Bezier 曲线有 4 个控制点,如果需
要更多的控制,需要一段一段地拼接多条 Bezier 曲线,每两段曲线之间只共享一个点。而
且多端拼接的 Bezier 曲线只能保证 C0,如果在拼接处让控制点中心对称,可以保证 C1 连
续性,但是 C2 以及更高的连续性不能保证;B-spline 曲线也是 piece-wise 多段曲线拼接
成的,每一段有 4 个控制点,但是相邻两段曲线共享 3 个控制点,增加控制点和删除控制点
都非常方便,而且 B-spline 曲线可以保证更好的连续性。
不过实际使用的时候 Bezier 曲线由于经过第一个和最后一个控制点,因此操作起来比
较方便,相比而言,B-spline 并不经过控制点,因此调整起来比较麻烦。生成曲面的时候,
这个特征也很方便,因此 Bezier 曲线很容易拿来生成曲面。
1.5 粒子系统
粒子系统的基础是解微分方程,例如根据牛顿定律加速度是速度的导数,加速度根据人
为的定义在空间中是已知的,给定初始条件求解时刻 t 的速度就是解一个微分方程。粒子的
状态,包括某一时刻的位置、速度等其实都由微分方程的解确定。因此推动粒子系统其实就
是要计算包含状态的微分方程的解,并随时间更新这些状态。
作业中的粒子系统包括几个基本组成部分,第一是粒子生成器,粒子系统会每隔一段时
间调用例子生成器产生粒子,第二是力场,立场决定了每一个位置的加速度,因此决定了速
度,从而决定了例子的位置,最后体现在视野中的就是例子位置的移动。第三是为了近似微
分方程解使用的积分器,作业中使用到了 4 种积分器,分别是 Euler, midpoint, trapezoid
以及 Runge Kutta 积分器,他们的作用就是近似微分方程的解,而微分方程的解就描述了粒
子的状态,包括位置、速度、颜色等。
2. 原理分析
2.1 利用 IFS 画分形图形
虽然是第一个作业,但是其原理却很困难,由于这个作业本意是在熟练使用 C++,所以
这一部分忽略。
2.2 Ray Casting
Ray Casting 指的是从相机投射射线(加入反射和折射后,也可以从反射位置和折射位
置),并且求射线与场景中物体的交点。求射线是非常简单的,只需要将屏幕坐标系中的点
映射点空间中对应像平面上的点,正交投影只需要加上方向,透视投影只需要和相机位置做
减法求出方向,然后直接构造射线即可。
真正要实现的是几种 Primitive(基本几何图形)的求交算法。
2.2.1 球
球是里面最容易求交的一种几何图形了,球的方程和直线联立之后可以得到一个一元二
次方程,直接使用公式求解即可。若是判别式Δ<0,说明没有交点,如果判断式>0,有两个
交点,=0 有一个交点,也就是处于相切的位置。解出解之后需要和 tmin 作比较,tmin 指的
是合法的交点最小的 t 值,丢弃掉<tmin 的解后,如果还剩两个交点,那就需要找出较小的
一个了;或者如果解都<tmin,那么则不存在交点。
2.2.2 平面
平面一般写作 Ax+By+Cz+D=0,其实可以写成点积的形式(A,B,C)*(x,y,z)+D=0。于是将
任何一个点代入方程中就可以算出该点到平面的距离(有方向,且有系数,系数是(A,B,C)
的模长)。于是平面求交可以有很好的几何方法,将射线端点 O 代入方程除以射线的方向向
量在(A,B,C)上的投影,这个时候算出来的结果需要再反转正负号就得到了 t(这个时候问
题其实已经转化为一维的了(例如投影的位置为 x,射线的端点投影到了一维的数轴上,而
与平面的交点则在投影在数轴的原点处,所以一维问题可以直接求解,(0-x)/t,于是需要
加负号)。我认为这种方式比单纯的代数解法更有规律性。
2.2.3 三角形求交
三角形求交我使用了最直接的代数的方法,联立方程,三角形的平面可以用带有两个自
由元的方程表示,射线有一个参数 t,这样就有 3 个未知数,三个方程联立得到了一个 3 元
线性方程组,我用了最简单的高斯消元法来计算。
最后可以解出 3 个参数 t,u,v.t 和 tmin 比较判断这个点是不是在相机前方,u 和 v 用
来判断交点是不是在三角形内部,如果 u>=0,v>=0,u+v<=1,那么说明该交点在三角形内部。
上述条件都满足,才能判断有交点。
2.2.4 变换后图形的求交
基本的图形可以经过一系列变换得到其他形状或不同位置的图形。对于平移旋转这一类
的变换由于不改变形状,因此还可以将变换直接应用到图形上得到的还是原来类型的图形。
但是对于轴向不均匀的缩放,例如将圆变成椭圆的变换,就没办法直接用变换应用在图形上
然后消除变换了。
这个时候就需要反过来思考,不是在世界坐标系中用变换后的图形与直线求交,而是将
直线逆变换到物体所在的局部坐标系求交,求完了交点再变换到世界坐标系中。这里就要求
直线逆变换后得到的还是一条直线,而不能是一条曲线,而建模使用的大多数变换都是满足
这样的条件的(仿射变换)。
变换后的图形求交还有一个问题,就是法向量的计算,法向量不能通过简单在局部坐标
求出法向量然后变换到世界坐标系中。要计算两个坐标系中法向量的关系,需要进行一个简
单的推导,这里直接使用课件上的推导,如图 1.
图 1. 局部坐标系的法向量变换到世界坐标系中的推导,M 是变换
的矩阵表达,由此可见,这个矩阵必须是可逆的
2.3 Phone shading
Phong shading 光照模型其实非常简单,除了 ambient 之外,就两个部分,第一部分是
漫反射光,物体表面一个点的漫反射光只由光源的颜色和光源的方向决定,与视线方向无关,
所以有漫反射的效果;第二部分是镜面反射光,其值与光源颜色、方向以及视线的方向都有
关系,而且越接近镜面反射的角度亮度就越大,偏离该角度后,亮度下降很快,于是有光亮
镜面的效果。
这是改进后的计算镜面部分的公式,原来的公式是以理想反射光的方向为基础计算衰减
的,但是这有个问题,就是角度大与 90°时这个分量就变成 0 了,这样会影响效果;采样
这种改进的方法可以让整个 180°的范围都有值,因此更加平滑。Lo 表示镜面反射成分,h
向量是视线方向 v+光源方向 L 后向量的单位向量,q 控制光亮衰减的速度,q 越大光亮区域
就越小,q 越小光亮区域就越大,q 减为 0 就跟漫反射光的方程一样了。方程最右边
𝐿𝑖
𝑟
2
表示
光源强度是平方衰减的,这是符合物理规律的,但是实际上由于衰减太快,往往并不会使用
平方衰减。
2.4 包含反射和折射的光线追踪
自然界中广泛存在反射和折射的现象,也就是说表面的颜色不仅仅被光源照亮,有可能
他是半透明的,因此折射光对该处颜色有贡献,如果镜面,则反射光有贡献。所以这是一个
非常直接的扩展,直接将原来的光线追踪算法增加两条光线追踪这两个成分就可以了,实际
上实现起来非常简单。
2.5 光线追踪加速
作业中使用的其实是非常简单的一种空间划分方式,将场景的包围盒用三维网格来划分,
于是场景中的物体可以放入与之相交的网格中,而一次光线投射产生的直线只会与少量网格
相交,而且还有一个非常重要的性质,三维网格是空间有序的。因此如果顺着射线的方向遇
到第一个网格,那么这个网格肯定比后面格子都要靠前,于是只要交点在这个格子内部,肯
定可以宣告找到最近的交点了,而不需要继续找下去了,反之则需要继续找下一个格子。考
虑原来的无序的对象,先找到交点的对象可能反而在比较远端的位置,因此不得不遍历整个
group 才能判断最近的交点,这样就导致效率非常低。所以,这样一种序的关系对优化提供
了便利。
另一个关于投射 shadow ray 的优化作业中并没有提到,但其实可以在一定的条件下使
用。假设光源在场景的 boundingbox 之外,那么如果 shadow ray 在于网格中物体相交的过
程中发现了交点,不管这个交点在不在该网格内部,他肯定在 boundingbox 内部,所以必然
遮挡光源,而原来利用网格加速的算法,如果交点在网格外部,则需要继续判断下一个网格,
需要更多的时间才能宣告有交点。但是这个方法必须保证光源在场景的 boundingbox 外部,
如果光源在里面则可能产生错误的阴影。
剩余16页未读,继续阅读
黄浦江畔的夏先生
- 粉丝: 11
- 资源: 299
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0