C++ 软阴影:球形区域光源

C++ 软阴影:球形区域光源,c++,graphics,geometry,raytracing,C++,Graphics,Geometry,Raytracing,我正在尝试在光线跟踪器中实现软阴影。为此,我计划从交点向区域光源发射多条阴影光线。我的目标是使用球面区域光——这意味着我需要在球体上为光线的方向向量生成随机点(回想一下,光线是用原点和方向指定的) 我四处寻找过在球体上生成均匀分布的随机点的方法,但它们似乎比我要寻找的要复杂一些。有人知道在球体上生成这些点的方法吗?我相信我的球体区域光源将简单地由其XYZ世界坐标、RGB颜色值和r半径定义 谢谢你,我很感谢你的帮助 图形宝石III,第126页: void random_unit_vector(do

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

我四处寻找过在球体上生成均匀分布的随机点的方法,但它们似乎比我要寻找的要复杂一些。有人知道在球体上生成这些点的方法吗?我相信我的球体区域光源将简单地由其XYZ世界坐标、RGB颜色值和r半径定义

谢谢你,我很感谢你的帮助

图形宝石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文章中给出的四种方法中的第二种。)


ETA:如果半径为r的球体以O为中心,并且u是一个随机单位向量,那么球体表面上的一个随机点由O+ru

给出。第4.B部分有在(半球)球面上生成点的公式。这是采样、集成等方面的一个很好的参考。

我相信您在这里解决了错误的问题;实际上,您不希望球体上有均匀的点(这将使大部分强度靠近球体的边缘),而是希望球体上有均匀的点(该点所看到的圆)。关于上述内容的更多细节如下:我们在哪里考虑球光源在世界空间中的实际位置?根据链接的MathWorld资源,这应该是单位球体,因此半径为1。但是球光源XYZ的实际位置呢,在哪里考虑到了呢?对不起,我以为你会发现这很简单!见修改后的答案。