news 2026/6/10 1:15:37

bpy 缩放模型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
bpy 缩放模型

缩小1000倍,单位从m,换成mm

import bpy import os import glob from mathutils import Vector def clear_scene(): """清空当前场景的所有物体""" # 选择所有物体 bpy.ops.object.select_all(action='SELECT') # 删除所有选中的物体 bpy.ops.object.delete(use_global=False) def import_glb(filepath): """导入 GLB 文件""" # 导入 GLB bpy.ops.import_scene.gltf(filepath=filepath) # 获取导入的所有物体 imported_objects = [obj for obj in bpy.context.selected_objects] if not imported_objects: # 如果没有选中的物体,尝试获取场景中的所有物体 imported_objects = [obj for obj in bpy.data.objects if obj.type in {'MESH', 'ARMATURE', 'EMPTY'}] return imported_objects def scale_objects(objects, scale_factor): """缩放物体列表中的所有物体""" if not objects: print("警告:没有找到需要缩放的物体") return False # 记录当前选中的物体 previous_selection = bpy.context.selected_objects.copy() previous_active = bpy.context.active_object # 全不选 bpy.ops.object.select_all(action='DESELECT') # 选择要缩放的物体 for obj in objects: if obj and obj.name in bpy.data.objects: obj.select_set(True) # 设置活动物体 if objects: bpy.context.view_layer.objects.active = objects[0] # 执行缩放 bpy.ops.transform.resize(value=(scale_factor, scale_factor, scale_factor)) # 应用缩放变换 bpy.ops.object.transform_apply(scale=True, location=False, rotation=False) # 恢复之前的选中状态 bpy.ops.object.select_all(action='DESELECT') for obj in previous_selection: if obj and obj.name in bpy.data.objects: obj.select_set(True) if previous_active and previous_active.name in bpy.data.objects: bpy.context.view_layer.objects.active = previous_active return True def export_to_glb(filepath): """导出为 GLB 文件""" # 确保导出时使用正确的单位设置 bpy.context.scene.unit_settings.system = 'METRIC' bpy.context.scene.unit_settings.scale_length = 0.001 # 毫米单位 # 导出 GLB bpy.ops.export_scene.gltf(filepath=filepath, export_format='GLB', export_apply=True, export_yup=True, export_texcoords=True, export_normals=True, export_draco_mesh_compression_enable=False, ) return True def process_glb_files(input_dir, output_dir=None, scale_factor=0.001): """ 批量处理 GLB 文件 参数: input_dir: 输入目录路径 output_dir: 输出目录路径(如果为 None,则覆盖原文件) scale_factor: 缩放因子(默认 0.001,米→毫米) """ # 查找所有 GLB 文件 glb_files = glob.glob(os.path.join(input_dir, "*.glb")) glb_files.extend(glob.glob(os.path.join(input_dir, "*.GLB"))) if not glb_files: print(f"错误:在目录 {input_dir} 中没有找到 GLB 文件") return False print(f"找到 {len(glb_files)} 个 GLB 文件") print("=" * 60) # 创建输出目录(如果需要) if output_dir and not os.path.exists(output_dir): os.makedirs(output_dir) print(f"创建输出目录:{output_dir}") success_count = 0 fail_count = 0 for i, input_file in enumerate(glb_files, 1): print(f"\n[{i}/{len(glb_files)}] 处理: {os.path.basename(input_file)}") try: # 清空场景 clear_scene() # 导入 GLB print(" → 导入文件...") imported_objects = import_glb(input_file) if not imported_objects: print(" ✗ 导入失败:没有找到物体") fail_count += 1 continue print(f" → 导入完成,找到 {len(imported_objects)} 个物体") # 缩放物体 print(f" → 缩放物体 (因子: {scale_factor})...") if not scale_objects(imported_objects, scale_factor): print(" ✗ 缩放失败") fail_count += 1 continue print(" ✓ 缩放完成") # 确定输出路径 if output_dir: output_file = os.path.join(output_dir, os.path.basename(input_file)) else: # 覆盖原文件,先保存到临时文件再替换 temp_file = input_file + ".tmp" output_file = input_file # 导出 GLB print(f" → 导出文件...") if export_to_glb(output_file): print(f" ✓ 导出成功: {os.path.basename(output_file)}") success_count += 1 # 如果使用临时文件,替换原文件 if not output_dir and output_file == input_file: pass # 直接覆盖 else: print(f" ✗ 导出失败") fail_count += 1 except Exception as e: print(f" ✗ 处理失败: {str(e)}") fail_count += 1 # 清理临时文件 if not output_dir: temp_files = glob.glob(os.path.join(input_dir, "*.tmp")) for temp_file in temp_files: try: os.remove(temp_file) except: pass print("\n" + "=" * 60) print(f"处理完成!") print(f"成功: {success_count} 个") print(f"失败: {fail_count} 个") print("=" * 60) return success_count > 0 def main(): """主函数 - 配置在这里修改""" # 输入目录(包含需要转换的 GLB 文件) INPUT_DIR = r"E:\project\3d_label\three-bvh-csg-main\examples\kakou" # 输出目录(None 表示覆盖原文件,否则指定新目录) OUTPUT_DIR = r"E:\project\3d_label\three-bvh-csg-main\examples\kakou_s" # OUTPUT_DIR = None # 取消注释此行可覆盖原文件 # 缩放因子(0.001 = 米转毫米,1 = 不变,1000 = 毫米转米) SCALE_FACTOR = 0.001 # 检查输入目录 if not os.path.exists(INPUT_DIR): print(f"错误:输入目录不存在 - {INPUT_DIR}") return # 询问确认 print(f"输入目录: {INPUT_DIR}") if OUTPUT_DIR: print(f"输出目录: {OUTPUT_DIR}") else: print(f"输出模式: 覆盖原文件(不可恢复!)") print(f"缩放因子: {SCALE_FACTOR} (米→毫米)") print() # 处理文件 process_glb_files(INPUT_DIR, OUTPUT_DIR, SCALE_FACTOR) # 运行主函数 if __name__ == "__main__": main()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 1:14:37

机器学习之聚类算法-KMeans

聚类算法,根据样本之间的相似性,将样本划分到不同的类别中。聚类算法有: K-means聚类、层次聚类、 DBSCAN聚类、谱聚类等,其中,主要以K均值K-Means算法最为常用,k-Means是一种无监督学习的聚类算法&#xf…

作者头像 李华
网站建设 2026/6/10 1:13:54

minhash算法

MinHash(最小哈希)算法是一种在计算机科学中用于快速估计两个集合之间相似度的算法。它由 Andrei Broder 在1997年提出,最初用于搜索引擎中网页去重和聚类。 在大数据环境下,如果直接比对两个海量集合的交集和并集,计…

作者头像 李华
网站建设 2026/6/10 1:10:58

AI智能体开发路线图:从入门到精通的全栈技能树

Agent开发者的进阶指南 三阶段能力模型全解析 2026年,AI Agent已经从"技术玩具"变成了"生产力刚需"。企业招人不再问"你会不会调API",而是问**“你能不能让Agent自主完成一个业务流程”**。 这条赛道正在疯狂吸收人才&am…

作者头像 李华
网站建设 2026/6/10 1:10:56

从“神圣巧匠”到AI问诊——工匠精神才是临床正道

中医经典《难经》中有这样一段话:“望而知之谓之神,闻而知之谓之圣,问而知之谓之工,切脉而知之谓之巧。”自古以来,人们总是对“神”“圣”“巧”充满向往,认为能够看一眼面色舌象就断病、听一下声音气味就…

作者头像 李华
网站建设 2026/6/10 1:08:06

video设计在高层次综合设计中难题

一、hls擅长的设计 1.关于hls::stream的设计是hls擅长的 2.hls::stream这个类是hls专门创造的,也说明了它就是擅长设计流模式 二、hls不擅长的video格式 1.数字图像中图像经常有vs,hs,de,这种时序接口,使用rtl其实很好设计,但是 在…

作者头像 李华
网站建设 2026/6/10 1:06:57

题解:洛谷 B4496 [GESP202603 一级] 数字替换

本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。 欢迎大…

作者头像 李华