【问题标题】:Why is my diffuse illumination calculated wrongly in Java?为什么我的漫反射照明在 Java 中计算错误?
【发布时间】:2017-11-19 08:16:46
【问题描述】:

我用于 L、V 和 R 的方程式如下:

Vector3 L = (P.subtract(light.getPosition())).normalised();
Vector3 V = P.subtract(O).normalised();
Vector3 R = L.normalised().reflectIn(N.normalised()).normalised();

ColorRGB diffuse = C_diff.scale(k_d).scale(I);
double N_dot_L = N.normalised().dot(L.normalised());
N_dot_L = Math.max(0.0, N_dot_L);
diffuse = diffuse.scale(N_dot_L);

ColorRGB specular = C_spec.scale(k_s).scale(I);
double R_dot_V = R.normalised().dot(V.normalised());
R_dot_V = Math.pow(Math.max(0.0, R_dot_V), alpha);
specular = specular.scale(R_dot_V);

在哪里

  • L 是从光源到物体的光方向矢量
  • V 是从物体到相机的方向向量
  • R 是反射光线的方向矢量,与表面法线的 L 方向相反
  • C_diff 和 C_spec 以及 alpha 是方程中的常数

很遗憾,SO 不允许我发布我的图片,所以我只能将它包含在一个链接中(见下文)。 Image of Equation

由于这是一个重大项目,当我如此密切地遵循等式时,我无法理解为什么我的实现是错误的。我已将错误来源缩小到此代码 sn-p,希望有人能告诉我我的代码哪里出错了。

我似乎找不到错误,因为它完全符合方程式。

【问题讨论】:

    标签: java graphics vector-graphics


    【解决方案1】:

    问题是对N_dot_L 所需符号的误解。

    您计算L 的方式给出了一个从光到表面上的点的向量;如果光线到达表面,那么点积 N_dot_L 将是 negative 而不是正 - 因此,通过将它的 Math.max 和 0 取为 0,您将 始终 夹住它暴露在光线下的表面为零。

    要解决这个问题,请在相反方向获取光线矢量,即L = ((light.getPosition()).subtract(P)).normalized()

    【讨论】:

    • 谢谢!但是为什么光不需要去表面进行照明呢?这似乎让 L 回到了光源?
    • @user102938475 它确实需要从物理意义上浮出水面,但这不一定是数学的运作方式。在渲染中,虚构的光线从每个像素投射到表面,然后从该点投射到灯光,而在现实世界中则相反
    猜你喜欢
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    相关资源
    最近更新 更多