正确光线追踪反射表面

Correctly raytracing reflective surfaces

我在光线追踪反射方面遇到了一些问题。

这是我期待看到的:

但这就是我实际看到的:

现在,我对如何获得新方向的基本认识 反射光线是这样的:

这是我模拟的代码:

public Color calculateIlluminationModel(Vector normal, boolean isInShadow, Scene scene, Ray ray, Vector intersectionPoint)
{
    if (isInShadow)
    {
        return getColorInShadow(scene);
    }
    else
    {
        Vector originalDirection = ray.getDirection();

        Vector reflectionVector = originalDirection
                .subtract(normal
                        .multiply(2)
                        .multiply(originalDirection.dotProduct(normal)
                        )
                )
                .normalize();
        Ray reflectionRay = Ray.translateRayByEpsilon(new Ray(intersectionPoint, reflectionVector));
        return scene.getRayColor(reflectionRay);
    }
}

但是球体似乎从来没有正确反映过任何东西。我计算反射光线的方法有问题吗?

注: scene.getRayColor(reflectionRay);是光线追踪组件,决定光线命中的颜色。我相信这不是问题,但如果您认为有必要展示那件作品,请告诉我。

您的反射数学看起来是正确的。图像看起来充满了很多阴影颜色。检查一下如果您将 isInShadow 伪造为 false 会发生什么,这应该有助于缩小范围。

同时确保你的法线指向正确的方向并且你的方向向量都被标准化(你说它们是,但如果其他人有类似的问题,值得仔细检查)。