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

为什么我的漫反射照明在Java中计算错误?,java,graphics,vector-graphics,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.

我用于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不允许我发布我的图片,因此我只能将其包含在链接中(见下文)。

由于这是一个重大项目,我无法理解为什么我的实现是错误的,当我如此接近这个等式。我已经将错误的来源缩小到了这个代码段,希望有人能告诉我我的代码哪里出错了


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

问题是对
N\u dot\u L
所需符号的误解

计算
L
的方法给出了从灯光到曲面上点的矢量;如果光线到达表面,则点积
N_dot_L
将为负而不是正-因此,通过将它的
Math.max
和0相加,对于暴露在光线下的表面,您总是将其钳制为零


要解决此问题,请将光线向量取反方向,即
L=((light.getPosition()).subtract(p)).normalized()

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

计算
L
的方法给出了从灯光到曲面上点的矢量;如果光线到达表面,则点积
N_dot_L
将为负而不是正-因此,通过将它的
Math.max
和0相加,对于暴露在光线下的表面,您总是将其钳制为零


要解决此问题,请以相反方向获取光线向量,即
L=((light.getPosition()).subtract(p)).normalized()

谢谢!但是为什么光不需要到达表面进行照明呢?这似乎让我回到了光源?@user102938475它确实需要从物理意义上回到表面,但这不一定是数学的原理。在渲染中,假想的光线从每个像素投射到表面,然后从该点投射到灯光,而在现实世界中,情况正好相反!但是为什么光不需要到达表面进行照明呢?这似乎让我回到了光源?@user102938475它确实需要从物理意义上回到表面,但这不一定是数学的原理。在渲染中,假想光线从每个像素投射到曲面,然后从该点投射到灯光,而在现实世界中则相反