正确光线追踪反射表面
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 会发生什么,这应该有助于缩小范围。
同时确保你的法线指向正确的方向并且你的方向向量都被标准化(你说它们是,但如果其他人有类似的问题,值得仔细检查)。
我在光线追踪反射方面遇到了一些问题。
这是我期待看到的:
但这就是我实际看到的:
现在,我对如何获得新方向的基本认识
反射光线是这样的:
这是我模拟的代码:
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 会发生什么,这应该有助于缩小范围。
同时确保你的法线指向正确的方向并且你的方向向量都被标准化(你说它们是,但如果其他人有类似的问题,值得仔细检查)。