Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Graphics 球面光线跟踪_Graphics_Raytracing - Fatal编程技术网

Graphics 球面光线跟踪

Graphics 球面光线跟踪,graphics,raytracing,Graphics,Raytracing,我正在用球体进行光线跟踪。当我们解二次方程得到两个根时,我们需要取哪个值?我的理解是,我们需要取最小的值。但是,当我在计算交点和进一步的照明计算时,我得到了错误的结果。当我拿大一点的时候,它会给出正确的结果。我在网上看到了一些例子,其中一些拿的是较小的,另一些拿的是较大的。我真的很困惑哪一个是正确的,为什么是正确的。假设光线的原点是O,方向是R(理想情况下是单位向量)。然后光线由参数方程O+tR定义。将其分解为Ox+tRx、Oy+tRy和Oz+tRz。将这些替换为圆x^2+y^2+z^2=0的方

我正在用球体进行光线跟踪。当我们解二次方程得到两个根时,我们需要取哪个值?我的理解是,我们需要取最小的值。但是,当我在计算交点和进一步的照明计算时,我得到了错误的结果。当我拿大一点的时候,它会给出正确的结果。我在网上看到了一些例子,其中一些拿的是较小的,另一些拿的是较大的。我真的很困惑哪一个是正确的,为什么是正确的。

假设光线的原点是O,方向是R(理想情况下是单位向量)。然后光线由参数方程O+tR定义。将其分解为Ox+tRx、Oy+tRy和Oz+tRz。将这些替换为圆x^2+y^2+z^2=0的方程式。这就产生了一个变量为t的二次方程。求方程的根

现在,如果没有真正的根,光线就不会击中球体。如果你有一个真正的根,那么你击中了球体的一侧。如果你有两个实根,那么你击中球体两次。你想要更接近的根(更小的t),除非t是负的,在这种情况下,交点在你后面,你不在乎。如果两个根都为负值,则两个交点都位于光线原点的后面,可以忽略它们

如果将球体变换到远离原点的位置,并且您关心球体的旋转和缩放,则使用xy、yz、xz、x、y和z项,球体的方程将变得更加复杂。一般的二次曲面形状定义为Ax^2+By^2+Cy^2+Dxy+Eyz+Fxz+Gx+Hy+Jz+K=0。上述原则仍然适用。替换中的参数线方程,求解t,取最小非负根


交点是O+tR,其中t是最小的非负根。从那以后,我不知道为什么你的照明计算会被关闭。

据我所知,这篇文章是不正确的。取较大的根会使您跟踪球体的另一侧。我没有时间去真正调查,但我觉得这是不对的。像这样的例子有时看起来似乎是正确的,但事实并非如此。在POVRay中渲染相同的场景并查看它的外观将非常有趣。