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