def generate_transform_matrices(mesh, factors): factors = map(lambda x: 1.0 / x, factors) M, A, D, U, E = [], [], [], [], [] A.append(get_vert_connectivity(mesh)) M.append(mesh) E.append(get_vertices_per_edge(mesh)) for factor in factors: ds_f, ds_D = qslim_decimator_transformer(M[-1], factor=factor) D.append(ds_D) new_mesh_v = ds_D.dot(M[-1].v) new_mesh = Mesh(v=new_mesh_v, f=ds_f) M.append(new_mesh) A.append(get_vert_connectivity(new_mesh)) U.append(setup_deformation_transfer(M[-1], M[-2])) E.append(get_vertices_per_edge(new_mesh)) return M, A, D, U, E
def test_connectivity_smoke_test(self): from psbody.mesh import Mesh from psbody.mesh.topology.connectivity import get_vert_connectivity, get_faces_per_edge m = Mesh( filename=os.path.join(test_data_folder, 'female_template.ply')) vconn = get_vert_connectivity(m) fpe = get_faces_per_edge(m) self.assertIsNotNone(vconn) self.assertIsNotNone(fpe)
def laplacian(part_mesh): """ Compute laplacian operator on part_mesh. This can be cached. """ import scipy.sparse as sp from sklearn.preprocessing import normalize from psbody.mesh.topology.connectivity import get_vert_connectivity import numpy as np connectivity = get_vert_connectivity(part_mesh) # connectivity is a sparse matrix, and np.clip can not applied directly on # a sparse matrix. connectivity.data = np.clip(connectivity.data, 0, 1) lap = normalize(connectivity, norm='l1', axis=1) lap = sp.eye(connectivity.shape[0]) - lap return lap
def numpy_laplacian_uniform(v, f): """Computes uniform laplacian operator on mesh.""" import scipy.sparse as sp from sklearn.preprocessing import normalize from psbody.mesh.topology.connectivity import get_vert_connectivity connectivity = get_vert_connectivity(Mesh(v=v, f=f)) # connectivity is a sparse matrix, and np.clip can not applied directly on # a sparse matrix. connectivity.data = np.clip(connectivity.data, 0, 1) lap = normalize(connectivity, norm='l1', axis=1) lap = lap - sp.eye(connectivity.shape[0]) return lap
def calc_laplacian(mesh): """ メッシュに対して Laplacian deformation での Laplacian を計算する """ # pytorch3d -> psbody.mesh への変換 mesh = Mesh(mesh.verts_packed().detach().cpu().numpy(), mesh.faces_packed().detach().cpu().numpy()) # メッシュを頂点連結関係を取得? connectivity = get_vert_connectivity(mesh) # connectivity is a sparse matrix, and np.clip can not applied directly on a sparse matrix. connectivity.data = np.clip(connectivity.data, 0, 1) laplacian = normalize(connectivity, norm='l1', axis=1) laplacian = sp.eye(connectivity.shape[0]) - laplacian return laplacian