《学一辈子光线追踪》 二点五五 在球面方向的MC积分

2024-04-07 20:38

本文主要是介绍《学一辈子光线追踪》 二点五五 在球面方向的MC积分,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

蒙特卡洛光线追踪技术系列 见 蒙特卡洛光线追踪技术

竟然有两个第二章,我也是很无奈啊。

在我们的光线跟踪器中,我们选择随机方向,方向可以表示为单位球体上的点。采用与之前相同的方法。但现在我们需要在二维上定义一个pdf。假设我们在所有方向上都有这个积分:

INTEGRAL( cos^2(theta) )

即我们需要计算  ∫ cos^2θdθ

通过MC积分,我们应该能够得到 cos^2(theta)/p(direction) 的样本。但在这种情况下,direction是什么?我们可以根据极坐标来计算,所以p是(theta,phi)。但是,请记住,pdf必须积分为1,并表示该方向被采样的相对概率。我们有上一本书中的一种方法,可以在一个单位的球体中取均匀的随机样本:

vec3 random_in_unit_sphere() {vec3 p;do {p = 2.0*vec3(myRandom(), myRandom(), myRandom()) - vec3(1, 1, 1);} while (dot(p, p) >= 1.0);return p;
}

为了得到单位球面上的点,我们可以将向量规格化为这些点:

vec3 random_in_unit_sphere() {vec3 p;do {p = 2.0*vec3(myRandom(), myRandom(), myRandom()) - vec3(1, 1, 1);} while (dot(p, p) >= 1.0);return unitVector(p);
}

现在这些统一的点的pdf是什么?作为单位球体上的密度,它是球体的1/面积或1/(4*Pi)。如果被积函数是cos^2(θ),θ是与z轴的夹角:

#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include "time.h"
#include "Vec3.h"#define M_PI 3.14159265double myRandom() {return rand() / (RAND_MAX + 1.0);
}vec3 random_in_unit_sphere() {vec3 p;do {p = 2.0*vec3(myRandom(), myRandom(), myRandom()) - vec3(1, 1, 1);} while (dot(p, p) >= 1.0);return unitVector(p);
}inline float pdf(const vec3&p) {return 1 / (4 * M_PI);
}int main() {srand(time(NULL));int N = 1000000;float sum = 0.0;for (int i = 0;i < N;i++) {vec3 d = random_in_unit_sphere();float cosine_squared = d.z()*d.z();sum += cosine_squared / pdf(d);}printf("I = %f \n", sum/N);system("pause");
}

得到结果:

分析答案(如果你还记得足够的高级计算,请检查我!)是(4/3)*Pi,上面的代码生成这个值。接下来,我们准备将其应用于光线跟踪!

这里的关键点是所有的积分和概率,以及所有在单位球面上的积分和概率。单位球面上的面积是如何测量方向的。称之为方向,立体角,或面积-都是一样的。立体角是常用的术语。如果你对它的理解感到很舒服,那就太好了!但如果不是,做我所做的,想象单位球面上一组方向通过的区域。立体角ω和单位球面上的投影面积A是一样的。

现在让我们继续讨论我们正在求解的光传输方程。

这篇关于《学一辈子光线追踪》 二点五五 在球面方向的MC积分的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/883613

相关文章

嵌入式方向的毕业生,找工作很迷茫

一个应届硕士生的问题: 虽然我明白想成为技术大牛需要日积月累的磨练,但我总感觉自己学习方法或者哪些方面有问题,时间一天天过去,自己也每天不停学习,但总感觉自己没有想象中那样进步,总感觉找不到一个很清晰的学习规划……眼看 9 月份就要参加秋招了,我想毕业了去大城市磨练几年,涨涨见识,拓开眼界多学点东西。但是感觉自己的实力还是很不够,内心慌得不行,总怕浪费了这人生唯一的校招机会,当然我也明白,毕业

理解分类器(linear)为什么可以做语义方向的指导?(解纠缠)

Attribute Manipulation(属性编辑)、disentanglement(解纠缠)常用的两种做法:线性探针和PCA_disentanglement和alignment-CSDN博客 在解纠缠的过程中,有一种非常简单的方法来引导G向某个方向进行生成,然后我们通过向不同的方向进行行走,那么就会得到这个属性上的图像。那么你利用多个方向进行生成,便得到了各种方向的图像,每个方向对应了很多

微积分-积分应用5.4(功)

术语“功”在日常语言中用来表示完成一项任务所需的总努力量。在物理学中,它有一个依赖于“力”概念的技术含义。直观上,你可以将力理解为对物体的推或拉——例如,一个书本在桌面上的水平推动,或者地球对球的向下拉力。一般来说,如果一个物体沿着一条直线运动,位置函数为 s ( t ) s(t) s(t),那么物体上的力 F F F(与运动方向相同)由牛顿第二运动定律给出,等于物体的质量 m m m 与其

[SWPUCTF 2021 新生赛]web方向(一到六题) 解题思路,实操解析,解题软件使用,解题方法教程

题目来源 NSSCTF | 在线CTF平台因为热爱,所以长远!NSSCTF平台秉承着开放、自由、共享的精神,欢迎每一个CTFer使用。https://www.nssctf.cn/problem   [SWPUCTF 2021 新生赛]gift_F12 这个题目简单打开后是一个网页  我们一般按F12或者是右键查看源代码。接着我们点击ctrl+f后快速查找,根据题目给的格式我们搜索c

无人机执照拿到后怎么就业?方向有哪些?就业率如何?

无人机执照拿到后,就业方向广泛且多样,就业率也呈现出逐年上升的趋势。这主要得益于无人机技术的广泛应用和无人机市场的不断扩大。以下是对无人机执照持有者就业情况的详细分析: 就业方向 1. 无人机飞行操作: 无人机飞手可以从事无人机的起飞、飞行和降落等具体操作,满足不同行业对无人机飞行的需求。 应用领域包括但不限于农业植保、电力巡线、石油管道巡线、航拍、国土资源勘查、应急救援、交通监控

UVA10010(八方向暴力枚举)

Where's Waldorf? Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu 题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18656 Description Where's Waldo

sobel_dir 方向图和sobel的一些想法

怎么使用呢! 1,通过方向图可以提取 直线 或水平线region区域,提出来的dirregion区域 2,通过sobel的幅度度,分割出变化剧烈的区域 fuduregion 3,两个region相交,可以准确定位幅度范围内+方向的边界 4,sobel算子是可以只做x,y方向的单项幅度图的,sobel_amp在一定场合有特别的用处,值得关注 5,关于大掩码超过3的size,要注意的

变速积分PID控制算法

变速积分PID控制算法 变速积分PID控制算法:变速积分PID的基本思想:变速积分的PID积分项表达式: 注:本文内容摘自《先进PID控制MATLAB仿真(第4版)》刘金琨 编著,研读此书受益匪浅,感谢作者! 变速积分PID控制算法: 在普通的PID控制算法中,由于积分系数 k i k_i ki​是常数,所以在整个控制过程中,积分增量不变。而系统对积分项的要求是,系统偏差大

梯形积分PID控制算法

梯形积分PID控制算法 梯形积分PID控制算法: 注:本文内容摘自《先进PID控制MATLAB仿真(第4版)》刘金琨 编著,研读此书受益匪浅,感谢作者! 梯形积分PID控制算法: 在PID控制律中积分项的作用是消除余差,为了减小余差,应提高积分项的运算精度,为此,可将矩形积分改为梯形积分。梯形积分的计算公式: ∫ 0 t e ( t ) d t = ∑ i = 0 k e

抗积分饱和PID控制算法

抗积分饱和PID控制算法 抗积分饱和PID控制算法:1.积分饱和现象:2.抗积分饱和算法: 注:本文内容摘自《先进PID控制MATLAB仿真(第4版)》刘金琨 编著,研读此书受益匪浅,感谢作者! 抗积分饱和PID控制算法: 1.积分饱和现象: 所谓积分饱和现象是指若系统存在一个方向偏差,PID控制器的输出由于积分作用的不断累加而加大,从而导致执行机构到达极限位置 X m