C 在我的光线跟踪器中实现反射
我试图实现反射,但我发现公式有问题 计算标准N和V,使这两个向量为一。 接下来,计算标量积N.V,以下面的公式结束计算R坐标:Rx、Ry和Rz R=-2N*V.N+V 目前我有这个,但看起来不太好: 这就是我的反思功能: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
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看起来你的球体上有一些模糊-在投射阴影或反射光线之前,你可以通过在曲面法线方向上移动交点一个小ε来解决这个问题。