.net 如何在X轴和Z轴上水平对齐三维曲面(就像它与地面平行一样)

zd287kbt  于 2023-03-09  发布在  .NET
关注(0)|答案(1)|浏览(97)

我的Winforms应用程序从一个.STL(stereolitography)文件中读取一个3D扫描仪给出的3D模型(一组XYZ坐标的点)。扫描的对象是一个平台(平行六面体),一些多面颗粒位于其上。平台表面可以被认为是平的,平台位于桌面上(它的表面也可以被认为是平的)。
3D模型沿着X轴和Z轴倾斜:

我需要在X轴和Z轴上水平对齐,好像平台与地面平行(通过调整点的Y坐标):

我怀疑这是一个标准的数学问题--但我不是数学Maven,所以我在寻找一个算法或公式。
先谢谢你。如果我没有把我的情况解释清楚,请随时要求澄清。
如果简化任务-几何中心沿着X轴和Z轴的点(Pcenter)明确位于平台顶面,需要围绕Pcenter旋转3D模型,使位于平台顶面的所有点具有相同的Y坐标(Pcenter.Y)。

j5fpnvbx

j5fpnvbx1#

因此,我的三维模型旋转的最终解决方案是(在John Alexioushingo的帮助下-谢谢):
1.确定属于平面的3个点(它们应该相距很远,因为在我的扫描中不可避免地会有一些噪声)-它们定义了一个三角形。
1.计算三角形的法向量并计算四元数:

var normal = Vector3 Normalize((A - B) * (C - B));
 var toDir = Vector3.UnitY;
 var axis = normal * toDir;

 var angle = Math.Acos(Vector3.Dot(normal, toDir));

 var rot = Quaternion.CreateFromAxisAngle(axis, angle);
  1. Apply rotation到三角形(并分别到我的所有3D模型点):
var O = (A + B + C) / 3;
var Ar = Vector3.Transform(A - O, rot) + O;
var Br = Vector3.Transform(B - O, rot) + O;
var Cr = Vector3.Transform(C - O, rot) + O;

相关问题