Spaces:
Running
on
Zero
Running
on
Zero
File size: 2,380 Bytes
17cd746 |
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 |
#
# Toyota Motor Europe NV/SA and its affiliated companies retain all intellectual
# property and proprietary rights in and to this software and related documentation.
# Any commercial use, reproduction, disclosure or distribution of this software and
# related documentation without an express license agreement from Toyota Motor Europe NV/SA
# is strictly prohibited.
#
import torch
def get_mtl_content(tex_fname):
return f'newmtl Material\nmap_Kd {tex_fname}\n'
def get_obj_content(vertices, faces, uv_coordinates=None, uv_indices=None, mtl_fname=None):
obj = ('# Generated with multi-view-head-tracker\n')
if mtl_fname is not None:
obj += f'mtllib {mtl_fname}\n'
obj += 'usemtl Material\n'
# Write the vertices
for vertex in vertices:
obj += f"v {vertex[0]} {vertex[1]} {vertex[2]}\n"
# Write the UV coordinates
if uv_coordinates is not None:
for uv in uv_coordinates:
obj += f"vt {uv[0]} {uv[1]}\n"
# Write the faces with UV indices
if uv_indices is not None:
for face, uv_indices in zip(faces, uv_indices):
obj += f"f {face[0]+1}/{uv_indices[0]+1} {face[1]+1}/{uv_indices[1]+1} {face[2]+1}/{uv_indices[2]+1}\n"
else:
for face in faces:
obj += f"f {face[0]+1} {face[1]+1} {face[2]+1}\n"
return obj
def normalize_image_points(u, v, resolution):
"""
normalizes u, v coordinates from [0 ,image_size] to [-1, 1]
:param u:
:param v:
:param resolution:
:return:
"""
u = 2 * (u - resolution[1] / 2.0) / resolution[1]
v = 2 * (v - resolution[0] / 2.0) / resolution[0]
return u, v
def face_vertices(vertices, faces):
"""
:param vertices: [batch size, number of vertices, 3]
:param faces: [batch size, number of faces, 3]
:return: [batch size, number of faces, 3, 3]
"""
assert vertices.ndimension() == 3
assert faces.ndimension() == 3
assert vertices.shape[0] == faces.shape[0]
assert vertices.shape[2] == 3
assert faces.shape[2] == 3
bs, nv = vertices.shape[:2]
bs, nf = faces.shape[:2]
device = vertices.device
faces = faces + (torch.arange(bs, dtype=torch.int32).to(device) * nv)[:, None, None]
vertices = vertices.reshape((bs * nv, 3))
# pytorch only supports long and byte tensors for indexing
return vertices[faces.long()]
|