从 csv 生成 stl 网格
Generate stl mesh from csv
我有一个 csv 文件,它对大坝的 9000x5000 分辨率照片的高程数据进行编码,我想生成一个可以在我的 3d 打印机上打印的 stl 文件。 csv 有 3 个参数:X
、Y
和 Z
,其中 X
和 Y
表示照片上的像素位置,Z
是 Pixel (X,Y)
处的地形海拔。
我想要一个相关照片的 3D stl 文件,其中包含高程数据表示的角落、缝隙和山丘。我尝试使用 Python 库 numpy-stl
来执行此操作,但我意识到我对 stl 文件的了解还不够,无法完成打印作业。
任何有关我如何制作此文件或 stl 文件如何编码信息的信息都将非常有用。
您拥有的是 个顶点 的集合。然而,STL 编码的是 三角形 的列表。所以你需要做的是构建连接顶点的三角形网格。我假设您想自己编写代码,我会为您提供一些有关如何编写代码的提示。
首先,你应该弄清楚你的观点是否结构化。我所说的结构化是指点的 x- 和 y- 坐标形成规则的网格(获取数据时通常是这种情况来自机载扫描)。
如果点是结构化的
如果这些点是结构化的,您就有很大的机会自己构建网格。表示P(i,j)点(X[i],Y[j],Z[i,j]),即, 第一个坐标是 x 坐标列表中第 i 个数的点,其第二个坐标是 j-y-坐标列表中的第一个数,其第三个坐标是第一个对应的z-坐标二。图1说明。
现在您需要确定三角形的方向。它们都应该是正向(逆时针)或负向(顺时针)。假设您决定负方向,您现在可以创建连接点 P(i,j)、P(i+1,j)[=66= 的三角形] 和 P(i+1,j+1)。见图2.
在下一步中,您可以创建具有相同方向的相邻三角形,例如 P(i,j), P(i+1, j+1), P(i,j+1)。参见图 3.
中较暗的三角形
对所有合适的i和j进行同样的处理,就可以得到所有需要的三角形。
唯一缺少的部分是每个三角形的法线。你可以用 cross-product as suggested in this answer.
来计算
现在您已准备好将所有内容写入您的文件。按照 Wikipedia 上的描述,为每个三角形写下它的法线和三个顶点。
如果点没有结构化
在这种情况下,如果不对网格划分方法进行大量研究(您可能需要了解 Delaunay 三角剖分),则创建网格的机会不大。幸运的是,有一些库可用。例如,Fade2.5D 是一个可以帮助您的 C++ 库,它对个人非商业研究是免费的。也许 Python 也有类似的东西。
我有一个 csv 文件,它对大坝的 9000x5000 分辨率照片的高程数据进行编码,我想生成一个可以在我的 3d 打印机上打印的 stl 文件。 csv 有 3 个参数:X
、Y
和 Z
,其中 X
和 Y
表示照片上的像素位置,Z
是 Pixel (X,Y)
处的地形海拔。
我想要一个相关照片的 3D stl 文件,其中包含高程数据表示的角落、缝隙和山丘。我尝试使用 Python 库 numpy-stl
来执行此操作,但我意识到我对 stl 文件的了解还不够,无法完成打印作业。
任何有关我如何制作此文件或 stl 文件如何编码信息的信息都将非常有用。
您拥有的是 个顶点 的集合。然而,STL 编码的是 三角形 的列表。所以你需要做的是构建连接顶点的三角形网格。我假设您想自己编写代码,我会为您提供一些有关如何编写代码的提示。
首先,你应该弄清楚你的观点是否结构化。我所说的结构化是指点的 x- 和 y- 坐标形成规则的网格(获取数据时通常是这种情况来自机载扫描)。
如果点是结构化的
如果这些点是结构化的,您就有很大的机会自己构建网格。表示P(i,j)点(X[i],Y[j],Z[i,j]),即, 第一个坐标是 x 坐标列表中第 i 个数的点,其第二个坐标是 j-y-坐标列表中的第一个数,其第三个坐标是第一个对应的z-坐标二。图1说明。
现在您需要确定三角形的方向。它们都应该是正向(逆时针)或负向(顺时针)。假设您决定负方向,您现在可以创建连接点 P(i,j)、P(i+1,j)[=66= 的三角形] 和 P(i+1,j+1)。见图2.
在下一步中,您可以创建具有相同方向的相邻三角形,例如 P(i,j), P(i+1, j+1), P(i,j+1)。参见图 3.
中较暗的三角形对所有合适的i和j进行同样的处理,就可以得到所有需要的三角形。
唯一缺少的部分是每个三角形的法线。你可以用 cross-product as suggested in this answer.
来计算现在您已准备好将所有内容写入您的文件。按照 Wikipedia 上的描述,为每个三角形写下它的法线和三个顶点。
如果点没有结构化
在这种情况下,如果不对网格划分方法进行大量研究(您可能需要了解 Delaunay 三角剖分),则创建网格的机会不大。幸运的是,有一些库可用。例如,Fade2.5D 是一个可以帮助您的 C++ 库,它对个人非商业研究是免费的。也许 Python 也有类似的东西。