欢迎光临散文网 会员登陆 & 注册

阿昌学习《RayTraing in one week》 (九)

2022-11-11 12:12 作者:柯昌弟弟c  | 我要投稿

第九章

前两章加入了金属材质和漫反射材质,这一章再加入一个“电解质材质”,简单点说就是水呀,玻璃呀,钻石呀这些都是电解质材质(有的翻译叫绝缘体材质),实质上就是光线在击中这个材质的时候既有折射又有反射,而书里采用方式是一跳光线击中后,随机产生一条反射或者折射光线。

因为调试过程中折射部分比较麻烦,所以先将所有的光线只发生折射,然后在两个透明的玻璃球。

书中坑人的图,一定要细看,有两处不同就会得到的结果
斯尼尔定律
光线发生折射的示意图

一些常见的折射率:空气为1.0,玻璃为1.3-1.7,钻石为2.4。

折射部分的光线R` 可以分解为垂直和水平的两个向量,这样就可以把上边的公式变为:

n / n’ * sin(theta) = sin(theta’)

这里入射夹角就是与法向量的夹角,入射光线是已知的,折射率一般也是给定的。

所以呢,就可以直接求得theta`的度数,再根据点乘公式,可以计算出折射光线了。

直接用代码来展示一下:

记得看一下里面的备注!!!一定要细看

计算折射的方法

写一个电解质材质类(这里注意一下104行,书中写的是(1,1,0),我写的是(1,1,1)这里输出的图是有区别的后):

电解质材质类

写好后,我们在主函数修改一下球的参数:


main只修改了小球的参数

接下来我介绍一下,输出的情况:

第一种:使用v和(1,1,0)的时候


左边的球是明显有黑边的

第二种:使用uv和(1,1,0)的时候

中间是浅绿色

第三种:使用uv和(1,1,1)的时候

这次才是和书中一样的结果,但使用的参数和书上的代码不同

其实我们现实中看到的玻璃是很有趣的,当你以一个很小的角度去观察玻璃的时候,他会比较像一面镜子,这个时候就要引入 —— 菲尼尔效应。

关于菲尼尔方程的介绍:菲涅尔方程(Fresnel Equation) - 王江荣的文章 - 知乎 https://zhuanlan.zhihu.com/p/375746359

他这篇文章讲解的还可以,我比较理解一些。

我是在material.h中添加这个方法

那么改写一下之前的电解质材质类:

新的电解质介质类

在主函数中添加一个新的球:

这里要半径是负数可以得到一个法线相反的球,联想一下就是得到了一个中间是空的一个气泡般的球体

添加第五个球
运行后的结果和书中一致了

这样就基本介绍完了物体相关的基础内容,接下来我们要改变一样很有趣的东西,让我们的摄像机动起来。

阿昌学习《RayTraing in one week》 (九)的评论 (共 条)

分享到微博请遵守国家法律