|
import numpy as np |
|
import torch |
|
from PIL import Image |
|
from pytorch3d.renderer import ( |
|
TexturesVertex, |
|
) |
|
from .project_mesh import ( |
|
get_cameras_list_azi_ele, |
|
multiview_color_projection |
|
|
|
) |
|
from .utils import save_py3dmesh_with_trimesh_fast |
|
|
|
def projection(meshes, |
|
img_list, |
|
weights, |
|
azimuths, |
|
elevations, |
|
projection_type='orthographic', |
|
auto_center=True, |
|
resolution=1024, |
|
fovy=None, |
|
radius=None, |
|
ortho_dist=1.1, |
|
scale_factor=1.0, |
|
save_glb_addr=None, |
|
scale_verts=True, |
|
complete_unseen=True, |
|
below_confidence_strategy="smooth" |
|
): |
|
|
|
assert len(img_list) == len(azimuths) == len(elevations) == len(weights), f"len(img_list) ({len(img_list)}) != len(azimuths) ({len(azimuths)}) != len(elevations) ({len(elevations)}) != len(weights) ({len(weights)})" |
|
|
|
projection_types = ['perspective', 'orthographic'] |
|
assert projection_type in projection_types, f"projection_type ({projection_type}) should be one of {projection_types}" |
|
|
|
if auto_center: |
|
verts = meshes.verts_packed() |
|
max_bb = (verts - 0).max(0)[0] |
|
min_bb = (verts - 0).min(0)[0] |
|
scale = (max_bb - min_bb).max() / 2 |
|
center = (max_bb + min_bb) / 2 |
|
meshes.offset_verts_(-center) |
|
if scale_verts: |
|
meshes.scale_verts_((scale_factor / float(scale))) |
|
elif scale_verts: |
|
meshes.scale_verts_((scale_factor)) |
|
|
|
if projection_type == 'perspective': |
|
assert fovy is not None and radius is not None, f"fovy ({fovy}) and radius ({radius}) should not be None when projection_type is 'perspective'" |
|
cameras = get_cameras_list_azi_ele(azimuths, elevations, fov_in_degrees=fovy,device="cuda", dist=radius, cam_type='fov') |
|
elif projection_type == 'orthographic': |
|
cameras = get_cameras_list_azi_ele(azimuths, elevations, fov_in_degrees=fovy, device="cuda", focal=2/1.35, dist=ortho_dist, cam_type='orthographic') |
|
|
|
|
|
num_meshes = len(meshes) |
|
num_verts_per_mesh = meshes.verts_packed().shape[0] // num_meshes |
|
black_texture = torch.zeros((num_meshes, num_verts_per_mesh, 3), device="cuda") |
|
textures = TexturesVertex(verts_features=black_texture) |
|
meshes.textures = textures |
|
|
|
|
|
proj_mesh = multiview_color_projection(meshes, img_list, cameras, weights=weights, eps=0.05, resolution=resolution, device="cuda", reweight_with_cosangle="square", use_alpha=True, confidence_threshold=0.1, complete_unseen=complete_unseen, below_confidence_strategy=below_confidence_strategy) |
|
|
|
|
|
if save_glb_addr is not None: |
|
save_py3dmesh_with_trimesh_fast(proj_mesh, save_glb_addr) |
|
|
|
|
|
|