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.
157 lines
7.4 KiB
157 lines
7.4 KiB
import os, sys, time, argparse, requests, json, re, oss2 |
|
import bpy, bmesh |
|
import open3d as o3d |
|
import numpy as np |
|
# import cupy as cp |
|
from mathutils import Matrix |
|
import math |
|
import logging |
|
import matplotlib.pyplot as plt |
|
|
|
|
|
def get_auto_obj_bake_vertex_ply(obj_filepath, save_ply_path): |
|
start_time = time.time() |
|
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}: Getting ply vertex from {obj_filepath}') |
|
bpy.ops.object.select_all(action='DESELECT') |
|
bpy.ops.object.select_by_type(type='MESH') |
|
bpy.ops.object.delete(use_global=False, confirm=False) |
|
bpy.ops.wm.obj_import(filepath=obj_filepath) |
|
|
|
obj_original = [obj for obj in bpy.data.objects if obj.type == 'MESH'][0] |
|
bpy.context.view_layer.objects.active = obj_original |
|
obj_original.select_set(True) |
|
pid = obj_original.name |
|
|
|
obj_num_vertices = len(obj_original.data.vertices) |
|
# print(f"模型 {pid} 顶点数量:", len(obj_original.data.vertices)) |
|
|
|
# 选择新分离出来的网格对象,并将该对象设为进活动对象 |
|
bpy.ops.object.select_all(action='DESELECT') |
|
bpy.context.view_layer.objects.active = obj_original |
|
obj_original.select_set(True) |
|
|
|
# 添加颜色属性 |
|
bpy.ops.geometry.color_attribute_add() |
|
# 节点的创建: |
|
nodes = bpy.context.active_object.active_material.node_tree.nodes |
|
links = bpy.context.active_object.active_material.node_tree.links |
|
tex_coord = nodes.new("ShaderNodeTexCoord") |
|
Mapping = nodes.new('ShaderNodeMapping') |
|
vertex_color = nodes.new("ShaderNodeVertexColor") |
|
tex_coord.location = (-800, 600) |
|
Mapping.location = (-500, 200) |
|
vertex_color.location = (-200, 600) |
|
|
|
# 节点之间的连接: |
|
# 纹理坐标的UV 连接 映射的矢量;映射的矢量 连接 纹理贴图的矢量;原理化BSDF删除;纹理贴图的矢量 连接 表(曲)面。 |
|
links.new(tex_coord.outputs[2], nodes['Mapping'].inputs[0]) |
|
links.new(Mapping.outputs[0], nodes['Image Texture'].inputs[0]) |
|
principled_bsdf = nodes.get("Principled BSDF") |
|
nodes.remove(principled_bsdf) |
|
links.new(nodes['Image Texture'].outputs[0], nodes['Material Output'].inputs[0]) |
|
|
|
# 4.渲染烘焙相关操作 |
|
bpy.context.scene.render.engine = 'CYCLES' |
|
bpy.context.scene.cycles.device = 'GPU' |
|
bpy.context.scene.cycles.preview_samples = 1 |
|
bpy.context.scene.cycles.samples = 1 |
|
bpy.context.scene.cycles.bake_type = 'EMIT' |
|
bpy.context.scene.render.bake.use_selected_to_active = False |
|
bpy.context.scene.render.bake.target = 'VERTEX_COLORS' |
|
bpy.ops.object.bake(type='EMIT') # 开始 Bake |
|
|
|
# 连接节点 Color Attribute 和 节点 Material Output |
|
links.new(nodes['Color Attribute'].outputs[0], nodes['Material Output'].inputs[0]) |
|
|
|
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}: Bake EMIT time: ', time.time() - start_time) |
|
start_time = time.time() |
|
|
|
# 5.输出模型 |
|
# bpy.ops.wm.save_as_mainfile(filepath='/data/datasets/plys/121614.bend') |
|
bpy.ops.wm.ply_export(filepath=save_ply_path, apply_modifiers=True, export_selected_objects=True, export_uv=False, |
|
export_normals=False, export_colors='SRGB', export_triangulated_mesh=False, ascii_format=True) |
|
bpy.data.objects.remove(obj_original, do_unlink=True) |
|
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}: Save ply time: ', time.time() - start_time) |
|
|
|
return obj_num_vertices |
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
# workdir = '/data/datasets/suwa_cut/data/auto/' |
|
# output = '/data/datasets/plys/auto/' |
|
workdir = 'G:\obj_fix\print' |
|
output = 'G:\obj_fix\ply\whole_obj_bake_vertex_high_ply' |
|
directory = f'G:\obj_fix/print/right' |
|
#遍历获取 G:\obj_fix\print\right 目录的文件,根据文件名获取 pid |
|
for file_name in os.listdir(directory): |
|
# 获取文件的完整路径 |
|
file_path = os.path.join(directory, file_name) |
|
# 检查是否是文件 |
|
if os.path.isfile(file_path): |
|
# |
|
arrFileName = file_name.split('_') |
|
pid = arrFileName[0] |
|
if int(pid) == 0: |
|
continue |
|
|
|
print(f"File: {file_name}, PID: {pid}") |
|
|
|
#判断文件是否存在 |
|
file_path = os.path.join(output, f'{pid}.ply') |
|
if os.path.exists(file_path) and os.path.isfile(file_path): |
|
print("文件已存在,跳过循环!!!") |
|
continue |
|
|
|
obj_filepath = os.path.join(workdir, f'{pid}/{pid}.obj') |
|
save_ply_path = os.path.join(output, f'{pid}.ply') |
|
if not os.path.exists(obj_filepath): |
|
print(f"{obj_filepath} 文件不存在,跳过循环!!!") |
|
continue |
|
|
|
obj_num_vertices = get_auto_obj_bake_vertex_ply(obj_filepath, save_ply_path) |
|
if obj_num_vertices == 0: |
|
print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}: 模型 {pid} 程序getHeadCount()无法找到模型人数!总共运行时间: ', time.time() - start_time0) |
|
logging.info(f'模型 {pid} 顶点数量: {obj_num_vertices},程序getHeadCount()无法找到模型人数!,程序总共运行时间: {time.time() - start_time0:.2f} 秒') |
|
continue |
|
# # 从文件名中提取 pid |
|
# pid = extract_pid(file_name) |
|
# if pid: |
|
# print(f"File: {file_name}, PID: {pid}") |
|
# else: |
|
# print(f"Unable to extract PID from file: {file_name}") |
|
|
|
|
|
# return |
|
# listdir_pids = os.listdir(workdir) |
|
# for pid in listdir_pids: |
|
# file_path = os.path.join(output, f'{pid}/{pid}.ply') |
|
# if os.path.exists(file_path) and os.path.isfile(file_path): |
|
# print("文件已存在,跳过循环!!!") |
|
# continue |
|
|
|
# print(pid) |
|
# logging.basicConfig(filename=f'/data/datasets/plys/auto_vertex_time.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') |
|
# start_time0 = time.time() |
|
# print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}: 模型 {pid} 开始运行时间: ', start_time0) |
|
# # 判断输出目录是否存在 |
|
# if not os.path.exists(os.path.join(output, f'{pid}/')): |
|
# os.makedirs(os.path.join(output, f'{pid}/')) |
|
|
|
# obj_filepath = os.path.join(workdir, f'{pid}/{pid}_cpd.obj') |
|
# save_ply_path = os.path.join(output, f'{pid}/{pid}.ply') |
|
# if not os.path.exists(obj_filepath): |
|
# print(f"{obj_filepath} 文件不存在,跳过循环!!!") |
|
# continue |
|
|
|
# obj_num_vertices = get_auto_obj_bake_vertex_ply(obj_filepath, save_ply_path) |
|
# if obj_num_vertices == 0: |
|
# print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}: 模型 {pid} 程序getHeadCount()无法找到模型人数!总共运行时间: ', time.time() - start_time0) |
|
# logging.info(f'模型 {pid} 顶点数量: {obj_num_vertices},程序getHeadCount()无法找到模型人数!,程序总共运行时间: {time.time() - start_time0:.2f} 秒') |
|
# continue |
|
|
|
# print(f'{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}: 模型 {pid} 顶点数量: {obj_num_vertices} 程序总共运行时间: ', time.time() - start_time0) |
|
# logging.info(f'模型 {pid} 顶点数量: {obj_num_vertices},程序总共运行时间: {time.time() - start_time0:.2f} 秒') |
|
# # 退出 Blender 并释放资源 |
|
# bpy.ops.wm.quit_blender() |
|
|