软阴影:球面光源

4 c++ graphics geometry raytracing

我正试图在我的光线跟踪器中实现柔和阴影.为此,我计划从交叉点向区域光源拍摄多条阴影光线.我的目标是使用球面区域光 - 这意味着我需要在球体上为我的光线的方向矢量生成随机点(回想一下,光线是用原点和方向指定的).

我四处寻找在球体上生成随机点均匀分布的方法,但它们看起来比我正在寻找的要复杂一些.有谁知道在球体上生成这些点的任何方法?我相信我的球面光源将简单地由其XYZ世界坐标,RGB颜色值和r半径定义.

谢谢,我感谢你的帮助!

Gar*_*ees 5

图形宝石III,第126页:

void random_unit_vector(double v[3]) {    
    double theta = random_double(2.0 * PI);
    double x = random_double(2.0) - 1.0;
    double s = sqrt(1.0 - x * x);
    v[0] = x;
    v[1] = s * cos(theta);
    v[2] = s * sin(theta);
}
Run Code Online (Sandbox Code Playgroud)

(这是MathWorld的Sphere Point Picking文章中给出的四种方法中的第二种.)

ETA:如果半径为r的球体以O为中心,而u是随机单位向量,那么球体表面上的随机点由O + r u给出.