Skip to content

Commit 80c67ef

Browse files
author
Alec Jacobson
committed
add back missing ddm function
1 parent 4062f56 commit 80c67ef

1 file changed

Lines changed: 109 additions & 0 deletions

File tree

src/direct_delta_mush.cpp

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
#include <common.h>
2+
#include <npe.h>
3+
#include <typedefs.h>
4+
#include <igl/direct_delta_mush.h>
5+
6+
const char* ds_direct_delta_mush = R"igl_Qu8mg5v7(
7+
Perform Direct Delta Mush Skinning.
8+
Computes Direct Delta Mesh Skinning (Variant 0) from
9+
"Direct Delta Mush Skinning and Variants"
10+
11+
Parameters
12+
----------
13+
v #V by 3 list of rest pose vertex positions
14+
t #E*4 by 3 list of bone pose transformations
15+
omega #V by #E*10 list of precomputated matrix values
16+
17+
Returns
18+
-------
19+
u #V by 3 list of output vertex positions
20+
21+
See also
22+
--------
23+
24+
25+
Notes
26+
-----
27+
None
28+
29+
Examples
30+
--------
31+
)igl_Qu8mg5v7";
32+
33+
npe_function(direct_delta_mush)
34+
npe_doc(ds_direct_delta_mush)
35+
36+
npe_arg(v, dense_double)
37+
npe_arg(t, dense_double)
38+
npe_arg(omega, dense_double)
39+
40+
npe_begin_code()
41+
assert_cols_equals(v, 3, "v");
42+
assert_valid_bone_transforms(t, "t");
43+
assert_rows_equals(t, (omega.cols() * 4) / 10, "t");
44+
45+
std::vector<Eigen::Affine3d, Eigen::aligned_allocator<Eigen::Affine3d>>
46+
t_affine(t.rows() / 4);
47+
48+
for(int bone = 0; bone < t_affine.size(); ++bone)
49+
{
50+
t_affine[bone] = Eigen::Affine3d::Identity();
51+
t_affine[bone].matrix().block(0, 0, 3, 4) = t.block(bone * 4, 0, 4, 3).transpose();
52+
}
53+
54+
EigenDenseLike<npe_Matrix_v> u;
55+
igl::direct_delta_mush(v, t_affine, omega, u);
56+
return npe::move(u);
57+
58+
npe_end_code()
59+
60+
const char* ds_direct_delta_mush_precomp = R"igl_Qu8mg5v7(
61+
Do the Omega precomputation necessary for Direct Delta Mush Skinning.
62+
63+
Parameters
64+
----------
65+
v #V by 3 list of rest pose vertex positions
66+
f #F by 3 list of triangle indices into rows of V
67+
w #V by #Edges list of weights
68+
p number of smoothing iterations
69+
lambda rotation smoothing step size
70+
kappa translation smoothness step size
71+
alpha translation smoothness blending weight
72+
73+
Returns
74+
-------
75+
omega : #V by #E*10 list of precomputated matrix values
76+
77+
See also
78+
--------
79+
80+
81+
Notes
82+
-----
83+
None
84+
85+
Examples
86+
--------
87+
)igl_Qu8mg5v7";
88+
89+
npe_function(direct_delta_mush_precomputation)
90+
npe_doc(ds_direct_delta_mush_precomp)
91+
92+
npe_arg(v, dense_double)
93+
npe_arg(f, dense_int, dense_long, dense_longlong)
94+
npe_arg(w, npe_matches(v))
95+
npe_arg(p, int)
96+
npe_arg(lambda, double)
97+
npe_arg(kappa, double)
98+
npe_arg(alpha, double)
99+
100+
npe_begin_code()
101+
assert_valid_3d_tri_mesh(v, f);
102+
103+
Eigen::MatrixXd w_copy = w.template cast<double>();
104+
105+
EigenDenseLike<npe_Matrix_v> omega;
106+
igl::direct_delta_mush_precomputation(v, f, w_copy, p, lambda, kappa, alpha, omega);
107+
return npe::move(omega);
108+
109+
npe_end_code()

0 commit comments

Comments
 (0)