给定所有 4 个顶点位置,找出不规则四面体的高度
Find the altitude of an irregular tetrahedron given all 4 vertex positions
我有一个使用 4 个顶点的不规则四面体。
鉴于一个特定的顶点是顶部而其他顶点是底部,我需要找出高度。
基本上,高度是从顶部到底部形成 90 度角的最短距离。这应该是一个简单的数学问题,但我在 Google.
上找不到任何内容
我正在寻找如下所示的优化函数:
float GetPyramidAltitude (Vector3 top, Vector3 baseA, Vector3 baseB, Vector3 baseC) {
...
}
感谢您的帮助。
这相当于求一个点到一个平面的距离。该平面由构成底面的三个点定义。 determining a plane given three points and finding the minimal distance between a point and a plane.
上有详细解释
免责声明:我不了解 Unity3D,所以我正在编写下面的语法。如果有什么不清楚的,请告诉我;否则你将不得不转换成可以使用 Unity3D API.
编译的东西
第一步是确定给定三个点的平面方程。平面法线由下式给出:
n = cross(baseB-baseA, baseC-baseA);
n = n / norm(n);
其中 cross
returns 两个参数的叉积,norm
returns 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
是"above"法线指向"up"的三个基点定义的平面。当 D < 0
时 top
在平面下方。因此,在您的情况下,您可能希望采用 D
的绝对值来获得距离。
谢谢,不过我从 Unity 中的一个方法中找到了解决方案。
基本上我们只需要 3 个参数:顶部顶点、底部的一个顶点和我已经拥有的底部的面法线。
这是我的解决方案:
float GetPyramidAltitude (Vector3 top, Vector3 baseA, Vector3 baseNormal) {
Vector3 topToBase = Vector3.Project(baseA - top, baseNormal);
return topToBase.magnitude;
}
我有一个使用 4 个顶点的不规则四面体。
鉴于一个特定的顶点是顶部而其他顶点是底部,我需要找出高度。
基本上,高度是从顶部到底部形成 90 度角的最短距离。这应该是一个简单的数学问题,但我在 Google.
上找不到任何内容我正在寻找如下所示的优化函数:
float GetPyramidAltitude (Vector3 top, Vector3 baseA, Vector3 baseB, Vector3 baseC) {
...
}
感谢您的帮助。
这相当于求一个点到一个平面的距离。该平面由构成底面的三个点定义。 determining a plane given three points and finding the minimal distance between a point and a plane.
上有详细解释免责声明:我不了解 Unity3D,所以我正在编写下面的语法。如果有什么不清楚的,请告诉我;否则你将不得不转换成可以使用 Unity3D API.
编译的东西第一步是确定给定三个点的平面方程。平面法线由下式给出:
n = cross(baseB-baseA, baseC-baseA);
n = n / norm(n);
其中 cross
returns 两个参数的叉积,norm
returns 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
是"above"法线指向"up"的三个基点定义的平面。当 D < 0
时 top
在平面下方。因此,在您的情况下,您可能希望采用 D
的绝对值来获得距离。
谢谢,不过我从 Unity 中的一个方法中找到了解决方案。
基本上我们只需要 3 个参数:顶部顶点、底部的一个顶点和我已经拥有的底部的面法线。
这是我的解决方案:
float GetPyramidAltitude (Vector3 top, Vector3 baseA, Vector3 baseNormal) {
Vector3 topToBase = Vector3.Project(baseA - top, baseNormal);
return topToBase.magnitude;
}