Sample
球面采样
我们最简单的办法根据球坐标系,对\phi和\theta均匀采样,即写出这样的代码:
tuple<float, float, float> getSamplePoint(const float radius)
{
constexpr auto PI = 3.1415926F;
auto phi = PI * random(0.F, 1.F);
auto theta = PI * random(0.F, .5F);
return {
radius * sin(theta) * cos(phi),
radius * sin(theta) * sin(phi),
radius * cos(theta)
};
}
下面是一个可交互的这样采样方式的样例
但是这样得到的采样结果偏向两端,在坐标轴上的表现是更偏向z轴(蓝色)指向的两极。
在采样方法的第一节我们说过,我们可以通过偏导数+CDF反演的方式得到均匀分布。不过这里是三个变量。
我们按照相似的方法得到偏导数。
1 = \frac{1}{4\pi}\int ^{2\pi}_{0} \int^{{\pi}}_{0} sin\theta \ d\theta d\phi
对于\phi而言:
f(\phi) = \frac{1}{4\pi} \int_{0}^{\pi}sin\theta d\theta = \frac{1}{2\pi} \\
F(\phi) = \frac{x}{2\pi} \\
F^{-1}(x) = 2\pi x
对于\theta而言:
f(\theta) = \frac{sin(\theta)}{2} \\
F(\theta) = \frac{1 - cos(\theta)}{2} \\
F^{-1}(y) = arccos(1 - 2y)
三角形采样
首先说一下重心坐标。