问题十九:怎么模拟ray tracing中漫射材料球体的颜色(diffuse materials)
前面画一个球时,球体的颜色设置为红色;
前面画多个球时,球体的颜色设置为球在该点的单位法向量的色彩表映射值;
现在画多个漫射材料的球,球体的颜色设置为背景颜色的系数倍。(姑且表述为“背景颜色”吧,将在“问题二十一”中确切说明)
漫射材料不发光,只吸收和反射环境的光(反射光的方向是随机的),所以将漫射材料的球体的颜色设置为背景颜色乘以某系数是合理的。系数怎么确定呢?光线每被反射一次*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即可。
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;}
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)。
1,起点为原点的光线撞击球C,获得撞击点P和单位法向量PS。
2,产生一个“起点在原点,长度小于1,方向随机”的向量OE。
3,OP+PS+OE-OP=PM,PM即为漫射材料的球体在P点的随机反射方向向量。
4,反射光线是以P为起点,PM为方向向量,所以,我们可以获得反射光线的方程
光线撞击球的次数=光线反射的次数è球体该像素点的颜色值对应背景颜色的系数值。
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)相关推荐
- 问题二十九:测试ray tracing中camera几个主要参数
camera(vec3 lookfrom, vec3 lookat, vec3vup, float vfov, float aspect, float aperture, float focus_di ...
- 《Ray Tracing in One Weekend》——Chapter 7: Diffuse materials
总结<Ray Tracing in One Weekend>全文 第一部分:学习总结 问题十九:怎么模拟ray tracing中漫射材料球体的颜色(diffuse materials) 当 ...
- 【genius_platform软件平台开发】第七十九讲:Linux系统中可执行程序后台运行的几种方式
[genius_platform软件平台开发]第七十九讲:Linux系统中可执行程序后台运行的几种方式 1. 问题描述 2. & 符号 3. nohup指令 4. ctrl + z.jobs. ...
- 问题二十一:怎么模拟ray tracing图形中不同材料的颜色(diffuse and metal)
在漫射材料章节,我们将多个球都模拟成漫射材料的颜色.那么问题来了,我们能不能将不同的球模拟成不同材料的颜色呢?可以哈!我们这一章节就干这事. 21.1总结一下设置颜色的几种方法 我们还是先回忆一下:r ...
- 问题三十一:ray tracing中Convex Quadrilateral Inverse Mapping
从这一章节开始,主要是学习<An Introduction to Ray Tracing> 光线和多边形相交问题的求解: 1,光线和多边形所在的平面相交,求出交点: 2,判断交点是否在多边 ...
- Vue实战篇二十九:模拟一个简易留言板
系列文章目录 Vue基础篇一:编写第一个Vue程序 Vue基础篇二:Vue组件的核心概念 Vue基础篇三:Vue的计算属性与侦听器 Vue基础篇四:Vue的生命周期(秒杀案例实战) Vue基础篇五:V ...
- IT职场人生系列之十九:危险职业(中)
这是IT职场人生系列的第十九篇.(序言,专栏目录) 这本来是危险职业的下篇,但感觉还有很多危险职业,所以留着以后写. 窄出路职业 泛指所有越走越高但越走越窄,前途无量但是需求量很少的职业,典型的是质量 ...
- Q78:规则网格(Regular Grids)——Ray Tracing中的一种加速技术
当图形中需要ray trace的物体的数目很大时(比如十万.百万.千万),这时我们就需要对图形生成的过程进行加速. 按照常规办法,需要判断每条光线和每一个物体的碰撞情况.这样一来,则需要耗费大量的时间 ...
- 问题二十四:怎么模拟ray tracing图形中介质材料的颜色(dielectric)
这里的"介质"是指光可以通过的物质.比如,水,玻璃等.也就是我们常说的具有一定透明度的物质. 24.1 预备知识 24.1.1 反射和折射光线的方向向量 反射光线的方向向量: 漫反 ...
最新文章
- pcb怎么画边框_关于PCB焊盘,你了解多少?
- poj1330Nearest Common Ancestors 1470 Closest Common Ancestors(LCA算法)
- ping: unknown host www.baidu.com问题解决
- 子网划分为什么全0全1子网号不能使用?CIDR为什么能使用全0全1子网号?
- MATLAB点云处理:读取、展示、最近邻、ICP算法求取转移矩阵、旋转
- 整理:C++中sprintf()函数的使用详解
- cmd 发送接收邮件
- 【2012百度之星/初赛下】A:度度熊就是要刷排名第一
- transition:background-color .3s 背景色 - 渐变效果
- 【BZOJ1096】仓库建设,斜率优化DP练习
- Visual Studio Code 11 月 Python 扩展更新
- Microsoft Deployment Toolkit 2008部署操作系统系列(一)
- sp_getapplock_sp_getapplock和sp_releaseapplock存储过程概述
- 10怎么读_孩子学习浑浑噩噩,做事拖拖拉拉,老是做不完作业,家长怎么办?...
- 华为荣耀计算机在哪,华为荣耀手机如何连接电脑
- 增长黑客手册——03
- 必应(bing)广告的费用是多少?bing搜索广告推广简介
- html5 sms短信发送_使用电子邮件免费向手机发送短信(SMS)
- 金蝶KIS标准版会计期间超过三期。。。
- SAP S4 库存管理 技术分享
热门文章
- 动态列从一表的数据汇总至另外一张表中
- python中的ord,chr函数
- github【如何删除一个repository(仓库)】
- if __name__ == '__main__' 如何正确理解?
- GoogLeNetV1,V2,V3
- 程序员面试金典——3.7猫狗收养所
- 【To Debug】牛客网--华为机试在线训练3:明明的随机数
- 狸猫换太子--删除无头单链表中结点
- python读取XML中bndbox和object name的方法
- Matlab二维曲线之fplot函数