C ++光线跟踪器和规范化向量

时间:2011-12-30 16:53:43

标签: c++ raytracing

到目前为止我的光线跟踪器:

  1. 如果与球体发生碰撞,则发出光线并返回新的矢量 成了

  2. 然后根据与之相撞的球体[id]的颜色添加像素颜色。

  3. 重复场景描述中的所有球体。

  4. 对于这个例子,我们说:

    sphere[0] = Light source
    sphere[1] = My actual sphere
    

    所以现在,在我的嵌套分辨率for循环中,我有一个返回的向量,它给出了当前光线与sphere[1]碰撞的xyz坐标。

    我现在想要从这个碰撞矢量位置发送一条新光线到光source sphere[0]的矢量位置,这样我就可以根据这个光的颜色/发射来更新像素的颜色。

    我已经读过我应该规范化这两点,并首先检查它们是否指向相反的方向。如果是这样,不要担心这个计算,因为它在光的阴影下。

    所以我的问题是,给定两个非标准化向量,我如何检测它们的归一化单位是否指向相反的方向?并且使用这样的点光源,由于光球上的每个点都有不同的法线方向,这怎么可能呢?这种概念在定向光下更有意义。

    此外,在我执行此检查后,我应该根据两个相对于彼此的法线角度进行阴影计算,还是应该向光源发出新光线并从那里继续?

2 个答案:

答案 0 :(得分:3)

你可以使用2个向量的点积,如果它们是相反的方向则为负数,即一个向量在另一个向量上的投影方向相反

答案 1 :(得分:2)

对于问题1,我认为你想要矢量之间的点积。

u.v = x1 * x2 + y1 * y2 + z1 * z2

如果u.v> 0然后它们之间的角度是尖锐的。

如果u.v< 0然后它们之间的角度是钝的。

如果0.v == 0,则它们指向90度角。

但我认为你真正的意思是不是规范化矢量,而是计算碰撞xyz处球体表面法线角度与光源到同一xyz角度之间的点积。

因此,如果球体的中心位于xs,ys,zs,光源位于xl,y1,zl,碰撞位于xyz,那么

向量1是x-xs,y-ys,z-zs和 载体2是xl-x,yl-y,zl-z

如果它们之间的点积是< 0然后光线射到球体的另一侧,可以丢弃。

一旦你知道这条光线照射到非阴影侧的球体,我认为你需要对眼点进行相同的计算,具体取决于光源的位置和视点。如果眼点和光源是相同的点,那么该点积的值可以用于阴影计算中。

如果眼睛和光线位于不同的位置,光线可能会到达眼睛无法看到的一个点(如果有的话,它将处于阴影中,因此会进入环境照明),因此您需要进行相同的矢量计算以取代光线源点与眼点坐标的坐标,如果点积为< 0它是可见的。

然后,根据从眼睛到表面,从表面到光线的矢量的点积来计算阴影。

好的,在我写这篇文章的时候,有人出现并编辑了这个问题,我希望答案仍然清楚。