| import os |
| import pickle |
| import sys |
| from argparse import ArgumentParser |
|
|
| try: |
| import bpy |
| sys.path.append(os.path.dirname(bpy.data.filepath)) |
| except ImportError: |
| raise ImportError( |
| "Blender is not properly installed or not launch properly. See README.md to have instruction on how to install and use blender.") |
|
|
| import mld.launch.blender |
| from mld.render.blender import render |
|
|
|
|
| def parse_args(): |
| parser = ArgumentParser() |
| parser.add_argument("--pkl", type=str, default=None, help="pkl motion file") |
| parser.add_argument("--dir", type=str, default=None, help="pkl motion folder") |
| parser.add_argument("--mode", type=str, default="sequence", help="render target: video, sequence, frame") |
| parser.add_argument("--res", type=str, default="high") |
| parser.add_argument("--denoising", type=bool, default=True) |
| parser.add_argument("--oldrender", type=bool, default=True) |
| parser.add_argument("--accelerator", type=str, default='gpu', help='accelerator device') |
| parser.add_argument("--device", type=int, nargs='+', default=[0], help='gpu ids') |
| parser.add_argument("--faces_path", type=str, default='./deps/smpl_models/smplh/smplh.faces') |
| parser.add_argument("--always_on_floor", action="store_true", help='put all the body on the floor (not recommended)') |
| parser.add_argument("--gt", type=str, default=False, help='green for gt, otherwise orange') |
| parser.add_argument("--fps", type=int, default=20, help="the frame rate of the rendered video") |
| parser.add_argument("--num", type=int, default=8, help="the number of frames rendered in 'sequence' mode") |
| parser.add_argument("--exact_frame", type=float, default=0.5, help="the frame id selected under 'frame' mode ([0, 1])") |
| cfg = parser.parse_args() |
| return cfg |
|
|
|
|
| def render_cli() -> None: |
| cfg = parse_args() |
|
|
| if cfg.pkl: |
| paths = [cfg.pkl] |
| elif cfg.dir: |
| paths = [] |
| file_list = os.listdir(cfg.dir) |
| for item in file_list: |
| if item.endswith("_mesh.pkl"): |
| paths.append(os.path.join(cfg.dir, item)) |
| else: |
| raise ValueError(f'{cfg.pkl} and {cfg.dir} are both None!') |
|
|
| for path in paths: |
| try: |
| with open(path, 'rb') as f: |
| pkl = pickle.load(f) |
| data = pkl['vertices'] |
| trajectory = pkl['hint'] |
|
|
| except FileNotFoundError: |
| print(f"{path} not found") |
| continue |
|
|
| render( |
| data, |
| trajectory, |
| path, |
| exact_frame=cfg.exact_frame, |
| num=cfg.num, |
| mode=cfg.mode, |
| faces_path=cfg.faces_path, |
| always_on_floor=cfg.always_on_floor, |
| oldrender=cfg.oldrender, |
| res=cfg.res, |
| gt=cfg.gt, |
| accelerator=cfg.accelerator, |
| device=cfg.device, |
| fps=cfg.fps) |
|
|
|
|
| if __name__ == "__main__": |
| render_cli() |
|
|