为什么我的漫反射光照在Java中错误计算?

时间:2017-11-19 00:07:13

标签: java graphics vector-graphics

我用于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

由于这是一个重大项目,因此当我如此密切关注等式时,我无法理解为什么我的实现是错误的。我已经将错误来源缩小到这段代码片段,希望有人能告诉我代码出错的地方。

我似乎无法找到错误,因为它完全遵循等式。

1 个答案:

答案 0 :(得分:0)

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

你计算L的方式给出了一个矢量从光到表面上的点;如果光线到达表面,那么点积N_dot_L而不是正 - 所以通过取Math.max它和0,你总是

要解决此问题,请在相反方向中拍摄光线矢量,即L = ((light.getPosition()).subtract(P)).normalized()