Spaces:
Build error
Build error
File size: 5,304 Bytes
f0a0274 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 |
import math
import os
import sys
import smplx
# import bpy
import numpy as np
from .camera import Camera
from .floor import get_trajectory, plot_floor, show_traj
from .sampler import get_frameidx
from .scene import setup_scene # noqa
from .tools import delete_objs, load_numpy_vertices_into_blender, style_detect
from .vertices import prepare_vertices
from mGPT.utils.joints import smplh_to_mmm_scaling_factor
def prune_begin_end(data, perc):
to_remove = int(len(data) * perc)
if to_remove == 0:
return data
return data[to_remove:-to_remove]
def render_current_frame(path):
bpy.context.scene.render.filepath = path
bpy.ops.render.render(use_viewport=True, write_still=True)
def render(npydata,
frames_folder,
*,
mode,
model_path,
faces_path,
gt=False,
exact_frame=None,
num=8,
downsample=True,
canonicalize=True,
always_on_floor=False,
denoising=True,
oldrender=True,
res="high",
init=True,
accelerator='gpu',
device=[0]):
if init:
# Setup the scene (lights / render engine / resolution etc)
setup_scene(res=res,
denoising=denoising,
oldrender=oldrender,
accelerator=accelerator,
device=device)
is_mesh, is_smplx, jointstype = style_detect(npydata)
if not is_mesh:
npydata = npydata * smplh_to_mmm_scaling_factor
if is_smplx:
smplx_model_male = smplx.create(model_path,
model_type='smplx',
gender='male',
ext='npz',
num_betas=10,
flat_hand_mean=True,
use_pca=False)
faces_path = smplx_model_male.faces
# Put everything in this folder
if mode == "video":
if always_on_floor:
frames_folder += "_of"
os.makedirs(frames_folder, exist_ok=True)
# if it is a mesh, it is already downsampled
if downsample and not is_mesh:
npydata = npydata[::8]
elif mode == "sequence":
img_name, ext = os.path.splitext(frames_folder)
if always_on_floor:
img_name += "_of"
img_path = f"{img_name}{ext}"
elif mode == "frame":
img_name, ext = os.path.splitext(frames_folder)
if always_on_floor:
img_name += "_of"
img_path = f"{img_name}_{exact_frame}{ext}"
# remove X% of begining and end
# as it is almost always static
# in this part
if mode == "sequence":
perc = 0.2
npydata = prune_begin_end(npydata, perc)
if is_mesh:
from .meshes import Meshes
data = Meshes(npydata,
gt=gt,
mode=mode,
faces_path=faces_path,
canonicalize=canonicalize,
always_on_floor=always_on_floor,
is_smplx=is_smplx)
else:
from .joints import Joints
data = Joints(npydata,
gt=gt,
mode=mode,
canonicalize=canonicalize,
always_on_floor=always_on_floor,
jointstype=jointstype)
# Number of frames possible to render
nframes = len(data)
# Show the trajectory
show_traj(data.trajectory)
# Create a floor
plot_floor(data.data, big_plane=False)
# initialize the camera
camera = Camera(first_root=data.get_root(0), mode=mode, is_mesh=is_mesh)
frameidx = get_frameidx(mode=mode,
nframes=nframes,
exact_frame=exact_frame,
frames_to_keep=num)
nframes_to_render = len(frameidx)
# center the camera to the middle
if mode == "sequence":
camera.update(data.get_mean_root())
imported_obj_names = []
for index, frameidx in enumerate(frameidx):
if mode == "sequence":
frac = index / (nframes_to_render - 1)
mat = data.get_sequence_mat(frac)
else:
mat = data.mat
camera.update(data.get_root(frameidx))
islast = index == (nframes_to_render - 1)
objname = data.load_in_blender(frameidx, mat)
name = f"{str(index).zfill(4)}"
if mode == "video":
path = os.path.join(frames_folder, f"frame_{name}.png")
else:
path = img_path
if mode == "sequence":
imported_obj_names.extend(objname)
elif mode == "frame":
camera.update(data.get_root(frameidx))
if mode != "sequence" or islast:
render_current_frame(path)
delete_objs(objname)
bpy.ops.wm.save_as_mainfile(filepath=frames_folder.replace('.png','.blend').replace('_frames','.blend'))
# remove every object created
delete_objs(imported_obj_names)
delete_objs(["Plane", "myCurve", "Cylinder"])
if mode == "video":
return frames_folder
else:
return img_path
|