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
2024-12-19 21:13:07 +08:00
from scripts . geometry_utils import calculate_bounding_box
2024-12-17 22:52:11 +08:00
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 )
2024-12-19 21:13:07 +08:00
bounding_coords = calculate_bounding_box ( obj_path )
2024-12-17 22:52:11 +08:00
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. " )
2024-12-19 21:13:07 +08:00
parser . add_argument ( " --brightness " , type = str , default = " Very Dark " , choices = BRIGHTNESS . keys ( ) , help = " Brightness level for the rendered image. Options: Very Bright, Bright, Medium Bright, Dark, Very Dark. " )
2024-12-17 22:52:11 +08:00
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 ( )