该答案是对两个现有答案的补充。我的目的是展示@tmpearce和@bobobobo的解释是如何归结为同一件事的,同时又为那些仅对复制适合自己情况的方程式感兴趣的人提供快速解答。
法线n和点o定义的平面的方法
@tmpearce在答案中解释了此方法。
给定一个平面的点法线定义,该平面的法线为n且平面上的点为o,则点p'(即平面上最接近给定点p的点)可以通过以下公式找到:
1)p'= p-(n⋅(p-o))* n
法线n和标量d定义的平面的方法
@bobobobo在答案中解释了此方法。
给定一个由法线n和标量d定义的平面,可以通过以下方法找到一个点p',即最接近给定点p的平面上的点:
2)p'= p-(n⋅p + d)* n
相反,如果您有一个平面的点法线定义(该平面由法线n和平面上的点o定义),@ bobobobo建议找到d:
3)d = -n⋅o
并将其插入等式2。这将产生:
4)p'= p-(n⋅p-n⋅o)* n
关于差异的注释
仔细研究方程式1和4。通过比较它们,您会发现方程式1使用n⋅(p-o),方程式2使用n⋅p-n⋅o。 实际上,这是写下同一件事的两种方式:
5)n⋅(p-o)= n⋅p-n⋅o = n⋅p + d
因此,可以选择将标量d解释为好像是“预计算”。 我将说明:如果已知平面的n和o,但是o仅用于计算n⋅(p-o),我们也可以用n和d定义平面,然后计算n⋅p + d,因为我们已经看到那是同一回事。
此外,使用d进行编程有两个优点:
现在找到p'是一个更简单的计算,尤其是对于计算机而言。 相比:使用n和o:3个减法+ 3个乘法+ 2个加法
使用n和d:0减+ 3乘+ 3加。
使用d将平面的定义限制为仅4个实数(对于n而言,3为3 +对于d为1),而不是6(对于n为3,对于n + 3对于o)。 这样可以节省内存。