我有一个使用4个顶点的不规则四面体。
我需要找出高度,因为一个特定的顶点是顶部而其他顶点是底部。
基本上,高度是从顶部到底部的最短距离,形成90度角。这应该是一个简单的数学问题,但我在谷歌上找不到任何东西。
我正在寻找一个看起来像这样的优化函数:
float GetPyramidAltitude (Vector3 top, Vector3 baseA, Vector3 baseB, Vector3 baseC) {
...
}
感谢您的帮助。
答案 0 :(得分:2)
这相当于找到点和平面之间的距离。平面由包括基部的三个点限定。有关determining a plane given three points和finding the minimal distance between a point and a plane的详细说明。
免责声明:我不知道Unity3D,所以我有点编写下面的语法。如果事情不清楚,请告诉我;否则你将不得不翻译成可以使用Unity3D API编译的东西。
第一步是确定给定三点的平面方程。平面法线由下式给出:
n = cross(baseB-baseA, baseC-baseA);
n = n / norm(n);
其中cross
返回两个参数的叉积,norm
返回l2范数(矢量幅度)。平面方程中的偏移项由下式给出:
d = -n.x*baseA.x - n.y*baseA.y - n.z*baseA.z;
这将产生平面方程:
n.x*X + n.y*Y + n.z*Z + d = 0
然后通过
找出top
和平面之间的距离
D = dot(n, top) + d;
其中dot
是平面n
和top
的单位向量法线的点积,之前定义了d。当D > 0
top
“高于”由正常点“向上”的三个基点定义的平面时。当D < 0
top
低于飞机时。因此,在您的情况下,您可能需要使用D
的绝对值来获取距离。
答案 1 :(得分:0)
谢谢,但是我找到了Unity中一个方法的解决方案。
基本上我们只需要3个参数:顶部顶点,底部的一个顶点和我已经拥有的底部面部法线。
这是我的解决方案:
float GetPyramidAltitude (Vector3 top, Vector3 baseA, Vector3 baseNormal) {
Vector3 topToBase = Vector3.Project(baseA - top, baseNormal);
return topToBase.magnitude;
}