Sample(2.Advanced)

发布于 26 天前  50 次阅读


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)





三角形采样

首先说一下重心坐标

重心坐標

最后更新于 2024-08-26