如何计算圆柱体表面的法线?

时间:2016-03-28 16:21:37

标签: math vector-graphics raytracing lighting

我正在制作一个光线跟踪器,我开始在场景中添加柱面。我坚持的观点是在射线击中的点上找到表面法向量。我需要这个能够做漫射照明。此时我所拥有的是摄像机射线撞击圆柱体的三维点和用中心轴上的一个点定义的实际圆柱体,该矢量表示轴的方向和半径。总结一下我的问题,如何在具有圆柱击中点,半径,轴上的点和轴的方向向量的点中找到法向量?

2 个答案:

答案 0 :(得分:1)

圆柱法线向量从圆柱的中心线开始,在光线与圆柱相交的点的相同z高度处,在径向交叉点处结束。将其标准化并获得单位法线向量。

如果圆柱体中心线不是沿着场景的全局z方向,则必须转换为柱面坐标,计算法线向量,然后将其转换回全局坐标。

答案 1 :(得分:1)

三种可能的情况:

  1. hit_pt 位于圆柱体的 TOP CAP 上:
    if (length(hit_pt - cy.top_center) < cy.radius)
           surface_normal = cy.ori;
  1. hit_pt 位于圆柱体的 BOTTOM CAP 上:
    if (length(hit_pt - cy.bottom_center) < cy.radius)
            surface_normal = -1 * cy.ori;
  1. hit_pt 位于圆柱体的侧面。我们可以使用点积在圆柱体的中心线上找到点 'pt',使得向量 (hit_pt - pt) 与圆柱体的方向正交。
    t = dot((hit_pt - cy.bottom_center), cy.ori); // cy.ori should be normalized and so has the length of 1.
    pt = cy.bottom_center + t * cy.ori;
    surface_normal = normalize(hit_pt - pt)));