''' Copyright 2015 Matthew Loper, Naureen Mahmood and the Max Planck Gesellschaft. All rights reserved. This software is provided for research purposes only. By using this software you agree to the terms of the SMPL Model license here http://smpl.is.tue.mpg.de/license More information about SMPL is available here http://smpl.is.tue.mpg. For comments or questions, please email us at: smpl@tuebingen.mpg.de About this file: ================ This file defines the basic skinning modules for the SMPL loader which defines the effect of bones and blendshapes on the vertices of the template mesh. Modules included: - verts_decorated: creates an instance of the SMPL model which inherits model attributes from another SMPL model. - verts_core: [overloaded function inherited by lbs.verts_core] computes the blending of joint-influences for each vertex based on type of skinning ''' import chumpy from . import lbs from .posemapper import posemap import scipy.sparse as sp from chumpy.ch import MatVecMult def ischumpy(x): return hasattr(x, 'dterms') def verts_decorated(trans, pose, v_template, J, weights, kintree_table, bs_style, f, bs_type=None, posedirs=None, betas=None, shapedirs=None, want_Jtr=False): for which in [trans, pose, v_template, weights, posedirs, betas, shapedirs]: if which is not None: assert ischumpy(which) v = v_template if shapedirs is not None: if betas is None: betas = chumpy.zeros(shapedirs.shape[-1]) v_shaped = v + shapedirs.dot(betas) else: v_shaped = v if posedirs is not None: v_posed = v_shaped + posedirs.dot(posemap(bs_type)(pose)) else: v_posed = v_shaped v = v_posed if sp.issparse(J): regressor = J J_tmpx = MatVecMult(regressor, v_shaped[:,0]) J_tmpy = MatVecMult(regressor, v_shaped[:,1]) J_tmpz = MatVecMult(regressor, v_shaped[:,2]) J = chumpy.vstack((J_tmpx, J_tmpy, J_tmpz)).T else: assert(ischumpy(J)) assert(bs_style=='lbs') result, Jtr = lbs.verts_core(pose, v, J, weights, kintree_table, want_Jtr=True, xp=chumpy) tr = trans.reshape((1,3)) result = result + tr Jtr = Jtr + tr result.trans = trans result.f = f result.pose = pose result.v_template = v_template result.J = J result.weights = weights result.kintree_table = kintree_table result.bs_style = bs_style result.bs_type =bs_type if posedirs is not None: result.posedirs = posedirs result.v_posed = v_posed if shapedirs is not None: result.shapedirs = shapedirs result.betas = betas result.v_shaped = v_shaped if want_Jtr: result.J_transformed = Jtr return result def verts_core(pose, v, J, weights, kintree_table, bs_style, want_Jtr=False, xp=chumpy): if xp == chumpy: assert(hasattr(pose, 'dterms')) assert(hasattr(v, 'dterms')) assert(hasattr(J, 'dterms')) assert(hasattr(weights, 'dterms')) assert(bs_style=='lbs') result = lbs.verts_core(pose, v, J, weights, kintree_table, want_Jtr, xp) return result