123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- # Add the igl library to the modules search path
- import sys, os
- sys.path.insert(0, os.getcwd() + "/../")
- import pyigl as igl
- import random
- from math import cos, sin, pi
- TUTORIAL_SHARED_PATH = "../../tutorial/shared/"
- viewer = igl.viewer.Viewer()
- # Quad mesh generated from conjugate field
- VQC = igl.eigen.MatrixXd()
- FQC = igl.eigen.MatrixXi()
- FQCtri = igl.eigen.MatrixXi()
- PQC0 = igl.eigen.MatrixXd()
- PQC1 = igl.eigen.MatrixXd()
- PQC2 = igl.eigen.MatrixXd()
- PQC3 = igl.eigen.MatrixXd()
- # Planarized quad mesh
- VQCplan = igl.eigen.MatrixXd()
- FQCtriplan = igl.eigen.MatrixXi()
- PQC0plan = igl.eigen.MatrixXd()
- PQC1plan = igl.eigen.MatrixXd()
- PQC2plan = igl.eigen.MatrixXd()
- PQC3plan = igl.eigen.MatrixXd()
- def key_down(viewer, key, modifier):
- if key == ord('1'):
- # Draw the triangulated quad mesh
- viewer.data.set_mesh(VQC, FQCtri)
- # Assign a color to each quad that corresponds to its planarity
- planarity = igl.eigen.MatrixXd()
- igl.quad_planarity(VQC, FQC, planarity)
- Ct = igl.eigen.MatrixXd()
- igl.jet(planarity, 0, 0.01, Ct)
- C = igl.eigen.MatrixXd(FQCtri.rows(), 3)
- C.setTopRows(Ct.rows(), Ct)
- C.setBottomRows(Ct.rows(), Ct)
- viewer.data.set_colors(C)
- # Plot a line for each edge of the quad mesh
- viewer.data.add_edges(PQC0, PQC1, igl.eigen.MatrixXd([[0, 0, 0]]))
- viewer.data.add_edges(PQC1, PQC2, igl.eigen.MatrixXd([[0, 0, 0]]))
- viewer.data.add_edges(PQC2, PQC3, igl.eigen.MatrixXd([[0, 0, 0]]))
- viewer.data.add_edges(PQC3, PQC0, igl.eigen.MatrixXd([[0, 0, 0]]))
- elif key == ord('2'):
- # Draw the planar quad mesh
- viewer.data.set_mesh(VQCplan, FQCtri)
- # Assign a color to each quad that corresponds to its planarity
- planarity = igl.eigen.MatrixXd()
- igl.quad_planarity(VQCplan, FQC, planarity)
- Ct = igl.eigen.MatrixXd()
- igl.jet(planarity, 0, 0.01, Ct)
- C = igl.eigen.MatrixXd(FQCtri.rows(), 3)
- C.setTopRows(Ct.rows(), Ct)
- C.setBottomRows(Ct.rows(), Ct)
- viewer.data.set_colors(C)
- # Plot a line for each edge of the quad mesh
- viewer.data.add_edges(PQC0plan, PQC1plan, igl.eigen.MatrixXd([[0, 0, 0]]))
- viewer.data.add_edges(PQC1plan, PQC2plan, igl.eigen.MatrixXd([[0, 0, 0]]))
- viewer.data.add_edges(PQC2plan, PQC3plan, igl.eigen.MatrixXd([[0, 0, 0]]))
- viewer.data.add_edges(PQC3plan, PQC0plan, igl.eigen.MatrixXd([[0, 0, 0]]))
- else:
- return False
- return True
- # Load a quad mesh generated by a conjugate field
- igl.readOFF(TUTORIAL_SHARED_PATH + "inspired_mesh_quads_Conjugate.off", VQC, FQC)
- # Convert it to a triangle mesh
- FQCtri.resize(2 * FQC.rows(), 3)
- FQCtriUpper = igl.eigen.MatrixXi(FQC.rows(), 3)
- FQCtriLower = igl.eigen.MatrixXi(FQC.rows(), 3)
- FQCtriUpper.setCol(0, FQC.col(0))
- FQCtriUpper.setCol(1, FQC.col(1))
- FQCtriUpper.setCol(2, FQC.col(2))
- FQCtriLower.setCol(0, FQC.col(2))
- FQCtriLower.setCol(1, FQC.col(3))
- FQCtriLower.setCol(2, FQC.col(0))
- FQCtri.setTopRows(FQCtriUpper.rows(), FQCtriUpper)
- FQCtri.setBottomRows(FQCtriLower.rows(), FQCtriLower)
- igl.slice(VQC, FQC.col(0), 1, PQC0)
- igl.slice(VQC, FQC.col(1), 1, PQC1)
- igl.slice(VQC, FQC.col(2), 1, PQC2)
- igl.slice(VQC, FQC.col(3), 1, PQC3)
- # Planarize it
- igl.planarize_quad_mesh(VQC, FQC, 100, 0.005, VQCplan)
- # Convert the planarized mesh to triangles
- igl.slice(VQCplan, FQC.col(0), 1, PQC0plan)
- igl.slice(VQCplan, FQC.col(1), 1, PQC1plan)
- igl.slice(VQCplan, FQC.col(2), 1, PQC2plan)
- igl.slice(VQCplan, FQC.col(3), 1, PQC3plan)
- # Launch the viewer
- key_down(viewer, ord('2'), 0)
- viewer.core.invert_normals = True
- viewer.core.show_lines = False
- viewer.callback_key_down = key_down
- viewer.launch()
|