我正在开发一个光线追踪器,现在要将圆柱体添加到场景中。我卡在了找到光线碰撞点的表面法向量这一步。为了实现漫反射光照效果,我需要它。目前,我已经有了相机光线与圆柱体相交处的 3D 点以及实际的圆柱体,圆柱体由轴线上的一个点、表示轴线方向的向量和半径定义。简而言之,我的问题是,在给定圆柱体碰撞点、半径、轴上一点和轴方向向量的情况下,如何找到该点的法向量。
我正在开发一个光线追踪器,现在要将圆柱体添加到场景中。我卡在了找到光线碰撞点的表面法向量这一步。为了实现漫反射光照效果,我需要它。目前,我已经有了相机光线与圆柱体相交处的 3D 点以及实际的圆柱体,圆柱体由轴线上的一个点、表示轴线方向的向量和半径定义。简而言之,我的问题是,在给定圆柱体碰撞点、半径、轴上一点和轴方向向量的情况下,如何找到该点的法向量。
圆柱体法向量始于圆柱体的中心线,与光线相交处的z轴高度相同,在径向相交点结束。将其标准化后即可得到单位法向量。
如果圆柱体的中心线不沿场景的全局z方向,则必须转换为圆柱体坐标系,计算法向量,然后将其转换回全局坐标系。
有三种可能的情况:
if (length(hit_pt - cy.top_center) < cy.radius)
surface_normal = cy.ori;
if (length(hit_pt - cy.bottom_center) < cy.radius)
surface_normal = -1 * cy.ori;
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)));