光线跟踪smallpt详解 (二)
来源:互联网 发布:穿衣打扮知乎 编辑:程序博客网 时间:2024/05/16 06:53
本文主要是为了记录我学习smallpt的过程。第一部分是关于整个程序的大致分解。第二部分主要说一下我对main函数中cx和cy的理解。第三部分主要说明光线跟踪的每一行代码所用到的数学知识。
本文主要说一下自己的理解,
关于smallpt的cx,cy是怎么来的,是用来做什么的?
1. 透视投影的原理
如果是小孔成像的话,我们应该是投影在z=-d的平面上,但是这样做涉及到负值操作,还使图像反了。如果我们将投影平面移到z = d,这样做就可以避免负值问题。(但是有个问题就是,物体在摄像机和z=d平面之间的物体,电脑就无法绘制了)
2. cx和cy的定义
及计算光线d的代码
Vec d = cx*(((sx + .5 + dx) / 2 + x) / w - .5) + cy*(((sy + .5 + dy) / 2 + y) / h - .5) + cam.d;
其中sx,sy是[0,1],dx,dy的范围是[-1,1],dx,dy的分布函数
所以(sx + .5 + dx) / 2这个的值得范围是[-0.25, 0.75]。这个值主要是为了在随机采样时,对x进行偏移。我们如果把他忽略不计。
那么(((sx + .5 + dx) / 2 + x) / w - .5)的值其实是在[-0.5, 0.5]的。
当x = w-1, y = 0时,
(0.5*cx)+(-0.5*cy)+cam.d是为了计算最大角度的射出光线。
图例1, 如果我们的cx = (w / h)
图例2, 如果我们的cx = (w/h *0.5135),我们的最大角度肯定比图例1小。
3. 验证结果
我的理解是:
0.5135这个参数就是为了设置视角大小的。
作者计算好了角度之后,才这样设置的。
例子1
double testVal = 1.0;double cx = Vec(w*.testVal / h), cy = (cx.cross(cam.d)).norm()*.testVal;
例子2
double testVal = 0.5135;double cx = Vec(w*.testVal / h), cy = (cx.cross(cam.d)).norm()*.testVal;
double testVal = 0.2;double cx = Vec(w*.testVal / h), cy = (cx.cross(cam.d)).norm()*.testVal;
0 0
- 光线跟踪smallpt详解 (二)
- 光线跟踪smallpt详解 (一)
- 光线跟踪smallpt详解 (三)
- 光线跟踪
- 光线跟踪作业
- 光线跟踪的算法
- CUDA 交互式光线跟踪
- 光线跟踪程序
- 光线跟踪的基本原理
- 光线跟踪进阶版
- 光线跟踪的算法
- 光线跟踪算法
- 光线跟踪之简介
- CG_Assignment_光线跟踪之光线散射
- 光线投射算法与光线跟踪算法
- 光线投射与光线跟踪算法归纳
- 光线跟踪引擎做到了
- 读《光线跟踪算法技术》
- nextLine()和next()方法
- JDBC随记
- 公约数和公倍数
- 廖雪峰Python教程学习笔记三-高级特性
- Jquery FormData文件异步上传 快速指南
- 光线跟踪smallpt详解 (二)
- 报错No mapping found for HTTP request with URI、实现蒙纱,弹出对话框利用load 、编码问题、 jQ的data绑定数据等等遇到的问题
- 交换整数的奇数位和偶数位
- CentOS6.5 JAVA-JDK安装
- 智能指针:auto_ptr 和 scoped_ptr
- 编译PHP5.6 提示configure: error: GD build test failed. Please check the config.log for details.
- ceph ceph.conf 配置流程
- USB实现(1)-Ti AM335x系列CPU
- 辗转相除法