-
Notifications
You must be signed in to change notification settings - Fork 60
Open
Description
I'm computing a constrained delaunay triangulation of an input UV parameterization, and I want to exactly maintain all input edges, so I passed them all through the segments parameter. Currently though, I found that the output will have edges flipped as compared to the input mesh, and if I do not pass segments at all the output is identical as when I specify segments to preserve.
Here is code to load and output meshes, and the data I'm loading with it:
I'm not sure if my use is wrong, but any help would be appreciated.
import argparse
import math
import trimesh
import torch
import numpy as np
import triangle
def arguments():
a = argparse.ArgumentParser(
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
)
a.add_argument("-i", "--input", required=True, help="Input mesh")
a.add_argument("--iters", type=int, default=10000, help="Optimization iterations")
a.add_argument("--device", default="cpu", help="device to use")
return a.parse_args()
def main():
args = arguments()
device = args.device
print("Loading mesh")
mesh = trimesh.load_mesh(args.input, process=False)
uv = mesh.visual.uv
faces = torch.tensor(mesh.faces, device=device)
uniq_edges = []
tri_m = trimesh.Trimesh(
vertices=np.concatenate([uv, np.zeros_like(uv[:, :1])], axis=-1),
faces=mesh.faces,
)
tri_m.export("tmp_in.obj")
og_vi = {}
for vi, p in enumerate(uv.tolist()):
assert(tuple(p) not in og_vi)
og_vi[tuple(p)] = vi
og_edges = set()
for vis in mesh.faces:
assert(len(vis) == 3)
for i, v in enumerate(vis):
assert(v >= 0)
n = vis[(i+1)%3]
assert(n >= 0)
og_edges.add(tuple(sorted([int(v),int(n)])))
corners = [[0,1],[0,0],[1,1],[1,0]]
t = triangle.triangulate({
"vertices": uv.tolist() + corners,
"segments": list(og_edges),
})
new_uv = t["vertices"]
new_t = t["triangles"]
is_valid_face = [0] * len(new_t)
se = lambda i,j: (min(i, j), max(i,j))
for ti, vis in enumerate(new_t):
is_valid = True
for i, v in enumerate(vis):
vi = og_vi.get(tuple(new_uv[v]))
ni = og_vi.get(tuple(new_uv[vis[(i+1) % 3]]))
is_valid = is_valid and (vi is not None) and (ni is not None) and (se(vi, ni) in og_edges)
is_valid_face[ti] = is_valid
#new_t = [t for ti, t in enumerate(new_t) if is_valid_face[ti]]
tri_m = trimesh.Trimesh(
vertices=np.concatenate([new_uv, np.zeros_like(new_uv[:, :1])], axis=-1),
faces=new_t,
)
tri_m.export("tmp.obj")
exit()
if __name__ == "__main__": main()
Metadata
Metadata
Assignees
Labels
No labels