| 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) |
|
|