【问题标题】:Correctly raytracing reflective surfaces正确光线追踪反射表面
【发布时间】:2017-03-30 03:35:06
【问题描述】:

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

这是我期望看到的:

但这是我实际看到的:

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

这是我的模拟代码:

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); 是光线追踪组件,用于确定光线击中的颜色。我相信这不是问题,但如果您认为有必要展示该作品,请告诉我。

【问题讨论】:

  • 你确定 normal 和 originalDirection 是单位长度吗?
  • @JasonC 是的。它们都是标准化的。
  • 你确定法线从物体向外指向而不是向内吗?
  • 如果你捏造 isInShadow 总是假的,你会看到什么?
  • @JasonC 哦。呃。是的,这解决了问题。它在此图像中会反映的唯一位置将是阴影。谢谢。如果你愿意,你可以把它放在一个答案中,我会接受的。

标签: java raytracing lighting


【解决方案1】:

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

还要确保您的法线指向正确的方向,并且您的方向向量都已标准化(您说过它们是标准化的,但如果其他人遇到类似问题,则值得仔细检查)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 2018-05-31
    相关资源
    最近更新 更多