C 在我的光线跟踪器中实现反射

C 在我的光线跟踪器中实现反射,c,math,raytracing,C,Math,Raytracing,我试图实现反射,但我发现公式有问题 计算标准N和V,使这两个向量为一。 接下来,计算标量积N.V,以下面的公式结束计算R坐标:Rx、Ry和Rz R=-2N*V.N+V 目前我有这个,但看起来不太好: 这就是我的反思功能: t_color reflection(t_rt *rt, t_obj *obj, t_lvector *vec, t_color tmp_color) { static int number_loop; t_vector new_vec

我试图实现反射,但我发现公式有问题

计算标准N和V,使这两个向量为一。 接下来,计算标量积N.V,以下面的公式结束计算R坐标:Rx、Ry和Rz

R=-2N*V.N+V

目前我有这个,但看起来不太好:

这就是我的反思功能:

t_color         reflection(t_rt *rt, t_obj *obj, t_lvector *vec, t_color tmp_color)
{
  static int    number_loop;
  t_vector      new_vec;
  t_vector      eye;
  t_vector      normal;
  t_color       color;
  float         scalaire;
  t_obj         *new_obj;

  if (++number_loop == 200)
    {
      number_loop = 0;
      return (tmp_color);
    }
  color.r = tmp_color.r;
  color.g = tmp_color.g;
  color.g = tmp_color.b;
  find_normal(&normal, vec, obj);
  scalaire = (rt->vec->x * normal.x) +
    (rt->vec->y * normal.y) + (rt->vec->z * normal.z);
  eye.x = vec->px;
  eye.y = vec->py;
  eye.z = vec->pz;
  new_vec.x = -2 * normal.x * scalaire + rt->vec->x;
  new_vec.y = -2 * normal.y * scalaire + rt->vec->y;
  new_vec.z = -2 * normal.z * scalaire + rt->vec->z;
  rt->vec = &new_vec;
  rt->eye = &eye;
  new_obj = find_nearest_obj(rt->obj, &eye, &new_vec);
  if (new_obj)
    color = calculate_light(rt, new_obj);
  return (color);
}
vec->pXYZ是光线击中对象的坐标

谢谢


PS:对不起,我英语不好,我是法国人。

嘿:D!我想我在这附近的Epitech从来没见过。您的
反射
函数不遵守规范(行太多)。除此之外,反射正在用眼睛替换命中坐标,并投射从命中光线和垂直于曲面的向量中获得的新光线,看到捕捉结果,您可能会遇到取整问题,或者在计算第二条光线的方向时遇到小问题,或者在“计算光”方面可能会遇到问题返回黑色,而不是实际反射对象的颜色和GG,以获得42的声誉:如果向量不是它们应该是的,或者它们不在同一坐标系中,请尝试为单光线绘制向量添加调试绘制,并查看它们是否真的是它们应该是的(V反射光线,N曲面法线,R入射光线)注意R和V应该是相反的方向!!!此外,你可能会有问题的颜色混合,每一条射线在一起,他们依赖于点积太多,光泽度等。。。
number\u循环
在重置位置看起来可疑?我只看到溢出后重置,200次递归似乎太多了我使用3-12 TOPSION看起来你的球体上有一些模糊-在投射阴影或反射光线之前,你可以通过在曲面法线方向上移动交点一个小ε来解决这个问题。