【问题标题】:How can I compute normal on the surface of a cylinder?如何计算圆柱表面的法线?
【发布时间】:2020-12-21 19:56:00
【问题描述】:

我正在研究光线追踪器,我开始在场景中添加圆柱体。我坚持的点是在光线击中的点中找到表面法线向量。我需要这个才能进行漫射照明。我此时所拥有的是相机光线撞击圆柱体的 3d 点和实际圆柱体,该点由中心轴上的一个点定义,向量表示轴的方向和半径。所以总结一下我的问题,如何在具有圆柱碰撞点、半径、轴上的点和轴的方向向量的点中找到法向量?

【问题讨论】:

  • 你在使用 Unity 吗?还是什么语言?
  • 我正在使用 C 但在这种情况下它应该是无关紧要的
  • 好吧,有些语言可能有一个有用的内置函数。
  • 很公平 :) 但我被困在好的旧 C :))

标签: math vector-graphics raytracing lighting


【解决方案1】:

圆柱法向量从圆柱中心线开始,与光线与圆柱相交点的 z 高度相同,在径向交叉点结束。标准化它,你就有了单位法线向量。

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

【讨论】:

  • 所以基本上我只是像圆柱体完全垂直一样计算法线,然后在所述向量上使用旋转矩阵以圆柱体的角度旋转它?
  • 不需要“基本上”。圆柱坐标中的法向量;转换为全局坐标。可能会依次旋转数次。
  • 工作就像一个魅力 :) 感谢您的帮助!
【解决方案2】:

有三种可能的情况:

  1. hit_pt 位于圆柱体的 TOP CAP 上:
    if (length(hit_pt - cy.top_center) < cy.radius)
           surface_normal = cy.ori;
  1. hit_pt 位于圆柱体的底盖上:
    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)));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多