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.
152 lines
4.8 KiB
152 lines
4.8 KiB
# import numpy as np |
|
# def calculate_rotation_and_center_of_mass(angle_x, angle_y, angle_z, points): |
|
# """计算某一组旋转角度后的重心""" |
|
# # 计算绕X轴、Y轴和Z轴的旋转矩阵 |
|
# R_x = np.array([ |
|
# [1, 0, 0], |
|
# [0, np.cos(np.radians(angle_x)), -np.sin(np.radians(angle_x))], |
|
# [0, np.sin(np.radians(angle_x)), np.cos(np.radians(angle_x))] |
|
# ]) |
|
# |
|
# R_y = np.array([ |
|
# [np.cos(np.radians(angle_y)), 0, np.sin(np.radians(angle_y))], |
|
# [0, 1, 0], |
|
# [-np.sin(np.radians(angle_y)), 0, np.cos(np.radians(angle_y))] |
|
# ]) |
|
# |
|
# R_z = np.array([ |
|
# [np.cos(np.radians(angle_z)), -np.sin(np.radians(angle_z)), 0], |
|
# [np.sin(np.radians(angle_z)), np.cos(np.radians(angle_z)), 0], |
|
# [0, 0, 1] |
|
# ]) |
|
# |
|
# # 综合旋转矩阵 |
|
# R = R_z @ R_y @ R_x |
|
# |
|
# # 执行旋转 |
|
# rotated_points = points @ R.T |
|
# |
|
# # 计算最小z值 |
|
# min_z = np.min(rotated_points[:, 2]) |
|
# |
|
# # 计算平移向量,将最小Z值平移到0 |
|
# translation_vector = np.array([0, 0, -min_z]) |
|
# rotated_points += translation_vector |
|
# |
|
# # 计算重心 |
|
# center_of_mass = np.mean(rotated_points, axis=0) |
|
# |
|
# return center_of_mass[2], angle_x, angle_y, angle_z |
|
# |
|
# def parallel_rotation(points, angle_step=3): |
|
# """顺序计算最优旋转角度(单线程)""" |
|
# min_center_of_mass_y = float('inf') |
|
# best_angle_x, best_angle_y, best_angle_z = 0, 0, 0 |
|
# |
|
# # 遍历所有角度组合 |
|
# for angle_x in range(0, 360, angle_step): |
|
# for angle_y in range(0, 360, angle_step): |
|
# for angle_z in range(0, 360, angle_step): |
|
# center_of_mass_z, ax, ay, az = calculate_rotation_and_center_of_mass( |
|
# angle_x, angle_y, angle_z, points |
|
# ) |
|
# if center_of_mass_z < min_center_of_mass_y: |
|
# min_center_of_mass_y = center_of_mass_z |
|
# best_angle_x, best_angle_y, best_angle_z = ax, ay, az |
|
# |
|
# return best_angle_x, best_angle_y, best_angle_z, min_center_of_mass_y |
|
|
|
|
|
import bpy |
|
import time |
|
import os |
|
from pathlib import Path |
|
|
|
|
|
def clear_scene(): |
|
"""清空当前场景中的所有对象""" |
|
bpy.ops.object.select_all(action='SELECT') |
|
bpy.ops.object.delete() |
|
|
|
|
|
def test_bpy_io(obj_path, output_path): |
|
"""测试 bpy 的 OBJ 读写性能""" |
|
# 读取 OBJ |
|
start_time = time.time() |
|
bpy.ops.import_scene.obj(filepath=obj_path) |
|
read_time = time.time() - start_time |
|
|
|
# 确保场景中有对象 |
|
if not bpy.context.scene.objects: |
|
raise ValueError("未成功导入 OBJ 文件") |
|
|
|
# 写入 OBJ |
|
start_time = time.time() |
|
bpy.ops.export_scene.obj( |
|
filepath=output_path, |
|
use_selection=False, # 导出所有对象 |
|
use_materials=False, # 不导出材质(加快速度) |
|
) |
|
write_time = time.time() - start_time |
|
|
|
# 清理场景 |
|
clear_scene() |
|
|
|
return write_time, read_time |
|
|
|
|
|
def test_folder_objs_with_bpy(folder_path, output_folder="output_objs_bpy"): |
|
"""测试文件夹中所有 OBJ 文件的读写性能(使用 bpy)""" |
|
# 确保输出文件夹存在 |
|
Path(output_folder).mkdir(exist_ok=True) |
|
|
|
# 收集所有 OBJ 文件 |
|
obj_files = [f for f in os.listdir(folder_path) if f.lower().endswith('.obj')] |
|
|
|
if not obj_files: |
|
print(f"在文件夹 {folder_path} 中未找到 OBJ 文件") |
|
return |
|
|
|
print(f"找到 {len(obj_files)} 个 OBJ 文件,开始测试...") |
|
|
|
results = [] |
|
|
|
for obj_file in obj_files: |
|
input_path = os.path.join(folder_path, obj_file) |
|
output_path = os.path.join(output_folder, f"bpy_{obj_file}") |
|
|
|
print(f"\n测试文件: {obj_file}") |
|
|
|
try: |
|
write_time, read_time = test_bpy_io(input_path, output_path) |
|
file_size = os.path.getsize(input_path) / (1024 * 1024) # MB |
|
|
|
print(f" 文件大小: {file_size:.2f} MB") |
|
print(f" bpy 读取时间: {read_time:.3f}s") |
|
print(f" bpy 写入时间: {write_time:.3f}s") |
|
|
|
results.append({ |
|
"filename": obj_file, |
|
"size_mb": file_size, |
|
"read_time": read_time, |
|
"write_time": write_time, |
|
}) |
|
|
|
except Exception as e: |
|
print(f" 处理 {obj_file} 时出错: {e}") |
|
|
|
# 计算平均时间 |
|
if results: |
|
avg_read = sum(r["read_time"] for r in results) / len(results) |
|
avg_write = sum(r["write_time"] for r in results) / len(results) |
|
print("\n=== 汇总结果 ===") |
|
print(f"平均读取时间: {avg_read:.3f}s") |
|
print(f"平均写入时间: {avg_write:.3f}s") |
|
|
|
|
|
if __name__ == "__main__": |
|
# 设置包含OBJ文件的文件夹路径 |
|
obj_folder = "/data/datasets_20t/9_big/" # 替换为你的OBJ文件夹路径 |
|
|
|
# 运行测试 |
|
test_folder_objs_with_bpy(obj_folder)
|
|
|