Files
BlenderLLM/modeling.py

71 lines
3.1 KiB
Python
Raw Normal View History

2024-12-17 22:52:11 +08:00
import os
import argparse
from scripts.infer import generate_response
from scripts.blender_runner import run_blender_script
from scripts.geometry_utils import parse_obj_file, calculate_bounding_box
from scripts.config import CAMERA_ANGLES, BRIGHTNESS
def generate_blender_script(model_name, prompt):
"""Generate a Blender script based on the given model and prompt."""
return generate_response(model_name, prompt)
def ensure_output_folder_exists(output_folder):
"""Check if the output folder exists, and create it if not."""
if not os.path.exists(output_folder):
os.makedirs(output_folder)
def run_script_and_save_obj(script, obj_name, output_folder, blender_executable):
"""Run Blender script to save the generated .obj file."""
ensure_output_folder_exists(output_folder)
run_blender_script(
script, obj_name, output_folder, [], [], (), blender_executable, save_obj=True
)
return os.path.join(output_folder, f"{obj_name}.obj")
def calculate_and_render_image(script, obj_name, output_folder, obj_path, blender_executable, brightness):
"""Calculate bounding box and render the image using Blender script."""
ensure_output_folder_exists(output_folder)
vertices = parse_obj_file(obj_path)
bounding_coords = calculate_bounding_box(vertices)
brightness_value = BRIGHTNESS.get(brightness, BRIGHTNESS["Very Dark"])
run_blender_script(
script,
obj_name,
output_folder,
bounding_coords,
CAMERA_ANGLES,
brightness_value,
blender_executable,
save_image=True,
)
def parse_arguments():
"""Parse command-line arguments."""
parser = argparse.ArgumentParser(description="Run Blender Script to Generate 3D Objects and Images.")
parser.add_argument("--model_name", type=str, default="BlenderLLM", help="Model path to generate the script.")
parser.add_argument("--prompt", type=str, required=True, default="Please drow a cube.", help="Text prompt to describe the object.")
parser.add_argument("--obj_name", type=str, default="cube", help="Name of the generated object file.")
parser.add_argument("--output_folder", type=str, default="images/cube", help="Folder to save output files.")
parser.add_argument("--blender_executable", type=str, default="blender", help="Path to Blender executable.")
parser.add_argument("--brightness", type=str, default="Dark", choices=BRIGHTNESS.keys(), help="Brightness level for the rendered image. Options: Very Bright, Bright, Medium Bright, Dark, Very Dark.")
return parser.parse_args()
def main():
args = parse_arguments()
script = generate_blender_script(args.model_name, args.prompt)
print(f"The bpy script of {args.obj_name} is:\n{script}")
obj_path = run_script_and_save_obj(
script, args.obj_name, args.output_folder, args.blender_executable
)
print(f"OBJ file saved at {obj_path}.")
calculate_and_render_image(
script, args.obj_name, args.output_folder, obj_path, args.blender_executable, args.brightness
)
print(f"Image rendered and saved in {args.output_folder} folder.")
if __name__ == "__main__":
main()