gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:55:17 26 4
gpt4 key购买 nike

我用于 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是从光源到物体的光方向 vector
  • V 是从物体到相机的方向 vector
  • R 是反射光线方向 vector ,与表面法线方向的 L 相反
  • C_diff、C_spec 和 alpha 是方程中的常数

不幸的是,SO 不允许我发布我的图片,所以我只能将其包含在链接中(见下文)。 Image of Equation

由于这是一个重大项目,当我如此严格地遵循方程式时,我无法理解为什么我的实现是错误的。我已将错误来源缩小到此代码片段,并希望有人能告诉我代码哪里出了问题。

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

最佳答案

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

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

要解决此问题,请采用相反方向的光线 vector ,即L = ((light.getPosition()).subtract(P)).normalized()

关于java - 为什么我的漫射照明在 Java 中计算错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47372442/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com