代码更新
This commit is contained in:
1 parent
4bb714a3ed
commit
07759efad3
1 file changed
+1
-122
+1
-122
@@ -152,127 +152,6 @@ def compute_mesh_center(vertices):
|
||||
centroid = np.array([sum_x / n, sum_y / n, sum_z / n])
|
||||
return centroid
|
||||
|
||||
def load_and_show(base_path, json_name="3DPrintLayout.json"):
|
||||
# 加载并变换所有模型
|
||||
transformed_meshes = load_and_transform_models(base_path, {}, json_name)
|
||||
|
||||
if not transformed_meshes:
|
||||
print("没有加载到任何模型,请检查错误信息")
|
||||
else:
|
||||
print(f"成功加载并变换了 {len(transformed_meshes)} 个模型")
|
||||
|
||||
# 可视化所有模型
|
||||
print("显示所有模型... (按'Q'退出)")
|
||||
|
||||
try:
|
||||
from packaging import version
|
||||
o3d_version = version.parse(o3d.__version__)
|
||||
# 新版本 draw_geometries 参数
|
||||
if o3d_version >= version.parse("0.13.0"):
|
||||
o3d.visualization.draw_geometries(
|
||||
transformed_meshes,
|
||||
window_name="模型展示",
|
||||
mesh_show_back_face=True,
|
||||
mesh_show_wireframe=False
|
||||
)
|
||||
# 旧版本 draw_geometries 参数
|
||||
else:
|
||||
o3d.visualization.draw_geometries(
|
||||
transformed_meshes,
|
||||
window_name="模型展示",
|
||||
point_show_normal=False,
|
||||
mesh_show_back_face=True
|
||||
)
|
||||
except Exception as e:
|
||||
print(f"使用 draw_geometries 可视化失败: {e}")
|
||||
|
||||
def setup_orthographic_camera(vis, meshes, ortho_width=15.0, camera_height=20.0):
|
||||
"""
|
||||
设置精确的正交投影相机
|
||||
"""
|
||||
view_control = vis.get_view_control()
|
||||
|
||||
# 计算场景边界框以确定合适的正交参数
|
||||
all_points = []
|
||||
for mesh in meshes:
|
||||
if hasattr(mesh, 'vertices'):
|
||||
points = np.asarray(mesh.vertices)
|
||||
else:
|
||||
points = np.asarray(mesh.points)
|
||||
all_points.append(points)
|
||||
|
||||
if all_points:
|
||||
all_points = np.vstack(all_points)
|
||||
bbox_min = np.min(all_points, axis=0)
|
||||
bbox_max = np.max(all_points, axis=0)
|
||||
scene_center = (bbox_min + bbox_max) / 2
|
||||
scene_size = np.max(bbox_max - bbox_min)
|
||||
|
||||
# 设置观察点为场景中心
|
||||
view_control.set_lookat(scene_center)
|
||||
|
||||
# 设置相机在场景上方,俯视场景
|
||||
view_control.set_front([0, 0, -1]) # 看向负Z轴(从上向下)
|
||||
view_control.set_up([0, 1, 0]) # Y轴向上
|
||||
|
||||
try:
|
||||
# 启用正交投影
|
||||
view_control.set_orthogonal(True)
|
||||
# 根据场景大小设置正交投影宽度
|
||||
view_control.set_orthogonal_width(max(scene_size * 1.2, ortho_width))
|
||||
print(f"正交投影已设置: 宽度={max(scene_size * 1.2, ortho_width):.2f}")
|
||||
except AttributeError:
|
||||
# 回退到透视投影模拟
|
||||
view_control.set_zoom(0.1)
|
||||
print("使用透视投影模拟正交效果")
|
||||
|
||||
return True
|
||||
|
||||
def auto_fit_to_view(vis, meshes):
|
||||
"""
|
||||
自动调整视图以显示所有模型
|
||||
"""
|
||||
view_control = vis.get_view_control()
|
||||
|
||||
# 方法1: 使用 Open3D 的自动适配功能
|
||||
try:
|
||||
view_control.fit_to_geometry(meshes)
|
||||
print("已自动适配视图以显示所有模型")
|
||||
return True
|
||||
except:
|
||||
pass
|
||||
|
||||
# 方法2: 手动计算并设置
|
||||
all_points = []
|
||||
for mesh in meshes:
|
||||
if hasattr(mesh, 'vertices'):
|
||||
points = np.asarray(mesh.vertices)
|
||||
elif hasattr(mesh, 'points'):
|
||||
points = np.asarray(mesh.points)
|
||||
else:
|
||||
continue
|
||||
all_points.append(points)
|
||||
|
||||
if all_points:
|
||||
all_points = np.vstack(all_points)
|
||||
bbox_min = np.min(all_points, axis=0)
|
||||
bbox_max = np.max(all_points, axis=0)
|
||||
scene_center = (bbox_min + bbox_max) / 2
|
||||
scene_size = np.max(bbox_max - bbox_min)
|
||||
|
||||
# 设置合适的视角和缩放
|
||||
view_control.set_lookat(scene_center)
|
||||
|
||||
# 根据场景大小设置 zoom
|
||||
zoom_level = max(0.05, min(1.0, 10.0 / scene_size))
|
||||
zoom_level = 0.5
|
||||
view_control.set_zoom(zoom_level)
|
||||
|
||||
print(f"手动适配视图: 场景大小 {scene_size:.2f}, zoom {zoom_level:.3f}")
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def set_orthographic_camera(view_control, desired_width=1920, desired_height=1080):
|
||||
"""
|
||||
通过相机参数设置正交投影,并确保尺寸匹配
|
||||
@@ -528,7 +407,7 @@ def load_show_save(base_path, dict_origin, batch_id, is_show=False):
|
||||
|
||||
# 主程序
|
||||
if __name__ == "__main__":
|
||||
|
||||
|
||||
is_use_parser = False
|
||||
if is_use_parser:
|
||||
parser = argparse.ArgumentParser()
|
||||
|
||||
Reference in new issue
Block a user