import torch import math from pathlib import Path import time def euler_rotation(rx=0, ry=0, rz=0, backwards=False): Ms = [] if rz != 0: cosz = math.cos(rz) sinz = math.sin(rz) Ms.append(torch.tensor( [[cosz, -sinz, 0], [sinz, cosz, 0], [0, 0, 1]])) if ry != 0: cosy = math.cos(ry) siny = math.sin(ry) Ms.append(torch.tensor( [[cosy, 0, siny], [0, 1, 0], [-siny, 0, cosy]])) if rx != 0: cosx = math.cos(rx) sinx = math.sin(rx) Ms.append(torch.tensor( [[1, 0, 0], [0, cosx, -sinx], [0, sinx, cosx]])) rotation = torch.eye(3) if backwards and len(Ms) > 0: Ms = Ms[::-1] for mat in Ms[::-1]: rotation = torch.matmul(rotation, mat) return rotation def export(file, vs, faces, vn=None, color=None): with open(file, 'w+') as f: for vi, v in enumerate(vs): if color is None: f.write("v %f %f %f\n" % (v[0], v[1], v[2])) else: f.write("v %f %f %f %f %f %f\n" % (v[0], v[1], v[2], color[vi][0], color[vi][1], color[vi][2])) if vn is not None: f.write("vn %f %f %f\n" % (vn[vi, 0], vn[vi, 1], vn[vi, 2])) for face in faces: f.write("f %d %d %d\n" % (face[0] + 1, face[1] + 1, face[2] + 1)) def xyz2tensor(txt, append_normals=False): pts = [] for line in txt.split('\n'): line = line.strip() line = line.lstrip('v ') spt = line.split(' ') if 'nan' in line: continue if len(spt) == 6: pts.append(torch.tensor([float(x) for x in spt])) if len(spt) == 3: t = [float(x) for x in spt] if append_normals: t += [0.0 for _ in range(3)] pts.append(torch.tensor(t)) rtn = torch.stack(pts, dim=0) return rtn def read_xyz_file(path: Path): with open(path, 'r') as file: return xyz2tensor(file.read(), append_normals=True) def embed_color(img: torch.Tensor, color, box_size=70): shp = img.shape D2 = [shp[2] - box_size, shp[2]] D3 = [shp[3] - box_size, shp[3]] img = img.clone() img[:, :3, D2[0]:D2[1], D3[0]:D3[1]] = color[:, :, None, None] if img.shape[1] == 4: img[:, -1, D2[0]:D2[1], D3[0]:D3[1]] = 1 return img def get_n_params(model): pp=0 for p in list(model.parameters()): nn=1 for s in list(p.size()): nn = nn*s pp += nn return pp def xyz2tensor(txt, append_normals=False): pts = [] for line in txt.split('\n'): line = line.strip() line = line.lstrip('v ') spt = line.split(' ') if 'nan' in line: continue if len(spt) == 6: pts.append(torch.tensor([float(x) for x in spt])) if len(spt) == 3: t = [float(x) for x in spt] if append_normals: t += [0.0 for _ in range(3)] pts.append(torch.tensor(t)) rtn = torch.stack(pts, dim=0) return rtn def read_xyz_file(path: Path): with open(path, 'r') as file: return xyz2tensor(file.read(), append_normals=True)