建模程序 多个定时程序
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

124 lines
4.0 KiB

import numpy as np
import open3d as o3d
import math,os
#矫正模型的方向,目前只支持水平旋转,
#55084 55090 55092 55114 55367 55370 55372 55730 55844 55849 56559 56654 56750 75408
def rotate_vertex(x, y, z, axis, angle_degrees):
"""
围绕任意轴旋转顶点。
axis是一个表示旋转轴的三元组 (ax, ay, az)。
angle_degrees是旋转角度,以度为单位。
"""
# 将角度转换为弧度
angle_radians = math.radians(angle_degrees)
# 将旋转轴转换为单位向量
axis = np.array(axis)
axis = axis / np.linalg.norm(axis)
# 将顶点位置转换为向量
v = np.array([x, y, z])
# 应用罗德里格斯旋转公式
v_rotated = (v * math.cos(angle_radians) +
np.cross(axis, v) * math.sin(angle_radians) +
axis * np.dot(axis, v) * (1 - math.cos(angle_radians)))
return v_rotated.tolist()
def transform_obj_file(source_file, target_file, axis, angle_degrees):
"""
读取 OBJ 文件,应用旋转,然后将结果保存到另一个文件。
"""
with open(source_file, 'r') as src:
lines = src.readlines()
with open(target_file, 'w') as tgt:
for line in lines:
if line.startswith('v '):
parts = line.split()
x, y, z = map(float, parts[1:4])
x_new, y_new, z_new = rotate_vertex(x, y, z, axis, angle_degrees)
tgt.write(f"v {x_new} {y_new} {z_new}\n")
else:
tgt.write(line)
def list_files(directory):
for root, dirs, files in os.walk(directory):
for file in files:
yield os.path.join(root, file)
# # #遍历文件夹下的所有文件
# folder_path = 'G://obj_fix/print/wrong'
# nums = 0
# rotate_axis = (0, 1, 0) # 比如绕X轴旋转
# for file_path in list_files(folder_path):
# #print(file_path) G://obj_fix/print/around/preview\9023_preview_117.png
# if "_preview.png" in file_path:
# continue
# if "_right.png" in file_path:
# continue
# if "_wait.png" in file_path:
# continue
# #获取pid 从 "G://obj_fix/print/around/preview\9023_preview_117.png" 中获取 9023 he 117
# arrData = file_path.split('\\')
# lastData = arrData[-1]
# arrLastData = lastData.split('_')
# if len(arrLastData) < 3:
# print(lastData)
# continue
# pid = arrLastData[0]
# angle = arrLastData[2].split('.')[0]
# #判断 angle 第一个数字是否为 0
# source_obj = f'G://obj_fix/print/{pid}/{pid}.obj'
# target_obj = f'G://obj_fix/print/{pid}/{pid}_new.obj'
# nums +=1
# print(f"当前正在处理{pid},已处理至-{nums}",)
# if str(angle[0]) == "0":
# rotate_angle = -int(angle)
# transform_obj_file(source_obj, target_obj, rotate_axis, rotate_angle)
# else:
# rotate_angle = int(angle)
# transform_obj_file(source_obj, target_obj, rotate_axis, rotate_angle)
# print(int(angle))
# print(angle,angle[0])
# # 加载模型
# mesh = o3d.io.read_triangle_mesh(target_obj, enable_post_processing=True)
# # 创建渲染窗口并添加模型
# vis = o3d.visualization.Visualizer()
# vis.create_window()
# vis.add_geometry(mesh)
# # 设置渲染参数
# render_option = vis.get_render_option()
# render_option.point_size = 1.0
# # 渲染模型
# vis.run()
# vis.destroy_window()
pid = "90864" # 98894 115123
source_obj = f'G://obj_fix/auto/{pid}/{pid}.obj'
target_obj = f'G://obj_fix/auto/{pid}/{pid}_90.obj'
#遍历文件夹下的所有文件 /data/datasets/temp/auto_preview_need_around
for file_path in list_files('G://obj_fix/auto'):
pid = file_path.split('\\')[-1].split('_')[0]
# 使用示例:
rotate_axis = (1, 0, 0) # 比如绕X轴旋转 0 x 轴
rotate_angle = -90 # 以度为单位
transform_obj_file(source_obj, target_obj, rotate_axis, rotate_angle)
# rotate_axis = (0, 1, 0) # 比如绕X轴旋转 0 x 轴
# rotate_angle = 60 # 以度为单位
# transform_obj_file(target_obj, target_obj, rotate_axis, rotate_angle)