mirror of
https://github.com/huchenlei/HandRefinerPortable.git
synced 2026-01-26 15:49:45 +00:00
117 lines
3.1 KiB
Python
117 lines
3.1 KiB
Python
'''
|
|
Copyright 2017 Javier Romero, Dimitrios Tzionas, Michael J Black 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 MANO/SMPL+H Model license here http://mano.is.tue.mpg.de/license
|
|
|
|
More information about MANO/SMPL+H is available at http://mano.is.tue.mpg.de.
|
|
For comments or questions, please email us at: mano@tue.mpg.de
|
|
|
|
|
|
About this file:
|
|
================
|
|
This file defines a wrapper for the loading functions of the MANO model.
|
|
|
|
Modules included:
|
|
- load_model:
|
|
loads the MANO model from a given file location (i.e. a .pkl file location),
|
|
or a dictionary object.
|
|
|
|
'''
|
|
|
|
|
|
import numpy as np
|
|
import mano.webuser.lbs as lbs
|
|
from mano.webuser.posemapper import posemap
|
|
import scipy.sparse as sp
|
|
|
|
|
|
def ischumpy(x):
|
|
return hasattr(x, 'dterms')
|
|
|
|
|
|
def verts_decorated(trans,
|
|
pose,
|
|
v_template,
|
|
J_regressor,
|
|
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 = np.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_tmpx = np.matmul(J_regressor, v_shaped[:, 0])
|
|
J_tmpy = np.matmul(J_regressor, v_shaped[:, 1])
|
|
J_tmpz = np.matmul(J_regressor, v_shaped[:, 2])
|
|
J = np.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=np)
|
|
|
|
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.J_regressor = J_regressor
|
|
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=np):
|
|
|
|
assert (bs_style == 'lbs')
|
|
result = lbs.verts_core(pose, v, J, weights, kintree_table, want_Jtr, xp)
|
|
return result |