Java 正确光线跟踪反射表面

Java 正确光线跟踪反射表面,java,raytracing,lighting,Java,Raytracing,Lighting,我在光线跟踪反射方面遇到了一些问题 以下是我期待看到的: 但这是我实际看到的: 现在,我基本了解了如何获得新的发展方向 反射光线是这样的: 以下是我的模拟代码: public Color calculateIlluminationModel(Vector normal, boolean isInShadow, Scene scene, Ray ray, Vector intersectionPoint) { if (isInShadow) { return

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

以下是我期待看到的:

但这是我实际看到的:

现在,我基本了解了如何获得新的发展方向 反射光线是这样的:

以下是我的模拟代码:

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是假的会发生什么,这应该有助于缩小范围


还要确保法线指向正确的方向,并且方向向量都已规格化(你说是的,但如果其他人有类似问题,则值得再次检查)。

你确定法线和原始方向是单位长度吗?@JasonC是的。它们都是标准化的。你确定法线指向对象的外面而不是里面吗?如果你把isInShadow捏造成总是假的,你看到了什么?@JasonC-Oh。嗯。是的,这解决了问题。它在这幅图像中唯一能反射的地方就是阴影。谢谢如果你愿意,你可以把它写在一个答案里,我会接受的。