软阴影:球形区域光源

4
我正在尝试在我的光线追踪器中实现软阴影。为此,我计划从交点向区域光源射出多个阴影射线。我打算使用球形区域光 - 这意味着我需要在球面上生成随机点以作为射线方向向量(请记住,射线是用起点和方向指定的)。
我已经寻找了生成球面上均匀分布的随机点的方法,但它们似乎比我要找的更复杂。有人知道在球体上生成这些点的方法吗?我相信我的球形区域光源将简单地由其XYZ世界坐标,RGB颜色值和r半径定义。
谢谢,我很感激您的帮助!

1
我相信你在解决错误的问题;你实际上不想要球面上的均匀点(这会使大部分强度靠近球面边缘),而是想要在该点看到的圆上均匀分布的点。 - tjltjl
以上内容的更多细节请参见:https://dev59.com/YI3da4cB1Zd3GeqP1Yy2#31822904 - Miloslaw Smyk
2个回答

5

Graphics Gems 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);
}

(这是MathWorld的球面点选取文章中给出的四种方法之一。)

注:如果半径为r的球体以O为中心,并且u是一个随机单位向量,则球面上的随机点由O + r u给出。


我们在哪里考虑球形光源在世界空间中的实际位置?根据您提供的MathWorld资源,这应该是针对单位球体,因此半径为1。但是球形光源的实际位置XYZ在哪里考虑? - user1257724
抱歉:我以为你会觉得那是容易的部分!请看修订后的答案。 - Gareth Rees

0
全局光照手册中可以找到很多好的随机分布公式。第4.B.部分包含了在(半)球上生成点的公式。这是一个很好的参考资料,适用于采样、积分等方面。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接