1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- import sys, os
- # Add the igl library to the modules search path
- sys.path.insert(0, os.getcwd() + "/../")
- import pyigl as igl
- from shared import TUTORIAL_SHARED_PATH, check_dependencies
- dependencies = ["viewer"]
- check_dependencies(dependencies)
- V = igl.eigen.MatrixXd()
- U = igl.eigen.MatrixXd()
- F = igl.eigen.MatrixXi()
- c = 0
- bbd = 1.0
- twod = False
- if not igl.read_triangle_mesh(TUTORIAL_SHARED_PATH + "beetle.off", V, F):
- print("failed to load mesh")
- twod = V.col(2).minCoeff() == V.col(2).maxCoeff()
- bbd = (V.colwiseMaxCoeff() - V.colwiseMinCoeff()).norm()
- L = igl.eigen.SparseMatrixd()
- M = igl.eigen.SparseMatrixd()
- igl.cotmatrix(V, F, L)
- L = -L
- igl.massmatrix(V, F, igl.MASSMATRIX_TYPE_DEFAULT, M)
- k = 5
- D = igl.eigen.MatrixXd()
- if not igl.eigs(L, M, k + 1, igl.EIGS_TYPE_SM, U, D):
- print("Eigs failed.")
- U = (U - U.minCoeff()) / (U.maxCoeff() - U.minCoeff())
- viewer = igl.viewer.Viewer()
- def key_down(viewer, key, mod):
- global U, c
- if key == ord(' '):
- U = U.rightCols(k)
- # Rescale eigen vectors for visualization
- Z = bbd * 0.5 * U.col(c)
- C = igl.eigen.MatrixXd()
- igl.parula(U.col(c), False, C)
- c = (c + 1) % U.cols()
- if twod:
- V.setcol(2, Z)
- viewer.data.set_mesh(V, F)
- viewer.data.compute_normals()
- viewer.data.set_colors(C)
- return True
- viewer.callback_key_down = key_down
- viewer.callback_key_down(viewer, ord(' '), 0)
- viewer.core.show_lines = False
- viewer.launch()
|