在3D空间中计算单个三角形的法向量

16

我正在一门图形编程课上,做的是书面作业,而不是编程作业,所以我希望这个问题适合在这个网站上提问。我的问题如下:

计算由以下每组顶点指定的三角形的单位法向量(假设三角形远离原点):

我大约一年前学了线性代数,当时我的老师说他不会教叉积,因为只有计算机科学专业的学生需要它,并且当他们需要用到它时,就会在其他课程中讲到,但实际上却没有,因为他们认为线性代数老师已经讲过了。我查看了两打叉积的解释,但它们都超出了我的理解范围。

这个问题包含了三个子问题,如果有人能够带我解决一个单一的问题,而不涉及太多变量和希腊字母,那将不胜感激。

这个问题的第一个部分有以下三个坐标作为三角形的顶点:[1,1,1]; [1,-1,1]; [1,0,-1]。我试着拼凑不同的公式和解释,得出的法向量是[4,0,0],但这似乎不对,因为我足够了解这个三角形不在y-z平面上。我唯一拥有的其他内容是以下公式:

(A x B) / | A x B |

我知道A和B是三角形的两个随机边,表示为向量,并通过从A中减去V2和V1以及从B中减去V3和V1进行计算,但我不明白它具体要我做什么。


5
WTF?! 没学过叉积?它们在计算机科学之外也很有用...事实上,在我学习的任何计算机课程中从未使用过它们,只在计算机科学的专业应用中使用过。 工程师、物理学家等经常使用叉积,而计算机科学的学生几乎不使用它们,而是专注于离散数学。 抱怨归抱怨,三角形的一个有用特性是所有点都保证位于同一平面上(共面),两条边之间的叉积将给出一个垂直向量(法向量)。但通常您想再进一步,使法向量成为单位长度。 - Andon M. Coleman
1
请注意,叉积是一种依赖顺序的操作。这导致了对绕组顺序的讨论,如果您颠倒两个叉积操作数的顺序,您将得到面向其他方向的法线。在学习线性代数之后,您应该研究叉积的行列式形式,这可能是最有意义的。 - Andon M. Coleman
刚看到这个,想评论一下:三角形实际上位于y-z平面上,其法向量可以是任何x值[x,0,0]。只是觉得有趣。 - Tor Valamo
1个回答

29

引用自https://www.khronos.org/opengl/wiki/Calculating_a_Surface_Normal

三角形的表面法线可以通过计算该三角形的两条边的向量叉乘来获得。计算中使用的顶点顺序将影响法线的方向(相对于绕组而言,即内部或外部)。

因此,对于三角形p1,p2,p3,如果向量A = p2 - p1和向量B = p3 - p1,则法线N = A x B可以通过以下方式计算:

Nx = Ay * Bz - Az * By
Ny = Az * Bx - Ax * Bz
Nz = Ax * By - Ay * Bx

Uy是U中的第二个元素吗? - June Wang
@JuneWang 是的。我会更改字母以避免与UV坐标混淆。 - Kromster
嗨。我在这个公式中遇到了两个问题。a)正交三角形返回零长度法线。b)有些三角形也会返回零长度法线。例如,p1(3.9585345,12.684328,1.2042775),p2(3.1372554,12.51845,-0.089832544),p3(2.726616,12.435511,-0.7368876)。你觉得有道理吗?:S - Andrés Oviedo
关于我上次的评论。我仍然遇到正交三角形的问题。我遇到的第二个问题是没有使用高精度浮点数 :) - Andrés Oviedo
5
@AndrésOviedo 所描述的三角形是退化的 - 其所有点都在同一条直线上,它没有表面积和面向。 - Kromster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接