垂直于圆锥体的曲面

par*_*rth 2 graphics

我用 OpenGL/C++ 编写一个程序来对圆锥体进行光线追踪。对于我的强度计算,我需要知道表面法线。给定基础半径、高度和中心坐标,如何计算表面法线?

Voi*_*tar 6

我假设您需要在给定表面上的点的情况下找到表面的法线。我进一步假设这是一个圆锥体,其底座朝下(-y 轴),圆锥体的尖端朝上(+y 轴)。如果不符合这些条件,我可以编辑我的答案以适合您的情况。

我们将曲面上的点称为 P,中心坐标为 C,半径为 r,高度为 h,法线为 N。

所有点和向量都具有三个分量(x、y、z),因此我将使用“.”来引用它们。例如 Px 是 P 的 x 分量。

首先,我们需要一个投影到 x/z 平面上的单位向量,该向量从 C 指向 P。

V.x = P.x - C.x
V.y = 0
V.z = P.z - C.z
Run Code Online (Sandbox Code Playgroud)

该向量具有正确的方向,但幅度大于 1。它还不是单位向量,因此我们必须相应地缩放它。

m = sqrt(V.x^2 + V.z^2)
Run Code Online (Sandbox Code Playgroud)

m 现在是 V 的大小,我们将用它来缩放 V:

V.x /= m
V.z /= m
Run Code Online (Sandbox Code Playgroud)

找到法线的最终计算是:

N.x = V.x * h/r
N.y = r/h
N.z = V.z * h/r
Run Code Online (Sandbox Code Playgroud)