我正在OpenGL/C++中编写一个程序来光线跟踪圆锥体。对于强度计算,我需要知道曲面法线。给定基准半径、高度和中心坐标,如何计算曲面法线?
我假设您需要找到曲面上给定点的法线。我进一步假设这是一个定向的圆锥体,使得底部朝下(-y轴),圆锥体的点指向上(+y轴)。如果这些条件中的任何一个都不是,我可以根据您的情况编辑我的答案。
让我们把你在表面上的点称为p,中心坐标C,半径r,高度h和法线N。
所有的点和向量都有三个分量(x,y,z),所以我会用"."来指代它们。例如,p.x是p.的x分量
首先,我们需要一个单位向量投影到从C到p的x/z平面上。
V.x=p.x-C.x
V.y=0
V.z=p.z-C.z
这个矢量有正确的方向,但幅度大于1。它还不是一个单位向量,所以我们必须相应地缩放它。
m=sqrt(V.x2+V.z2)
m现在是V的大小,我们将用它来缩放V…
V.x/=m
V.z/=m
找到法线的最终计算是。。。
N.x=V.x*h/r
N.y=r/h
N.z=V.z*h/r
如果你的圆锥体面朝下,并且有一个开口角(α),则以(+z)上的h为基准。你可以在con的顶部选择你的co-system。这意味着圆锥体在尖的部分是平衡的。
在这种情况下,可以导出该曲面的法线分量的通用表达式。
步骤1:
表示法向i球面坐标(e_r,e_θ,e_φ),其中所有分量都是单位向量,θ被定义为方位角。
结果-->e_θ(θ==α,φ)
如果你使用这种形状的其他性质,比如磁化强度M或磁通量。人们可以很容易地转换这个i柱坐标。
步骤2:
θ=-sin(θ)e_z+cos(θ)es(φ),其中θ==α。