前面画一个球时,球体的颜色设置为红色;

前面画多个球时,球体的颜色设置为球在该点的单位法向量的色彩表映射值;

现在画多个漫射材料的球,球体的颜色设置为背景颜色的系数倍。(姑且表述为“背景颜色”吧,将在“问题二十一”中确切说明)

漫射材料不发光,只吸收和反射环境的光(反射光的方向是随机的),所以将漫射材料的球体的颜色设置为背景颜色乘以某系数是合理的。系数怎么确定呢?光线每被反射一次*1/2(因为光线没被反射一次会被吸收一半)。

既然已经知道漫射材料球体的颜色和反射次数有关,那么怎么获得光线反射次数呢;

光线反射次数=光线撞击球的次数;

撞击次数由反射光线的方向和起点(前一个撞击点)决定;

第一撞击点,呵呵,容易,之前画一个球或者多个球都是根据撞击点画的(撞上了才是球嘛);

OK,现在问题归结于怎么获取反射光线的方向。

之前就说了,漫射材料的反射光线的方向是随机的,怎么模拟一个随机方向的向量呢?

在交点处单位法向量的基础上加上一个长度小于1的随机向量。

已知P为交点,PS为球C在P点的单位法向量,现在要模拟一个起点为P方向向球C外面的任何方向的向量。

书上是这么做的:

1,找一个辅助球O,该球是球心在原点的单位球体;

2,在球O里面随机找一点E或者F;(E点在球体里面,也就是向量OE的长度小于1,by the way,单位法向量PS的长度为1);

3,OP+PS=OS,OS+OE=OM,OM-OP=PM。所以,PM=OP+PS+OE-OP=PS+OE。(辅助球O选球心在原点的单位球的原因,其一,“球心在原点”,方便计算;其二,“单位球”,可以确保PM的方向不会指向球C内部)。PS是已知的,所以只要获得OE即可。

4,怎么描述“起点在原点,长度小于1,方向随机”的向量呢?书上说:We’ll use what is usually the easiest algorithm: a rejection method.First, we pick a random point in the unit cube where x, y, and z all range from-1 to +1. We reject this point and try again if the point is outside thesphere. A do/while construct is perfect for that:

    vec3 random_in_unit_sphere() {vec3 p;do {p = 2.0*vec3((rand()%(100)/(float)(100)),(rand()%(100)/(float)(100)),(rand()%(100)/(float)(100)))- vec3(1,1,1);} while (p.squared_length() >= 1.0);return p;}

Rejectionmethod是什么鬼???

先回顾一下,怎么产生(-1,1)间的随机浮点数?

x=(rand()%(100)/(float)(100))∈(0,1)推出 2x ∈(0,2)推出2x-1∈(-1,1)

所以,y= 2*x -1 = 2 * (rand()%(100)/(float)(100)) -1即为(-1,1)间的随机浮点数。

同理,向量a  = (x, y, z),b = (2x-1, 2y-1, 2z-1), 其中x,y, z ∈(0,1)

推出2x-1, 2y-1, 2z-1∈(-1,1)推出(2x-1)2+(2y-1)2+(2z-1)2∈(0,3)推出|b|∈(0, 根号3)

而我们能接受的是|b|∈(0,1),所以采取“接受——拒绝”方式:只接受|b|∈(0,1)。

所以,就有了上面那段code啦!

将流程反过来看一遍:

1,起点为原点的光线撞击球C,获得撞击点P和单位法向量PS。

2,产生一个“起点在原点,长度小于1,方向随机”的向量OE。

3,OP+PS+OE-OP=PM,PM即为漫射材料的球体在P点的随机反射方向向量。

4,反射光线是以P为起点,PM为方向向量,所以,我们可以获得反射光线的方程

5,让反射光线去撞击其他球吧(回到第一步)

光线撞击球的次数=光线反射的次数è球体该像素点的颜色值对应背景颜色的系数值。

    vec3 color(const ray& r, hitable *world) {hit_record rec;if (world->hit(r, 0.0, (numeric_limits<float>::max)(), rec)) {vec3 target = rec.p + rec.normal + random_in_unit_sphere();
/*target为上图中OM向量, target-rec.p=OM-OP=PM*/return 0.5*color( ray(rec.p, target-rec.p), world);/*撞击一次,乘以系数0.5。然后以反射光线(以P为起点,PM为方向向量)去撞击球,直到没有撞击到任何球,(下方else语句中)最后带着系数乘以背景颜色值作为球体该像素点的颜色*/}else {vec3 unit_direction = unit_vector(r.direction());float t = 0.5*(unit_direction.y() + 1.0);return (1.0-t)*vec3(1.0, 1.0, 1.0) + t*vec3(0.5, 0.7, 1.0);//white, light blue}
}

贴出运行结果图:

放大8倍看截图:

有没有觉得太黑了,反正我觉得是有问题的。

问题十九:怎么模拟ray tracing中漫射材料球体的颜色(diffuse materials)相关推荐

  1. 问题二十九:测试ray tracing中camera几个主要参数

    camera(vec3 lookfrom, vec3 lookat, vec3vup, float vfov, float aspect, float aperture, float focus_di ...

  2. 《Ray Tracing in One Weekend》——Chapter 7: Diffuse materials

    总结<Ray Tracing in One Weekend>全文 第一部分:学习总结 问题十九:怎么模拟ray tracing中漫射材料球体的颜色(diffuse materials) 当 ...

  3. 【genius_platform软件平台开发】第七十九讲:Linux系统中可执行程序后台运行的几种方式

    [genius_platform软件平台开发]第七十九讲:Linux系统中可执行程序后台运行的几种方式 1. 问题描述 2. & 符号 3. nohup指令 4. ctrl + z.jobs. ...

  4. 问题二十一:怎么模拟ray tracing图形中不同材料的颜色(diffuse and metal)

    在漫射材料章节,我们将多个球都模拟成漫射材料的颜色.那么问题来了,我们能不能将不同的球模拟成不同材料的颜色呢?可以哈!我们这一章节就干这事. 21.1总结一下设置颜色的几种方法 我们还是先回忆一下:r ...

  5. 问题三十一:ray tracing中Convex Quadrilateral Inverse Mapping

    从这一章节开始,主要是学习<An Introduction to Ray Tracing> 光线和多边形相交问题的求解: 1,光线和多边形所在的平面相交,求出交点: 2,判断交点是否在多边 ...

  6. Vue实战篇二十九:模拟一个简易留言板

    系列文章目录 Vue基础篇一:编写第一个Vue程序 Vue基础篇二:Vue组件的核心概念 Vue基础篇三:Vue的计算属性与侦听器 Vue基础篇四:Vue的生命周期(秒杀案例实战) Vue基础篇五:V ...

  7. IT职场人生系列之十九:危险职业(中)

    这是IT职场人生系列的第十九篇.(序言,专栏目录) 这本来是危险职业的下篇,但感觉还有很多危险职业,所以留着以后写. 窄出路职业 泛指所有越走越高但越走越窄,前途无量但是需求量很少的职业,典型的是质量 ...

  8. Q78:规则网格(Regular Grids)——Ray Tracing中的一种加速技术

    当图形中需要ray trace的物体的数目很大时(比如十万.百万.千万),这时我们就需要对图形生成的过程进行加速. 按照常规办法,需要判断每条光线和每一个物体的碰撞情况.这样一来,则需要耗费大量的时间 ...

  9. 问题二十四:怎么模拟ray tracing图形中介质材料的颜色(dielectric)

    这里的"介质"是指光可以通过的物质.比如,水,玻璃等.也就是我们常说的具有一定透明度的物质. 24.1 预备知识 24.1.1 反射和折射光线的方向向量 反射光线的方向向量: 漫反 ...

最新文章

  1. pcb怎么画边框_关于PCB焊盘,你了解多少?
  2. poj1330Nearest Common Ancestors 1470 Closest Common Ancestors(LCA算法)
  3. ping: unknown host www.baidu.com问题解决
  4. 子网划分为什么全0全1子网号不能使用?CIDR为什么能使用全0全1子网号?
  5. MATLAB点云处理:读取、展示、最近邻、ICP算法求取转移矩阵、旋转
  6. 整理:C++中sprintf()函数的使用详解
  7. cmd 发送接收邮件
  8. 【2012百度之星/初赛下】A:度度熊就是要刷排名第一
  9. transition:background-color .3s 背景色 - 渐变效果
  10. 【BZOJ1096】仓库建设,斜率优化DP练习
  11. Visual Studio Code 11 月 Python 扩展更新
  12. Microsoft Deployment Toolkit 2008部署操作系统系列(一)
  13. sp_getapplock_sp_getapplock和sp_releaseapplock存储过程概述
  14. 10怎么读_孩子学习浑浑噩噩,做事拖拖拉拉,老是做不完作业,家长怎么办?...
  15. 华为荣耀计算机在哪,华为荣耀手机如何连接电脑
  16. 增长黑客手册——03
  17. 必应(bing)广告的费用是多少?bing搜索广告推广简介
  18. html5 sms短信发送_使用电子邮件免费向手机发送短信(SMS)
  19. 金蝶KIS标准版会计期间超过三期。。。
  20. SAP S4 库存管理 技术分享

热门文章

  1. 动态列从一表的数据汇总至另外一张表中
  2. python中的ord,chr函数
  3. github【如何删除一个repository(仓库)】
  4. if __name__ == '__main__' 如何正确理解?
  5. GoogLeNetV1,V2,V3
  6. 程序员面试金典——3.7猫狗收养所
  7. 【To Debug】牛客网--华为机试在线训练3:明明的随机数
  8. 狸猫换太子--删除无头单链表中结点
  9. python读取XML中bndbox和object name的方法
  10. Matlab二维曲线之fplot函数