我正在尝试在raytracer中实现柔和的阴影。为此,我计划从交叉点向面光源发射多条阴影射线。我的目标是使用球面光-这意味着我需要在球体上为射线的方向 vector 生成随机点(请注意,射线是用原点和方向指定的)。
我一直在寻找在球体上生成随机点均匀分布的方法,但是它们似乎比我要寻找的要复杂。有人知道在球体上生成这些点的任何方法吗?我相信我的球面光源将仅由其XYZ世界坐标,RGB颜色值和r半径定义。
我从Graphics Gems III(第126页)中引用了此代码(这也是讨论here和here的相同方法):
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);
}
很好,我理解这一点,但是我的球面光源将位于3D X-Y-Z坐标和半径指定的空间中的某个点。我了解该公式适用于单位球体,但是我不确定该公式如何说明球体的位置。
谢谢,我感谢您的帮助!
最佳答案
您似乎对生成方向的公式(即球体上的一个点)与试图生成方向/ toward /球体的事实感到困惑。
您提供的公式均匀地采样了一条随机射线:它在单位球面上找到一个X,Y,Z三元组,可以将其视为方向。
您实际尝试实现的是仍然生成一个方向(球体上的一个点),但是偏向于指向球体(或仅限于圆锥体)的特定方向,即您从相机中心获得的圆锥体和球形光源的轮廓)。
这样的事情可以通过两种方式完成:
在第一种情况下,公式在“全局照明附录”中给出:
http://people.cs.kuleuven.be/~philip.dutre/GI/TotalCompendium.pdf
(第21页的项目38)。
在第二种情况下,您可以进行一些拒绝采样,但是我敢肯定,有一些近似形式的公式。
最后,还有最后一个选择:您可以使用公式,将结果(X,Y,Z)作为场景中的一个点,然后将其转换为球体的位置,并从相机指向一个 vector 朝着它。但是,这将带来严重的问题:
关于c++ - 柔和阴影的球面光源,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13785541/