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

Math 如何计算圆柱体表面上的法线?,math,vector-graphics,raytracing,lighting,Math,Vector Graphics,Raytracing,Lighting,我正在制作光线跟踪器,我开始在场景中添加圆柱体。我的重点是在光线击中的点上找到曲面法向量。我需要这个来做漫反射照明。我在这一点上看到的是3d点,相机光线击中圆柱体,实际圆柱体由中心轴上的点定义,矢量表示轴的方向和半径。所以总结一下我的问题,我如何找到一个点的法向量,这个点有圆柱体的击中点,半径,轴上的一个点和轴的方向向量?圆柱体法向量从圆柱体的中心线开始,在射线与圆柱体相交的点的相同z高度处,在径向交点处结束。标准化它,就得到了单位法向量 如果圆柱体中心线不沿场景的全局z方向,则必须转换为圆柱体

我正在制作光线跟踪器,我开始在场景中添加圆柱体。我的重点是在光线击中的点上找到曲面法向量。我需要这个来做漫反射照明。我在这一点上看到的是3d点,相机光线击中圆柱体,实际圆柱体由中心轴上的点定义,矢量表示轴的方向和半径。所以总结一下我的问题,我如何找到一个点的法向量,这个点有圆柱体的击中点,半径,轴上的一个点和轴的方向向量?

圆柱体法向量从圆柱体的中心线开始,在射线与圆柱体相交的点的相同z高度处,在径向交点处结束。标准化它,就得到了单位法向量


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

有三种可能的情况:

  • 撞击点位于气缸的顶盖上:

  • 你在使用统一吗?或者什么语言?我用的是C,但在这种情况下它应该是无关的,有些语言可能有一个内置的函数,可能会很有用。很公平:)但我被困在了很好的旧C:)中,所以基本上我只计算法线,就像圆柱体完全垂直一样,然后在所述向量上使用旋转矩阵,以圆柱体的角度旋转它?不需要“基本上”。圆柱坐标中的法向量;转换为全局坐标。可能是顺序的几次旋转。像一个符咒一样工作:)谢谢你的帮助!
        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)));