应该如何处理?
![enter image description here](https://istack.dev59.com/N2Kvf.webp)
orig
点到兴趣点的距离作为向量:v = point-orig (在每个维度上);
n
进行点乘:dist = vx*nx + vy*ny + vz*nz;
dist = 沿法线从点到平面的标量距离
projected_point = point - dist*normal;
图示:我稍微修改了您的图片。红色是v
。 dist
是蓝色和绿色的长度,等于v
点积normal
。 蓝色是normal*dist
。 绿色是与蓝色相同的向量,它们只是在不同的位置绘制。 要找到planar_xyz,请从point
开始,并减去绿色向量。
d
来获取点到平面的垂直距离,否则你会假设该平面通过原点。 - bobobobo这很简单,你只需要找到从点P
到平面的垂线距离(缩写为|_
),然后在平面法向量方向上以垂线距离反向平移P
。结果是平移后的P
位于平面上。
以一个容易的例子(我们可以通过检查来验证):
设 n=(0,1,0),P=(10,20,-5)。
投影点应该是(10,10,-5)。 你可以通过检查发现Pproj在平面上垂直距离为10单位,如果它在平面上,它将有y=10。
那么我们如何分析性地找到它呢?
平面方程是Ax+By+Cz+d=0。这个方程的意思是"为了使一个点(x,y,z)在平面上,它必须满足Ax+By+Cz+d=0"。
上面绘制的平面的Ax+By+Cz+d=0是什么方程?
平面的法向量是n=(0,1,0)。d可以通过使用已经在平面内的测试点来简单地找到:
(0)x + (1)y + (0)z + d = 0
点 (0,10,0) 在该平面上。将其代入,我们得到 d=-10。因此,该平面的方程为 0x + 1y + 0z - 10 = 0(如果简化,可以得到 y=10)。
d
的一个不错的解释是它表示“你需要沿法线方向平移该平面多远才能使其经过原点的垂直距离”。
无论如何,一旦有了 d
,我们就可以通过以下公式找到任意点到该平面的 |_ 距离:
到平面的 |_ 距离有三个可能的结果类别:
你可以通过上图检验其正确性。
这种方法在@tmpearce的答案中已经解释过了。
给定一个以法向量n和位于平面上的点o的点法式定义的平面,可以通过以下方式找到距离给定点p最近的点p':
这种方法在@bobobobo的答案中已经解释过了。
给定一个由法向量n和标量d定义的平面,可以通过以下方式找到距离给定点p最近的点p':
如果您有一个点法式定义的平面(即平面由法向量n和位于平面上的点o定义),@bobobobo建议找到标量d:
并将其插入方程2中。 这会得到:
Therefore, equation 5 is equivalent to equations 1 and 4, but may provide a more efficient implementation in some cases.
仔细观察方程式1和4。通过比较它们,您会发现方程式1使用n ⋅ (p - o),而方程式4使用n ⋅ p - n ⋅ o。实际上这是写同一件事的两种方式:
因此,我们可以把标量d解释为“预计算”。如果一个平面的n和o已知,但是只用来计算n ⋅ (p - o),我们可以选择使用n和d来定义平面,并计算n ⋅ p + d,因为我们刚刚证明它们是相同的。
此外,对于编程,使用d有两个优点:
因此,方程式5等同于方程式1和4,但在某些情况下可能提供更有效的实现方式。
仅提供平面原点和法向量是不足够的。这定义了三维平面,但并未定义平面上的坐标系。
想象一下,您可以围绕法向量旋转平面,以其原点为中心(即将法向量置于原点并“旋转”)。
然而,您可以找到投影点到原点的距离(这显然不随旋转而变化)。
从三维点中减去原点。然后与法线方向进行叉乘。如果您的法向量已被标准化,则结果向量的长度等于所需值。
编辑
完整的答案需要一个额外的参数。例如,您还提供表示平面x轴的向量。
因此,我们有向量n和x。假设它们被标准化。
原点由O表示,您的三维点为p。
那么,您的点将进行以下投影:
x = (p - O)·x
y = (p - O)·(n × x)
让 V = (orig_x, orig_y, orig_z) - (point_x, point_y, point_z)
N = (normal_dx, normal_dy, normal_dz)
令 d = V·N;
投影点 P = V + d·N
d.N
是点积还是叉积? - BenKoshy我认为你应该稍微改变描述平面的方式。事实上,描述平面的最佳方式是通过一个向量n和一个标量c
(x, n) = c
常数c(绝对值)是平面到原点的距离,并且等于(P, n),其中P是平面上的任意一点。
所以,让P成为您的orig点,A'成为新点A在平面上的投影。您需要做的是找到a,使得A' = A - a*n满足平面方程,即
(A - a*n, n) = (P, n)
解出a,您会发现
a = (A, n) - (P, n) = (A, n) - c
这给出了
A' = A - [(A, n) - c]n
使用您的名称,这样阅读
c = orig_x*normal_dx + orig_y*normal_dy+orig_z*normal_dz;
a = point_x*normal_dx + point_y*normal_dy + point_z*normal_dz - c;
planar_x = point_x - a*normal_dx;
planar_y = point_y - a*normal_dy;
planar_z = point_z - a*normal_dz;
设r为需要投影的点,p为投影结果。设c为平面上的任意一点,n为平面法向量(不一定已标准化)。写出p=r+ m d,其中m为标量,如果没有解,则将其视为不定。 由于(p-c)·n=0,因为平面上所有点都满足这个限制,因此有(r-c)·n+m(d.n)=0,因此m=[(c-r)·n]/[d.n],其中点乘(.)被使用。但是,如果d.n=0,则没有解。例如,如果d和n相互垂直,则无解。