2025-11-17 13:46:10 +08:00
|
|
|
|
import logging
|
|
|
|
|
|
|
|
|
|
|
|
import numpy as np
|
|
|
|
|
|
import open3d as o3d
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def read_stl(stl_path: str, save_path: str, view_pointcloud: bool = False) -> None:
|
|
|
|
|
|
mesh = o3d.io.read_triangle_mesh(stl_path)
|
|
|
|
|
|
mesh.scale(0.001, center=[0, 0, 0])
|
|
|
|
|
|
mesh.compute_vertex_normals()
|
|
|
|
|
|
|
|
|
|
|
|
pcd_model = mesh.sample_points_uniformly(number_of_points=50000)
|
|
|
|
|
|
# pcd_model = pcd_model.voxel_down_sample(voxel_size=0.01)
|
|
|
|
|
|
|
|
|
|
|
|
center = pcd_model.get_center().flatten()
|
|
|
|
|
|
R = np.eye(4)
|
|
|
|
|
|
R[0, 3], R[1, 3], R[2, 3] = -center
|
|
|
|
|
|
pcd_model.transform(R)
|
|
|
|
|
|
|
|
|
|
|
|
R = np.array(
|
|
|
|
|
|
[[0, 0, 1, 0],
|
|
|
|
|
|
[0, 1, 0, 0],
|
|
|
|
|
|
[-1, 0, 0, 0],
|
|
|
|
|
|
[0, 0, 0, 1]],
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
pcd_model.transform(R)
|
|
|
|
|
|
|
|
|
|
|
|
if view_pointcloud:
|
|
|
|
|
|
point = [
|
|
|
|
|
|
[0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1]
|
|
|
|
|
|
] # 画点:原点、第一主成分、第二主成分
|
|
|
|
|
|
lines = [
|
|
|
|
|
|
[0, 1], [0, 2], [0, 3]
|
|
|
|
|
|
] # 画出三点之间两两连线
|
|
|
|
|
|
colors = [
|
|
|
|
|
|
[1, 0, 0], [0, 1, 0], [0, 0, 1]
|
|
|
|
|
|
]
|
|
|
|
|
|
# 构造open3d中的LineSet对象,用于主成分显示
|
|
|
|
|
|
line_set = o3d.geometry.LineSet(points=o3d.utility.Vector3dVector(point), lines=o3d.utility.Vector2iVector(lines))
|
|
|
|
|
|
line_set.colors = o3d.utility.Vector3dVector(colors)
|
|
|
|
|
|
|
|
|
|
|
|
o3d.visualization.draw_geometries([pcd_model, line_set])
|
|
|
|
|
|
|
2025-11-19 16:46:40 +08:00
|
|
|
|
# success = o3d.io.write_point_cloud(save_path, pcd_model)
|
|
|
|
|
|
# logging.info(f"PCD_0, 写入结果: {success}")
|
2025-11-17 13:46:10 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
|
read_stl()
|