Math 从原点到平面的距离(最短)

Math 从原点到平面的距离(最短),math,3d,Math,3d,所以我在读这一页上的一些东西() 作者提到 d = - D3DXVec3Dot(&vP1, &vNormal); 其中vP1是平面上的一个点,vNormal是平面的法线。我很好奇,这是如何让你得到距离世界原点的距离的,因为结果总是0。另外,我想澄清一下(因为我对平面方程的d部分还有些模糊),平面方程中的d是从一条线穿过世界原点到平面原点的距离吗?在一般情况下,点p和平面之间的距离可以通过 <p - p0, normal> 这个等式在形式上是错误的,因为点积是关于

所以我在读这一页上的一些东西()

作者提到

 d = - D3DXVec3Dot(&vP1, &vNormal);

其中vP1是平面上的一个点,vNormal是平面的法线。我很好奇,这是如何让你得到距离世界原点的距离的,因为结果总是0。另外,我想澄清一下(因为我对平面方程的d部分还有些模糊),平面方程中的d是从一条线穿过世界原点到平面原点的距离吗?

在一般情况下,点
p
和平面之间的距离可以通过

<p - p0, normal>
这个等式在形式上是错误的,因为点积是关于向量的,而不是关于点。。。但在数字上仍然成立。写下明确的公式,你就知道了

(0 - p0.x)*n.x + (0 - p0.y)*n.y + (0 - p0.z)*n.z

- (p0.x*n.x + p0.y*n.y + p0.z*n.z)

实际上,存储平面的一个好方法是保存正常的
n
k=
的值,其中
p0
是平面上的任意点(
k
的值独立于您选择的平面点)。

在一般情况下,点
p
和平面之间的距离可以通过

<p - p0, normal>
这个等式在形式上是错误的,因为点积是关于向量的,而不是关于点。。。但在数字上仍然成立。写下明确的公式,你就知道了

(0 - p0.x)*n.x + (0 - p0.y)*n.y + (0 - p0.z)*n.z

- (p0.x*n.x + p0.y*n.y + p0.z*n.z)

实际上,存储平面的一个好方法是保存法线
n
k=
的值,其中
p0
是平面上的任意点(
k
的值独立于您选择平面的哪个点)。

您可以使用拉格朗日乘数来计算:

您知道,平面上最近的点必须为以下形式:

c = p + v
其中,
c
是最近点,
v
是沿平面的向量(因此与法线
n
正交)。您正在尝试查找具有最小范数(或范数平方)的
c
。因此,您正试图最小化
点(c,c)
,使
v
n
正交(因此
点(v,n)=0

因此,建立拉格朗日方程:

L = dot(c,c) + lambda * ( dot(v,n) )
L = dot(p+v,p+v) + lambda * ( dot(v,n) )
L = dot(p,p) + 2*dot(p,v) + dot(v,v) * lambda * ( dot(v,n) )
v
(并设置为0)求导数,得到:

你可以在上面的等式中通过点积两边的
n
来求解lambda

2 * dot(p,n) + 2 * dot(v,n) + lambda * dot(n,n) = 0
2 * dot(p,n) + lambda = 0
lambda = - 2 * dot(p,n)
再次注意,
dot(n,n)=1
dot(v,n)=0
(因为
v
在平面内,
n
与其正交)。然后替换
lambda
返回以获取:

2 * p + 2 * v - 2 * dot(p,n) * n = 0
并求解
v
,得到:

v = dot(p,n) * n - p
然后将其插回
c=p+v
以获得:

c = dot(p,n) * n

该向量的长度为点(p,n),符号告诉您该点是在从原点到法向量的方向上,还是在从原点到法向量的相反方向上。

您可以使用拉格朗日乘数来计算:

您知道,平面上最近的点必须为以下形式:

c = p + v
其中,
c
是最近点,
v
是沿平面的向量(因此与法线
n
正交)。您正在尝试查找具有最小范数(或范数平方)的
c
。因此,您正试图最小化
点(c,c)
,使
v
n
正交(因此
点(v,n)=0

因此,建立拉格朗日方程:

L = dot(c,c) + lambda * ( dot(v,n) )
L = dot(p+v,p+v) + lambda * ( dot(v,n) )
L = dot(p,p) + 2*dot(p,v) + dot(v,v) * lambda * ( dot(v,n) )
v
(并设置为0)求导数,得到:

你可以在上面的等式中通过点积两边的
n
来求解lambda

2 * dot(p,n) + 2 * dot(v,n) + lambda * dot(n,n) = 0
2 * dot(p,n) + lambda = 0
lambda = - 2 * dot(p,n)
再次注意,
dot(n,n)=1
dot(v,n)=0
(因为
v
在平面内,
n
与其正交)。然后替换
lambda
返回以获取:

2 * p + 2 * v - 2 * dot(p,n) * n = 0
并求解
v
,得到:

v = dot(p,n) * n - p
然后将其插回
c=p+v
以获得:

c = dot(p,n) * n

该向量的长度为点(p,n),符号告诉您该点是在从原点到法向量的方向上,还是在从原点到法向量的相反方向上。

结果并不总是零。只有当平面通过原点时,结果才会为零。(这里假设飞机没有经过原点。)

基本上,从原点到平面上的某个点有一条直线。(即,从原点到vP1有一个向量)。这个向量的问题是,它很可能是倾斜的,并且会移动到平面上某个很远的地方,而不是移动到平面上最近的点。所以,如果你简单地计算vP1的长度,你会得到一个太大的距离


你需要做的是得到vP1在向量上的投影,你知道向量垂直于平面。这当然是正常的。取vP1和vNormal的点积,除以vNormal的长度,就得到了答案。(如果他们很友好,给了你一个已经是1级的vNormal,那么就不需要除法了。)

结果并不总是零。只有当平面通过原点时,结果才会为零。(这里假设飞机没有经过原点。)

基本上,从原点到平面上的某个点有一条直线。(即,从原点到vP1有一个向量)。这个向量的问题是,它很可能是倾斜的,并且会移动到平面上某个很远的地方,而不是移动到平面上最近的点。所以,如果你简单地计算vP1的长度,你会得到一个太大的距离


你需要做的是得到vP1在向量上的投影,你知道向量垂直于平面。这当然是正常的。取vP1和vNormal的点积,除以vNormal的长度,就得到了答案。(如果他们足够友好,给你一个已经是1级的V法线,那么就不需要分割。)

法线是来自曲面的法线。如果点是alrea