diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..cb13356 Binary files /dev/null and b/.DS_Store differ diff --git a/Doxyfile b/Doxyfile index 2219bbe..cbd7a3f 100644 --- a/Doxyfile +++ b/Doxyfile @@ -38,7 +38,7 @@ PROJECT_NAME = "Dem Bones" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 1.1.0 +PROJECT_NUMBER = 1.2.0 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a @@ -51,7 +51,7 @@ PROJECT_BRIEF = "Skinning Decomposition Library" # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy # the logo to the output directory. -PROJECT_LOGO = D:/working/DemBones/dem-bones/logo/raw/DemBones_doxygen.png +PROJECT_LOGO = D:/working/DemBones/dem-bones/logo/DemBones_small.png # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # into which the generated documentation will be written. If a relative path is diff --git a/README.md b/README.md index faddd3e..7bc6f6e 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # Dem Bones [![BSD3 Clause](https://img.shields.io/badge/license-BSD3_Clause-blue.svg)](LICENSE.md) -[![Version](https://img.shields.io/badge/version-1.1.0-green.svg)](VERSION.md) +[![Version](https://img.shields.io/badge/version-1.2.0-green.svg)](VERSION.md) This repository contains an implementation of [Smooth Skinning Decomposition with Rigid Bones](http://binh.graphics/papers/2012sa-ssdr/), an automated algorithm to extract the *Linear Blend Skinning* (LBS) with bone transformations from a set of example meshes. diff --git a/VERSION.md b/VERSION.md index ea22d94..4cfb203 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1,5 +1,10 @@ # Version History +## Version 1.2.0 (July 2020) +- Add stop on convergence to cbIterEnd(), cbWeightsIterEnd(), cbTransformationsIterEnd() +- Add --bindUpdate=2 flag in the command line tool to group joints +- Add --tolerance and --patience flags in the command line tool using cbIterEnd() + ## Version 1.1.0 (June 2020) - Add per-bone transformation hard-lock and per-vertex weights soft-lock - Fix initialization issue on cluster splitting diff --git a/bin/Linux/DemBones b/bin/Linux/DemBones index cd26eba..45365f7 100755 Binary files a/bin/Linux/DemBones and b/bin/Linux/DemBones differ diff --git a/bin/MacOS/DemBones b/bin/MacOS/DemBones index c73542f..ccbfbc1 100755 Binary files a/bin/MacOS/DemBones and b/bin/MacOS/DemBones differ diff --git a/bin/Windows/DemBones.exe b/bin/Windows/DemBones.exe index 2b0756b..8063964 100755 Binary files a/bin/Windows/DemBones.exe and b/bin/Windows/DemBones.exe differ diff --git a/bin/usage.txt b/bin/usage.txt index dba27f5..d148d4f 100644 --- a/bin/usage.txt +++ b/bin/usage.txt @@ -1,13 +1,14 @@ USAGE: - DemBones -a= ... -i= ... -o= ... - [-b=] [--nInitIters=] [-n=] - [--nTransIters=] [--bindUpdate=] - [--transAffine=] [--transAffineNorm=] - [--nWeightsIters=] [-z=] [--weightsSmooth=] - [--weightsSmoothStep=] [--dbg=] - [--log=] [--] [--version] [-h] + DemBones.exe -a= ... -i= ... -o= ... + [-b=] [--nInitIters=] [-n=] + [--tolerance=] [--patience=] + [--nTransIters=] [--bindUpdate=] + [--transAffine=] [--transAffineNorm=] + [--nWeightsIters=] [-z=] + [--weightsSmooth=] [--weightsSmoothStep=] + [--dbg=] [--log=] [--] [--version] [-h] Where: @@ -31,11 +32,20 @@ Where: -n=, --nIters= number of global iterations + --tolerance= + convergence tolerance, stop if error relatively reduces less than + [--tolerance] in [--patience] consecutive iterations + + --patience= + convergence patience, stop if error relatively reduces less than + [--tolerance] in [--patience] consecutive iterations + --nTransIters= number of transformation update iterations per global iteration --bindUpdate= - update bind pose (0=no update, 1=update joint positions) + update bind pose (0=no update, 1=update joint positions, 2=regroup + joints under one root) --transAffine= bone translations affinity soft constraint diff --git a/data/Decomposition_05.fbx b/data/Decomposition_05.fbx index acde75c..ab7af01 100644 Binary files a/data/Decomposition_05.fbx and b/data/Decomposition_05.fbx differ diff --git a/data/Decomposition_10.fbx b/data/Decomposition_10.fbx index fec34db..bacc2c2 100644 Binary files a/data/Decomposition_10.fbx and b/data/Decomposition_10.fbx differ diff --git a/data/Decomposition_20.fbx b/data/Decomposition_20.fbx index 7f8df73..670c4f4 100644 Binary files a/data/Decomposition_20.fbx and b/data/Decomposition_20.fbx differ diff --git a/data/Decomposition_20_grouped.fbx b/data/Decomposition_20_grouped.fbx new file mode 100644 index 0000000..6585c01 Binary files /dev/null and b/data/Decomposition_20_grouped.fbx differ diff --git a/data/Optimized.fbx b/data/Optimized.fbx index dba3275..0a35f18 100644 Binary files a/data/Optimized.fbx and b/data/Optimized.fbx differ diff --git a/data/SolvedHelpers.fbx b/data/SolvedHelpers.fbx index 92035dd..c6c3d61 100644 Binary files a/data/SolvedHelpers.fbx and b/data/SolvedHelpers.fbx differ diff --git a/data/SolvedPartialWeights.fbx b/data/SolvedPartialWeights.fbx index 92996fa..69659bf 100644 Binary files a/data/SolvedPartialWeights.fbx and b/data/SolvedPartialWeights.fbx differ diff --git a/data/SolvedTransformations.fbx b/data/SolvedTransformations.fbx index 2ba18e4..690186f 100644 Binary files a/data/SolvedTransformations.fbx and b/data/SolvedTransformations.fbx differ diff --git a/data/SolvedWeights.fbx b/data/SolvedWeights.fbx index 30a87e7..fbe7610 100644 Binary files a/data/SolvedWeights.fbx and b/data/SolvedWeights.fbx differ diff --git a/data/run.bat b/data/run.bat index 3cc2466..5f7ae16 100644 --- a/data/run.bat +++ b/data/run.bat @@ -3,11 +3,14 @@ call "../bin/Windows/DemBones.exe" -i="Bone_Geom.fbx" -a="Bone_Anim.abc" -b=5 -o call "../bin/Windows/DemBones.exe" -i="Bone_Geom.fbx" -a="Bone_Anim.abc" -b=10 -o="Decomposition_10.fbx" call "../bin/Windows/DemBones.exe" -i="Bone_Geom.fbx" -a="Bone_Anim.abc" -b=20 -o="Decomposition_20.fbx" +rem Joint grouping +call "../bin/Windows/DemBones.exe" -i="Bone_Geom.fbx" -a="Bone_Anim.abc" -b=20 --bindUpdate=2 -o="Decomposition_20_grouped.fbx" + rem Solve skinning weights from input meshes sequence and input bone transformations -call "../bin/Windows/DemBones.exe" -i="Bone_Trans.fbx" -a="Bone_Anim.abc" -n=5 --nTransIters=0 -o="SolvedWeights.fbx" +call "../bin/Windows/DemBones.exe" -i="Bone_Trans.fbx" -a="Bone_Anim.abc" --nTransIters=0 -o="SolvedWeights.fbx" rem Solve bone transformations from input meshes sequence and input skinning weights -call "../bin/Windows/DemBones.exe" -i="Bone_Skin.fbx" -a="Bone_Anim.abc" -n=5 --nWeightsIters=0 -o="SolvedTransformations.fbx" +call "../bin/Windows/DemBones.exe" -i="Bone_Skin.fbx" -a="Bone_Anim.abc" --nWeightsIters=0 -o="SolvedTransformations.fbx" rem Optimize given bone transformations and skinning weights from input meshes sequence call "../bin/Windows/DemBones.exe" -i="Bone_All.fbx" -a="Bone_Anim.abc" --bindUpdate=1 -o="Optimized.fbx" diff --git a/data/run.sh b/data/run.sh index 2bf3eb6..5550c76 100755 --- a/data/run.sh +++ b/data/run.sh @@ -11,11 +11,14 @@ $EXECUTION_FILE -i="Bone_Geom.fbx" -a="Bone_Anim.abc" -b=5 -o="Decomposition_05. $EXECUTION_FILE -i="Bone_Geom.fbx" -a="Bone_Anim.abc" -b=10 -o="Decomposition_10.fbx" $EXECUTION_FILE -i="Bone_Geom.fbx" -a="Bone_Anim.abc" -b=20 -o="Decomposition_20.fbx" +# Joint grouping +$EXECUTION_FILE -i="Bone_Geom.fbx" -a="Bone_Anim.abc" -b=20 --bindUpdate=2 -o="Decomposition_20_grouped.fbx" + # Solve skinning weights from input meshes sequence and input bone transformations -$EXECUTION_FILE -i="Bone_Trans.fbx" -a="Bone_Anim.abc" -n=5 --nTransIters=0 -o="SolvedWeights.fbx" +$EXECUTION_FILE -i="Bone_Trans.fbx" -a="Bone_Anim.abc" --nTransIters=0 -o="SolvedWeights.fbx" #Solve bone transformations from input meshes sequence and input skinning weights -$EXECUTION_FILE -i="Bone_Skin.fbx" -a="Bone_Anim.abc" -n=5 --nWeightsIters=0 -o="SolvedTransformations.fbx" +$EXECUTION_FILE -i="Bone_Skin.fbx" -a="Bone_Anim.abc" --nWeightsIters=0 -o="SolvedTransformations.fbx" # Optimize given bone transformations and skinning weights from input meshes sequence $EXECUTION_FILE -i="Bone_All.fbx" -a="Bone_Anim.abc" --bindUpdate=1 -o="Optimized.fbx" diff --git a/docs/htmls/DemBones_small.png b/docs/htmls/DemBones_small.png new file mode 100644 index 0000000..072d62c Binary files /dev/null and b/docs/htmls/DemBones_small.png differ diff --git a/docs/htmls/_convex_l_s_8h.html b/docs/htmls/_convex_l_s_8h.html index 5be57ff..772bc0c 100644 --- a/docs/htmls/_convex_l_s_8h.html +++ b/docs/htmls/_convex_l_s_8h.html @@ -34,10 +34,10 @@ - + diff --git a/docs/htmls/_convex_l_s_8h_source.html b/docs/htmls/_convex_l_s_8h_source.html index 5275148..f9dc4bb 100644 --- a/docs/htmls/_convex_l_s_8h_source.html +++ b/docs/htmls/_convex_l_s_8h_source.html @@ -34,10 +34,10 @@
Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
- + diff --git a/docs/htmls/_dem_bones_8h.html b/docs/htmls/_dem_bones_8h.html index 8506bc9..d6e2f31 100644 --- a/docs/htmls/_dem_bones_8h.html +++ b/docs/htmls/_dem_bones_8h.html @@ -34,10 +34,10 @@
Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
- + diff --git a/docs/htmls/_dem_bones_8h_source.html b/docs/htmls/_dem_bones_8h_source.html index 81b289d..f744ee9 100644 --- a/docs/htmls/_dem_bones_8h_source.html +++ b/docs/htmls/_dem_bones_8h_source.html @@ -34,10 +34,10 @@
Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
- + @@ -260,7 +260,7 @@
254  if (uuT.innerIdx(it)!=j) qpT-=m.blk4(k, uuT.innerIdx(it))*uuT.val.blk4(subjectID(k), it);
255  qpT2m(qpT, k, j);
256  }
- +
257  if (cbTransformationsIterEnd()) return;
258  }
259 
@@ -316,7 +316,7 @@
323  w.resize(nB, nV);
324  w.setFromTriplets(trip.begin(), trip.end());
325 
- +
326  if (cbWeightsIterEnd()) return;
327  }
328 
329  cbWeightsEnd();
@@ -329,15 +329,15 @@
348  cbIterBegin();
350  computeWeights();
-
351  cbIterEnd();
+
351  if (cbIterEnd()) break;
352  }
353  }
-
354 
+
354 
356  _Scalar rmse() {
357  _Scalar e=0;
358  #pragma omp parallel for
359  for (int i=0; i<nV; i++) {
-
360  _Scalar ei = 0;
+
360  _Scalar ei=0;
361  Matrix4 mki;
362  for (int k=0; k<nF; k++) {
363  mki.setZero();
@@ -354,7 +354,7 @@
376  virtual void cbInitSplitEnd() {}
377 
379  virtual void cbIterBegin() {}
-
381  virtual void cbIterEnd() {}
+
381  virtual bool cbIterEnd() { return false; }
382 
384  virtual void cbWeightsBegin() {}
386  virtual void cbWeightsEnd() {}
@@ -363,10 +363,10 @@
391  virtual void cbTransformationsEnd() {}
392 
394  virtual void cbTransformationsIterBegin() {}
-
396  virtual void cbTransformationsIterEnd() {}
+
396  virtual bool cbTransformationsIterEnd() { return false; }
397 
399  virtual void cbWeightsIterBegin() {}
-
401  virtual void cbWeightsIterEnd() {}
+
401  virtual bool cbWeightsIterEnd() { return false; }
402 
403 private:
404  int _iter, _iterTransformations, _iterWeights;
@@ -813,6 +813,7 @@
const int & iterTransformations
[zero indexed, read only] Current bone transformations update iteration number that can be used for c...
Definition: DemBones.h:154
int nV
Number of vertices, typically indexed by i.
Definition: DemBones.h:114
void init()
Initialize missing skinning weights and/or bone transformations.
Definition: DemBones.h:186
+
virtual bool cbWeightsIterEnd()
Callback function invoked after each local weights update iteration, stop iteration if return true.
Definition: DemBones.h:401
Definition: ConvexLS.h:15
_Scalar transAffineNorm
[parameter] p-norm for bone translations affinity soft constraint, default = 4.0
Definition: DemBones.h:90
Eigen::Matrix< _Scalar, 4, 1 > Vector4
Definition: DemBones.h:74
@@ -827,7 +828,6 @@
Eigen::VectorXi subjectID
Subject index of the frame, size = nF, subjectID(k)=s, where fStart(s) <= k < fStart(s+1)
Definition: DemBones.h:125
Defines some macros to access sub-blocks of packing transformation/position matrices for convenience.
Eigen::VectorXi fStart
Start frame indices, size = nS+1, fStart(s), fStart(s+1) are data frames for subject s.
Definition: DemBones.h:123
-
virtual void cbWeightsIterEnd()
Callback function invoked after each local weights update iteration.
Definition: DemBones.h:401
virtual void cbTranformationsBegin()
Callback function invoked before each bone transformations update.
Definition: DemBones.h:389
int nIters
[parameter] Number of global iterations, default = 30
Definition: DemBones.h:80
@@ -843,15 +843,15 @@
virtual void cbWeightsBegin()
Callback function invoked before each skinning weights update.
Definition: DemBones.h:384
Eigen::Matrix< _Scalar, 3, 1 > Vector3
Definition: DemBones.h:75
Eigen::Triplet< _Scalar > Triplet
Definition: DemBones.h:77
-
virtual void cbIterEnd()
Callback function invoked after each global iteration update.
Definition: DemBones.h:381
SparseMatrix w
Skinning weights, size = [nB, nV], w.col(i) are the skinning weights of vertex i, w(j,...
Definition: DemBones.h:131
int nInitIters
[parameter] Number of clustering update iterations in the initalization, default = 10
Definition: DemBones.h:83
_Scalar weightEps
[parameter] Epsilon for weights solver, default = 1e-15
Definition: DemBones.h:101
Eigen::Matrix< _Scalar, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Definition: DemBones.h:70
int nB
Number of bones, typically indexed by j.
Definition: DemBones.h:116
-
virtual void cbTransformationsIterEnd()
Callback function invoked after each local bone transformations update iteration.
Definition: DemBones.h:396
Eigen::Matrix< _Scalar, 4, 4 > Matrix4
Definition: DemBones.h:71
Eigen::Matrix< _AniMeshScalar, Eigen::Dynamic, Eigen::Dynamic > v
Animated mesh sequence, size = [3*nF, nV], v.col(i).segment(3*k, 3) is the position of vertex i at fr...
Definition: DemBones.h:145
+
virtual bool cbIterEnd()
Callback function invoked after each global iteration update, stop iteration if return true.
Definition: DemBones.h:381
+
virtual bool cbTransformationsIterEnd()
Callback function invoked after each local bone transformations update iteration, stop iteration if r...
Definition: DemBones.h:396
virtual void cbInitSplitEnd()
Callback function invoked after each spliting of bone clusters in initialization.
Definition: DemBones.h:376
Smooth skinning decomposition with rigid bones and sparse, convex weights.
Definition: DemBones.h:66
Eigen::VectorXi lockM
Bone transformation lock control, size = nB, lockM(j) is the amount of input transformations will be ...
Definition: DemBones.h:142
diff --git a/docs/htmls/_dem_bones_ext_8h.html b/docs/htmls/_dem_bones_ext_8h.html index 6a1b095..fe719be 100644 --- a/docs/htmls/_dem_bones_ext_8h.html +++ b/docs/htmls/_dem_bones_ext_8h.html @@ -34,10 +34,10 @@
Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
- + diff --git a/docs/htmls/_dem_bones_ext_8h_source.html b/docs/htmls/_dem_bones_ext_8h_source.html index ca0b3ea..04efe5b 100644 --- a/docs/htmls/_dem_bones_ext_8h_source.html +++ b/docs/htmls/_dem_bones_ext_8h_source.html @@ -34,10 +34,10 @@
Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
- + @@ -173,146 +173,170 @@
87 
89  Eigen::MatrixXi rotOrder;
90 
- +
93 
- -
97  clear();
-
98  }
-
99 
-
102  void clear() {
-
103  fTime.resize(0);
-
104  boneName.resize(0);
-
105  parent.resize(0);
-
106  bind.resize(0, 0);
-
107  preMulInv.resize(0, 0);
-
108  rotOrder.resize(0, 0);
- -
110  }
-
111 
-
129  void computeRTB(int s, const MatrixX& orient, MatrixX& lr, MatrixX& lt, MatrixX& gb, MatrixX& lbr, MatrixX& lbt, bool degreeRot=true) {
-
130  computeBind(s, gb);
-
131 
-
132  if (parent.size()==0) parent=Eigen::VectorXi::Constant(nB, -1);
-
133  if (preMulInv.size()==0) preMulInv=MatrixX::Identity(4, 4).replicate(nS, nB);
-
134  if (rotOrder.size()==0) rotOrder=Eigen::Vector3i(0, 1, 2).replicate(nS, nB);
+ +
96 
+ +
100  clear();
+
101  }
+
102 
+
105  void clear() {
+
106  fTime.resize(0);
+
107  boneName.resize(0);
+
108  parent.resize(0);
+
109  bind.resize(0, 0);
+
110  preMulInv.resize(0, 0);
+
111  rotOrder.resize(0, 0);
+
112  orient.resize(0, 0);
+ +
114  }
+
115 
+
133  void computeRTB(int s, MatrixX& lr, MatrixX& lt, MatrixX& gb, MatrixX& lbr, MatrixX& lbt, bool degreeRot=true) {
+
134  computeBind(s, gb);
135 
-
136  int nFs=fStart(s+1)-fStart(s);
-
137  lr.resize(nFs*3, nB);
-
138  lt.resize(nFs*3, nB);
-
139  lbr.resize(3, nB);
-
140  lbt.resize(3, nB);
-
141 
-
142  MatrixX lm(4*nFs, 4*nB);
-
143  #pragma omp parallel for
-
144  for (int j=0; j<nB; j++) {
-
145  Eigen::Vector3i ro=rotOrder.col(j).template segment<3>(s*3);
+
136  if (parent.size()==0) {
+
137  if (bindUpdate==2) {
+
138  int root=computeRoot();
+
139  parent=Eigen::VectorXi::Constant(nB, root);
+
140  parent(root)=-1;
+
141  } else parent=Eigen::VectorXi::Constant(nB, -1);
+
142  }
+
143  if (preMulInv.size()==0) preMulInv=MatrixX::Identity(4, 4).replicate(nS, nB);
+
144  if (rotOrder.size()==0) rotOrder=Eigen::Vector3i(0, 1, 2).replicate(nS, nB);
+
145  if (orient.size()==0) orient=MatrixX::Zero(3*nS, nB);
146 
-
147  Vector3 ov=orient.col(j)*EIGEN_PI/180;
-
148  Matrix3 invOM=Matrix3(Eigen::AngleAxis<_Scalar>(ov(ro(2)), Vector3::Unit(ro(2))))*
-
149  Eigen::AngleAxis<_Scalar>(ov(ro(1)), Vector3::Unit(ro(1)))*
-
150  Eigen::AngleAxis<_Scalar>(ov(ro(0)), Vector3::Unit(ro(0)));
-
151  invOM.transposeInPlace();
+
147  int nFs=fStart(s+1)-fStart(s);
+
148  lr.resize(nFs*3, nB);
+
149  lt.resize(nFs*3, nB);
+
150  lbr.resize(3, nB);
+
151  lbt.resize(3, nB);
152 
-
153  Matrix4 lb;
-
154  if (parent(j)==-1) lb=preMulInv.blk4(s, j)*gb.blk4(0, j);
-
155  else lb=preMulInv.blk4(s, j)*gb.blk4(0, parent(j)).inverse()*gb.blk4(0, j);
-
156 
-
157  Vector3 curRot=Vector3::Zero();
-
158  toRot(invOM*lb.template topLeftCorner<3, 3>(), curRot, ro);
-
159  lbr.col(j)=curRot;
-
160  lbt.col(j)=lb.template topRightCorner<3, 1>();
-
161 
-
162  Matrix4 lm;
-
163  for (int k=0; k<nFs; k++) {
-
164  if (parent(j)==-1) lm=preMulInv.blk4(s, j)*m.blk4(k+fStart(s), j)*gb.blk4(0, j);
-
165  else lm=preMulInv.blk4(s, j)*(m.blk4(k+fStart(s), parent(j))*gb.blk4(0, parent(j))).inverse()*m.blk4(k+fStart(s), j)*gb.blk4(0, j);
-
166  toRot(invOM*lm.template topLeftCorner<3, 3>(), curRot, ro);
-
167  lr.vec3(k, j)=curRot;
-
168  lt.vec3(k, j)=lm.template topRightCorner<3, 1>();
-
169  }
-
170  }
-
171 
-
172  if (degreeRot) {
-
173  lr*=180/EIGEN_PI;
-
174  lbr*=180/EIGEN_PI;
-
175  }
-
176  }
-
177 
-
178 private:
-
183  void computeCentroids(int s, MatrixX& b) {
-
184  MatrixX c=MatrixX::Zero(4, nB);
-
185  for (int i=0; i<nV; i++)
-
186  for (typename SparseMatrix::InnerIterator it(w, i); it; ++it)
-
187  c.col(it.row())+=pow(it.value(), transAffineNorm)*u.vec3(s, i).homogeneous();
-
188  for (int j=0; j<nB; j++)
-
189  if ((c(3, j)!=0)&&(lockM(j)==0)) b.transVec(0, j)=c.col(j).template head<3>()/c(3, j);
-
190  }
-
191 
-
197  void computeBind(int s, MatrixX& b) {
-
198  if (bind.size()==0) {
-
199  lockM=Eigen::VectorXi::Zero(nB);
-
200  bind.resize(nS*4, nB*4);
-
201  for (int k=0; k<nS; k++) {
-
202  b=MatrixX::Identity(4, 4).replicate(1, nB);
-
203  computeCentroids(k, b);
-
204  bind.block(4*s, 0, 4, 4*nB)=b;
-
205  }
-
206  }
-
207 
-
208  b=bind.block(4*s, 0, 4, 4*nB);
-
209  if (bindUpdate==1) computeCentroids(s, b);
-
210  }
-
211 
-
218  void toRot(const Matrix3& rMat, Vector3& curRot, const Eigen::Vector3i& ro, _Scalar eps=_Scalar(1e-10)) {
-
219  Vector3 r0=rMat.eulerAngles(ro(2), ro(1), ro(0)).reverse();
-
220  _Scalar gMin=(r0-curRot).squaredNorm();
-
221  Vector3 rMin=r0;
-
222  Vector3 r;
-
223  Matrix3 tmpMat;
-
224  for (int fx=-1; fx<=1; fx+=2)
-
225  for (_Scalar sx=-2*EIGEN_PI; sx<2.1*EIGEN_PI; sx+=EIGEN_PI) {
-
226  r(0)=fx*r0(0)+sx;
-
227  for (int fy=-1; fy<=1; fy+=2)
-
228  for (_Scalar sy=-2*EIGEN_PI; sy<2.1*EIGEN_PI; sy+=EIGEN_PI) {
-
229  r(1)=fy*r0(1)+sy;
-
230  for (int fz=-1; fz<=1; fz+=2)
-
231  for (_Scalar sz=-2*EIGEN_PI; sz<2.1*EIGEN_PI; sz+=EIGEN_PI) {
-
232  r(2)=fz*r0(2)+sz;
-
233  tmpMat=Matrix3(Eigen::AngleAxis<_Scalar>(r(ro(2)), Vector3::Unit(ro(2))))*
-
234  Eigen::AngleAxis<_Scalar>(r(ro(1)), Vector3::Unit(ro(1)))*
-
235  Eigen::AngleAxis<_Scalar>(r(ro(0)), Vector3::Unit(ro(0)));
-
236  if ((tmpMat-rMat).squaredNorm()<eps) {
-
237  _Scalar tmp=(r-curRot).squaredNorm();
-
238  if (tmp<gMin) {
-
239  gMin=tmp;
-
240  rMin=r;
-
241  }
-
242  }
-
243  }
-
244  }
-
245  }
-
246  curRot=rMin;
-
247  }
-
248 };
-
249 
-
250 }
-
251 
-
252 #ifdef DEM_BONES_DEM_BONES_EXT_MAT_BLOCKS_UNDEFINED
-
253 #undef blk4
-
254 #undef rotMat
-
255 #undef transVec
-
256 #undef vec3
-
257 #undef DEM_BONES_MAT_BLOCKS
-
258 #endif
-
259 
-
260 #undef rotMatFromEuler
-
261 
-
262 #endif
+
153  MatrixX lm(4*nFs, 4*nB);
+
154  #pragma omp parallel for
+
155  for (int j=0; j<nB; j++) {
+
156  Eigen::Vector3i ro=rotOrder.col(j).template segment<3>(s*3);
+
157 
+
158  Vector3 ov=orient.vec3(s, j)*EIGEN_PI/180;
+
159  Matrix3 invOM=Matrix3(Eigen::AngleAxis<_Scalar>(ov(ro(2)), Vector3::Unit(ro(2))))*
+
160  Eigen::AngleAxis<_Scalar>(ov(ro(1)), Vector3::Unit(ro(1)))*
+
161  Eigen::AngleAxis<_Scalar>(ov(ro(0)), Vector3::Unit(ro(0)));
+
162  invOM.transposeInPlace();
+
163 
+
164  Matrix4 lb;
+
165  if (parent(j)==-1) lb=preMulInv.blk4(s, j)*gb.blk4(0, j);
+
166  else lb=preMulInv.blk4(s, j)*gb.blk4(0, parent(j)).inverse()*gb.blk4(0, j);
+
167 
+
168  Vector3 curRot=Vector3::Zero();
+
169  toRot(invOM*lb.template topLeftCorner<3, 3>(), curRot, ro);
+
170  lbr.col(j)=curRot;
+
171  lbt.col(j)=lb.template topRightCorner<3, 1>();
+
172 
+
173  Matrix4 lm;
+
174  for (int k=0; k<nFs; k++) {
+
175  if (parent(j)==-1) lm=preMulInv.blk4(s, j)*m.blk4(k+fStart(s), j)*gb.blk4(0, j);
+
176  else lm=preMulInv.blk4(s, j)*(m.blk4(k+fStart(s), parent(j))*gb.blk4(0, parent(j))).inverse()*m.blk4(k+fStart(s), j)*gb.blk4(0, j);
+
177  toRot(invOM*lm.template topLeftCorner<3, 3>(), curRot, ro);
+
178  lr.vec3(k, j)=curRot;
+
179  lt.vec3(k, j)=lm.template topRightCorner<3, 1>();
+
180  }
+
181  }
+
182 
+
183  if (degreeRot) {
+
184  lr*=180/EIGEN_PI;
+
185  lbr*=180/EIGEN_PI;
+
186  }
+
187  }
+
188 
+
189 private:
+
194  void computeCentroids(int s, MatrixX& b) {
+
195  MatrixX c=MatrixX::Zero(4, nB);
+
196  for (int i=0; i<nV; i++)
+
197  for (typename SparseMatrix::InnerIterator it(w, i); it; ++it)
+
198  c.col(it.row())+=pow(it.value(), transAffineNorm)*u.vec3(s, i).homogeneous();
+
199  for (int j=0; j<nB; j++)
+
200  if ((c(3, j)!=0)&&(lockM(j)==0)) b.transVec(0, j)=c.col(j).template head<3>()/c(3, j);
+
201  }
+
202 
+
208  void computeBind(int s, MatrixX& b) {
+
209  if (bind.size()==0) {
+
210  lockM=Eigen::VectorXi::Zero(nB);
+
211  bind.resize(nS*4, nB*4);
+
212  for (int k=0; k<nS; k++) {
+
213  b=MatrixX::Identity(4, 4).replicate(1, nB);
+
214  computeCentroids(k, b);
+
215  bind.block(4*s, 0, 4, 4*nB)=b;
+
216  }
+
217  }
+
218 
+
219  b=bind.block(4*s, 0, 4, 4*nB);
+
220  if (bindUpdate>=1) computeCentroids(s, b);
+
221  }
+
222 
+
225  int computeRoot() {
+
226  VectorX err(nB);
+
227  #pragma omp parallel for
+
228  for (int j=0; j<nB; j++) {
+
229  double ej=0;
+
230  for (int i=0; i<nV; i++)
+
231  for (int k=0; k<nF; k++) ej+=(m.rotMat(k, j)*u.vec3(subjectID(k), i)+m.transVec(k, j)-v.vec3(k, i).template cast<_Scalar>()).squaredNorm();
+
232  err(j)=ej;
+
233  }
+
234  int rj;
+
235  err.minCoeff(&rj);
+
236  return rj;
+
237  }
+
238 
+
245  void toRot(const Matrix3& rMat, Vector3& curRot, const Eigen::Vector3i& ro, _Scalar eps=_Scalar(1e-10)) {
+
246  Vector3 r0=rMat.eulerAngles(ro(2), ro(1), ro(0)).reverse();
+
247  _Scalar gMin=(r0-curRot).squaredNorm();
+
248  Vector3 rMin=r0;
+
249  Vector3 r;
+
250  Matrix3 tmpMat;
+
251  for (int fx=-1; fx<=1; fx+=2)
+
252  for (_Scalar sx=-2*EIGEN_PI; sx<2.1*EIGEN_PI; sx+=EIGEN_PI) {
+
253  r(0)=fx*r0(0)+sx;
+
254  for (int fy=-1; fy<=1; fy+=2)
+
255  for (_Scalar sy=-2*EIGEN_PI; sy<2.1*EIGEN_PI; sy+=EIGEN_PI) {
+
256  r(1)=fy*r0(1)+sy;
+
257  for (int fz=-1; fz<=1; fz+=2)
+
258  for (_Scalar sz=-2*EIGEN_PI; sz<2.1*EIGEN_PI; sz+=EIGEN_PI) {
+
259  r(2)=fz*r0(2)+sz;
+
260  tmpMat=Matrix3(Eigen::AngleAxis<_Scalar>(r(ro(2)), Vector3::Unit(ro(2))))*
+
261  Eigen::AngleAxis<_Scalar>(r(ro(1)), Vector3::Unit(ro(1)))*
+
262  Eigen::AngleAxis<_Scalar>(r(ro(0)), Vector3::Unit(ro(0)));
+
263  if ((tmpMat-rMat).squaredNorm()<eps) {
+
264  _Scalar tmp=(r-curRot).squaredNorm();
+
265  if (tmp<gMin) {
+
266  gMin=tmp;
+
267  rMin=r;
+
268  }
+
269  }
+
270  }
+
271  }
+
272  }
+
273  curRot=rMin;
+
274  }
+
275 };
+
276 
+
277 }
+
278 
+
279 #ifdef DEM_BONES_DEM_BONES_EXT_MAT_BLOCKS_UNDEFINED
+
280 #undef blk4
+
281 #undef rotMat
+
282 #undef transVec
+
283 #undef vec3
+
284 #undef DEM_BONES_MAT_BLOCKS
+
285 #endif
+
286 
+
287 #undef rotMatFromEuler
+
288 
+
289 #endif
MatrixX m
Bone transformations, size = [4*nF*4, 4*nB], m.blk4(k, j) is the 4*4 relative transformation matrix o...
Definition: DemBones.h:139
-
void computeRTB(int s, const MatrixX &orient, MatrixX &lr, MatrixX &lt, MatrixX &gb, MatrixX &lbr, MatrixX &lbt, bool degreeRot=true)
Local rotations, translations and global bind matrices of a subject.
Definition: DemBonesExt.h:129
-
DemBonesExt()
Constructor and setting default parameters.
Definition: DemBonesExt.h:96
+
Eigen::Matrix< _Scalar, Eigen::Dynamic, 1 > VectorX
Definition: DemBonesExt.h:38
+
DemBonesExt()
Constructor and setting default parameters.
Definition: DemBonesExt.h:99
Extended class to handle hierarchical skeleton with local rotations/translations and bind matrices.
Definition: DemBonesExt.h:31
int nV
Number of vertices, typically indexed by i.
Definition: DemBones.h:114
Eigen::Matrix< _Scalar, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Definition: DemBonesExt.h:35
@@ -322,11 +346,14 @@
MatrixX u
Geometry at the rest poses, size = [3*nS, nV], u.col(i).segment(3*s, 3) is the rest pose of vertex i ...
Definition: DemBones.h:128
const int & iterWeights
[zero indexed, read only] Current weights update iteration number that can be used for callback funct...
Definition: DemBones.h:157
+
void computeRTB(int s, MatrixX &lr, MatrixX &lt, MatrixX &gb, MatrixX &lbr, MatrixX &lbt, bool degreeRot=true)
Local rotations, translations and global bind matrices of a subject.
Definition: DemBonesExt.h:133
Eigen::SparseMatrix< _Scalar > SparseMatrix
Definition: DemBones.h:76
+
Eigen::VectorXi subjectID
Subject index of the frame, size = nF, subjectID(k)=s, where fStart(s) <= k < fStart(s+1)
Definition: DemBones.h:125
Defines some macros to access sub-blocks of packing transformation/position matrices for convenience.
Eigen::VectorXi fStart
Start frame indices, size = nS+1, fStart(s), fStart(s+1) are data frames for subject s.
Definition: DemBones.h:123
MatrixX preMulInv
Inverse pre-multiplication matrices, [size] = [4*nS, 4*nB], preMulInv.block(4*s, 4*j,...
Definition: DemBonesExt.h:86
-
void clear()
Clear all data.
Definition: DemBonesExt.h:102
+
MatrixX orient
Orientations of bones, [size] = [3*nS, nB], orient.col(j).segment<3>(3*s) is the(rx,...
Definition: DemBonesExt.h:92
+
void clear()
Clear all data.
Definition: DemBonesExt.h:105
Eigen::Matrix< _Scalar, 3, 3 > Matrix3
Definition: DemBonesExt.h:37
Eigen::VectorXd fTime
Timestamps for bone transformations m, [size] = nS, fTime(k) is the timestamp of frame k.
Definition: DemBonesExt.h:74
int nS
Number of subjects, typically indexed by s.
Definition: DemBones.h:118
@@ -334,7 +361,8 @@
Eigen::Matrix< _Scalar, 3, 1 > Vector3
Definition: DemBonesExt.h:40
MatrixX bind
Original bind pre-matrix, [size] = [4*nS, 4*nB], bind.block(4*s, 4*j, 4, 4) is the global bind matrix...
Definition: DemBonesExt.h:83
Eigen::VectorXi parent
Parent bone index, [size] = nB, parent(j) is the index of parent bone of j, parent(j) = -1 if j has n...
Definition: DemBonesExt.h:80
-
int bindUpdate
Bind transformation update, 0=keep original, 1=set translations to p-norm centroids (using transAffin...
Definition: DemBonesExt.h:92
+
int nF
Number of total frames, typically indexed by k, nF = fStart(nS)
Definition: DemBones.h:120
+
int bindUpdate
Bind transformation update, 0=keep original, 1=set translations to p-norm centroids (using transAffin...
Definition: DemBonesExt.h:95
Eigen::Matrix< _Scalar, 3, 1 > Vector3
Definition: DemBones.h:75
Eigen::Triplet< _Scalar > Triplet
Definition: DemBones.h:77
SparseMatrix w
Skinning weights, size = [nB, nV], w.col(i) are the skinning weights of vertex i, w(j,...
Definition: DemBones.h:131
@@ -342,6 +370,7 @@
int nB
Number of bones, typically indexed by j.
Definition: DemBones.h:116
Eigen::Matrix< _Scalar, 4, 4 > Matrix4
Definition: DemBones.h:71
std::vector< std::string > boneName
Name of bones, [size] = nB, boneName(j) is the name bone of j.
Definition: DemBonesExt.h:77
+
Eigen::Matrix< _AniMeshScalar, Eigen::Dynamic, Eigen::Dynamic > v
Animated mesh sequence, size = [3*nF, nV], v.col(i).segment(3*k, 3) is the position of vertex i at fr...
Definition: DemBones.h:145
Smooth skinning decomposition with rigid bones and sparse, convex weights.
Definition: DemBones.h:66
Eigen::MatrixXi rotOrder
Rotation order, [size] = [3*nS, nB], rotOrder.col(j).segment<3>(3*s) is the rotation order of bone j ...
Definition: DemBonesExt.h:89
Eigen::VectorXi lockM
Bone transformation lock control, size = nB, lockM(j) is the amount of input transformations will be ...
Definition: DemBones.h:142
diff --git a/docs/htmls/_indexing_8h.html b/docs/htmls/_indexing_8h.html index 7bc38fb..8eb1c55 100644 --- a/docs/htmls/_indexing_8h.html +++ b/docs/htmls/_indexing_8h.html @@ -34,10 +34,10 @@
Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
- + diff --git a/docs/htmls/_indexing_8h_source.html b/docs/htmls/_indexing_8h_source.html index c2f44d8..20ceb12 100644 --- a/docs/htmls/_indexing_8h_source.html +++ b/docs/htmls/_indexing_8h_source.html @@ -34,10 +34,10 @@
Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
- + diff --git a/docs/htmls/_mat_blocks_8h.html b/docs/htmls/_mat_blocks_8h.html index 03dee56..088860a 100644 --- a/docs/htmls/_mat_blocks_8h.html +++ b/docs/htmls/_mat_blocks_8h.html @@ -34,10 +34,10 @@
Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
- + diff --git a/docs/htmls/_mat_blocks_8h_source.html b/docs/htmls/_mat_blocks_8h_source.html index c26bea9..45fe2cf 100644 --- a/docs/htmls/_mat_blocks_8h_source.html +++ b/docs/htmls/_mat_blocks_8h_source.html @@ -34,10 +34,10 @@
Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
- + diff --git a/docs/htmls/annotated.html b/docs/htmls/annotated.html index f36a7f9..7a66e7e 100644 --- a/docs/htmls/annotated.html +++ b/docs/htmls/annotated.html @@ -34,10 +34,10 @@
Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
- + diff --git a/docs/htmls/class_dem_1_1_convex_l_s-members.html b/docs/htmls/class_dem_1_1_convex_l_s-members.html index 4e12f74..14c2dab 100644 --- a/docs/htmls/class_dem_1_1_convex_l_s-members.html +++ b/docs/htmls/class_dem_1_1_convex_l_s-members.html @@ -34,10 +34,10 @@
Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
- + diff --git a/docs/htmls/class_dem_1_1_convex_l_s.html b/docs/htmls/class_dem_1_1_convex_l_s.html index 9622bdc..dccbd5b 100644 --- a/docs/htmls/class_dem_1_1_convex_l_s.html +++ b/docs/htmls/class_dem_1_1_convex_l_s.html @@ -34,10 +34,10 @@
Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
- + diff --git a/docs/htmls/class_dem_1_1_dem_bones-members.html b/docs/htmls/class_dem_1_1_dem_bones-members.html index 60575e7..aeea4e6 100644 --- a/docs/htmls/class_dem_1_1_dem_bones-members.html +++ b/docs/htmls/class_dem_1_1_dem_bones-members.html @@ -34,10 +34,10 @@
Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
- + @@ -104,15 +104,15 @@ - + - + - + diff --git a/docs/htmls/class_dem_1_1_dem_bones.html b/docs/htmls/class_dem_1_1_dem_bones.html index 767ea66..8613ef2 100644 --- a/docs/htmls/class_dem_1_1_dem_bones.html +++ b/docs/htmls/class_dem_1_1_dem_bones.html @@ -34,10 +34,10 @@
Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
cbInitSplitBegin()Dem::DemBones< _Scalar, _AniMeshScalar >inlinevirtual
cbInitSplitEnd()Dem::DemBones< _Scalar, _AniMeshScalar >inlinevirtual
cbIterBegin()Dem::DemBones< _Scalar, _AniMeshScalar >inlinevirtual
cbIterEnd()Dem::DemBones< _Scalar, _AniMeshScalar >inlinevirtual
cbIterEnd()Dem::DemBones< _Scalar, _AniMeshScalar >inlinevirtual
cbTranformationsBegin()Dem::DemBones< _Scalar, _AniMeshScalar >inlinevirtual
cbTransformationsEnd()Dem::DemBones< _Scalar, _AniMeshScalar >inlinevirtual
cbTransformationsIterBegin()Dem::DemBones< _Scalar, _AniMeshScalar >inlinevirtual
cbTransformationsIterEnd()Dem::DemBones< _Scalar, _AniMeshScalar >inlinevirtual
cbTransformationsIterEnd()Dem::DemBones< _Scalar, _AniMeshScalar >inlinevirtual
cbWeightsBegin()Dem::DemBones< _Scalar, _AniMeshScalar >inlinevirtual
cbWeightsEnd()Dem::DemBones< _Scalar, _AniMeshScalar >inlinevirtual
cbWeightsIterBegin()Dem::DemBones< _Scalar, _AniMeshScalar >inlinevirtual
cbWeightsIterEnd()Dem::DemBones< _Scalar, _AniMeshScalar >inlinevirtual
cbWeightsIterEnd()Dem::DemBones< _Scalar, _AniMeshScalar >inlinevirtual
clear()Dem::DemBones< _Scalar, _AniMeshScalar >inline
compute()Dem::DemBones< _Scalar, _AniMeshScalar >inline
computeTranformations()Dem::DemBones< _Scalar, _AniMeshScalar >inline
- + @@ -169,9 +169,9 @@ - - - + + + @@ -187,15 +187,15 @@ - - - + + + - - - + + +
Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
virtual void cbIterBegin ()
 Callback function invoked before each global iteration update. More...
 
virtual void cbIterEnd ()
 Callback function invoked after each global iteration update. More...
 
virtual bool cbIterEnd ()
 Callback function invoked after each global iteration update, stop iteration if return true. More...
 
virtual void cbWeightsBegin ()
 Callback function invoked before each skinning weights update. More...
 
virtual void cbTransformationsIterBegin ()
 Callback function invoked before each local bone transformations update iteration. More...
 
virtual void cbTransformationsIterEnd ()
 Callback function invoked after each local bone transformations update iteration. More...
 
virtual bool cbTransformationsIterEnd ()
 Callback function invoked after each local bone transformations update iteration, stop iteration if return true. More...
 
virtual void cbWeightsIterBegin ()
 Callback function invoked before each local weights update iteration. More...
 
virtual void cbWeightsIterEnd ()
 Callback function invoked after each local weights update iteration. More...
 
virtual bool cbWeightsIterEnd ()
 Callback function invoked after each local weights update iteration, stop iteration if return true. More...
 
@@ -284,7 +284,7 @@

Smooth skinning decomposition with rigid bones and sparse, convex weights.

Setup the required data, parameters, and call either compute(), computeWeights(), computeTranformations(), or init().

-

Callback functions and read-only values can be used to report progress: cbInitSplitBegin(), cbInitSplitEnd(), cbIterBegin(), cbIterEnd(), cbWeightsBegin(), cbWeightsEnd(), cbTranformationsBegin(), cbTransformationsEnd(), cbTransformationsIterBegin(), cbTransformationsIterEnd(), cbWeightsIterBegin(), cbWeightsIterEnd(), rmse(), iter, iterTransformations, iterWeights.

+

Callback functions and read-only values can be used to report progress and stop on convergence: cbInitSplitBegin(), cbInitSplitEnd(), cbIterBegin(), cbIterEnd(), cbWeightsBegin(), cbWeightsEnd(), cbTranformationsBegin(), cbTransformationsEnd(), cbTransformationsIterBegin(), cbTransformationsIterEnd(), cbWeightsIterBegin(), cbWeightsIterEnd(), rmse(), iter, iterTransformations, iterWeights.

_Scalar is the floating-point data type. _AniMeshScalar is the floating-point data type of mesh sequence v.

Definition at line 66 of file DemBones.h.

@@ -569,8 +569,8 @@

-

◆ cbIterEnd()

+ +

◆ cbIterEnd()

@@ -581,7 +581,7 @@

Public Attributes

- + @@ -594,10 +594,10 @@

-

Callback function invoked after each global iteration update.

+

Callback function invoked after each global iteration update, stop iteration if return true.

Definition at line 381 of file DemBones.h.

-
381 {}
+
381 { return false; }
@@ -697,8 +697,8 @@

-

◆ cbTransformationsIterEnd()

+ +

◆ cbTransformationsIterEnd()

@@ -709,7 +709,7 @@

virtual void Dem::DemBones< _Scalar, _AniMeshScalar >::cbIterEnd virtual bool Dem::DemBones< _Scalar, _AniMeshScalar >::cbIterEnd ( )
- + @@ -722,10 +722,10 @@

-

Callback function invoked after each local bone transformations update iteration.

+

Callback function invoked after each local bone transformations update iteration, stop iteration if return true.

Definition at line 396 of file DemBones.h.

-
396 {}
+
396 { return false; }
@@ -825,8 +825,8 @@

-

◆ cbWeightsIterEnd()

+ +

◆ cbWeightsIterEnd()

@@ -837,7 +837,7 @@

virtual void Dem::DemBones< _Scalar, _AniMeshScalar >::cbTransformationsIterEnd virtual bool Dem::DemBones< _Scalar, _AniMeshScalar >::cbTransformationsIterEnd ( )
- + @@ -850,10 +850,10 @@

-

Callback function invoked after each local weights update iteration.

+

Callback function invoked after each local weights update iteration, stop iteration if return true.

Definition at line 401 of file DemBones.h.

-
401 {}
+
401 { return false; }
@@ -947,7 +947,7 @@

348  cbIterBegin();
350  computeWeights();
-
351  cbIterEnd();
+
351  if (cbIterEnd()) break;
352  }
353  }
@@ -1011,7 +1011,7 @@

254  if (uuT.innerIdx(it)!=j) qpT-=m.blk4(k, uuT.innerIdx(it))*uuT.val.blk4(subjectID(k), it);
255  qpT2m(qpT, k, j);
256  }
- +
257  if (cbTransformationsIterEnd()) return;
258  }
259 
@@ -1107,7 +1107,7 @@

323  w.resize(nB, nV);
324  w.setFromTriplets(trip.begin(), trip.end());
325 
- +
326  if (cbWeightsIterEnd()) return;
327  }
328 
329  cbWeightsEnd();
@@ -1221,7 +1221,7 @@

357  _Scalar e=0;
358  #pragma omp parallel for
359  for (int i=0; i<nV; i++) {
-
360  _Scalar ei = 0;
+
360  _Scalar ei=0;
361  Matrix4 mki;
362  for (int k=0; k<nF; k++) {
363  mki.setZero();
@@ -1770,6 +1770,7 @@

const int & iterTransformations
[zero indexed, read only] Current bone transformations update iteration number that can be used for c...
Definition: DemBones.h:154
int nV
Number of vertices, typically indexed by i.
Definition: DemBones.h:114
void init()
Initialize missing skinning weights and/or bone transformations.
Definition: DemBones.h:186
+
virtual bool cbWeightsIterEnd()
Callback function invoked after each local weights update iteration, stop iteration if return true.
Definition: DemBones.h:401
_Scalar transAffineNorm
[parameter] p-norm for bone translations affinity soft constraint, default = 4.0
Definition: DemBones.h:90
MatrixX u
Geometry at the rest poses, size = [3*nS, nV], u.col(i).segment(3*s, 3) is the rest pose of vertex i ...
Definition: DemBones.h:128
void computeTranformations()
Update bone transformations by running nTransIters iterations with transAffine and transAffineNorm re...
Definition: DemBones.h:237
@@ -1780,7 +1781,6 @@

virtual void cbInitSplitBegin()
Callback function invoked before each spliting of bone clusters in initialization.
Definition: DemBones.h:374
Eigen::VectorXi subjectID
Subject index of the frame, size = nF, subjectID(k)=s, where fStart(s) <= k < fStart(s+1)
Definition: DemBones.h:125
Eigen::VectorXi fStart
Start frame indices, size = nS+1, fStart(s), fStart(s+1) are data frames for subject s.
Definition: DemBones.h:123
-
virtual void cbWeightsIterEnd()
Callback function invoked after each local weights update iteration.
Definition: DemBones.h:401
virtual void cbTranformationsBegin()
Callback function invoked before each bone transformations update.
Definition: DemBones.h:389
int nIters
[parameter] Number of global iterations, default = 30
Definition: DemBones.h:80
int nnz
[parameter] Number of non-zero weights per vertex, default = 8
Definition: DemBones.h:95
@@ -1793,15 +1793,15 @@

const int & iter
[zero indexed, read only] Current global iteration number that can be used for callback functions
Definition: DemBones.h:151
virtual void cbWeightsBegin()
Callback function invoked before each skinning weights update.
Definition: DemBones.h:384
Eigen::Triplet< _Scalar > Triplet
Definition: DemBones.h:77
-
virtual void cbIterEnd()
Callback function invoked after each global iteration update.
Definition: DemBones.h:381
SparseMatrix w
Skinning weights, size = [nB, nV], w.col(i) are the skinning weights of vertex i, w(j,...
Definition: DemBones.h:131
int nInitIters
[parameter] Number of clustering update iterations in the initalization, default = 10
Definition: DemBones.h:83
_Scalar weightEps
[parameter] Epsilon for weights solver, default = 1e-15
Definition: DemBones.h:101
Eigen::Matrix< _Scalar, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Definition: DemBones.h:70
int nB
Number of bones, typically indexed by j.
Definition: DemBones.h:116
-
virtual void cbTransformationsIterEnd()
Callback function invoked after each local bone transformations update iteration.
Definition: DemBones.h:396
Eigen::Matrix< _Scalar, 4, 4 > Matrix4
Definition: DemBones.h:71
Eigen::Matrix< _AniMeshScalar, Eigen::Dynamic, Eigen::Dynamic > v
Animated mesh sequence, size = [3*nF, nV], v.col(i).segment(3*k, 3) is the position of vertex i at fr...
Definition: DemBones.h:145
+
virtual bool cbIterEnd()
Callback function invoked after each global iteration update, stop iteration if return true.
Definition: DemBones.h:381
+
virtual bool cbTransformationsIterEnd()
Callback function invoked after each local bone transformations update iteration, stop iteration if r...
Definition: DemBones.h:396
virtual void cbInitSplitEnd()
Callback function invoked after each spliting of bone clusters in initialization.
Definition: DemBones.h:376
Eigen::VectorXi lockM
Bone transformation lock control, size = nB, lockM(j) is the amount of input transformations will be ...
Definition: DemBones.h:142
void computeWeights()
Update skinning weights by running nWeightsIters iterations with weightsSmooth and weightsSmoothStep ...
Definition: DemBones.h:276
diff --git a/docs/htmls/class_dem_1_1_dem_bones.js b/docs/htmls/class_dem_1_1_dem_bones.js index 2ea60a1..82229a6 100644 --- a/docs/htmls/class_dem_1_1_dem_bones.js +++ b/docs/htmls/class_dem_1_1_dem_bones.js @@ -12,15 +12,15 @@ var class_dem_1_1_dem_bones = [ "cbInitSplitBegin", "class_dem_1_1_dem_bones.html#a14f83e468b4a1eb6e2c6c951e7b5a4d3", null ], [ "cbInitSplitEnd", "class_dem_1_1_dem_bones.html#aeb37e92f6b19ed95f4d2793c5f3dd300", null ], [ "cbIterBegin", "class_dem_1_1_dem_bones.html#af43507c4ae91a4bf6550bc2afc25c023", null ], - [ "cbIterEnd", "class_dem_1_1_dem_bones.html#a14c76ee13ad4bd1892a5a00aee5b6d7b", null ], + [ "cbIterEnd", "class_dem_1_1_dem_bones.html#a978a27bd67c19d78bd36242a29876212", null ], [ "cbTranformationsBegin", "class_dem_1_1_dem_bones.html#a5d5a50f2d4622a4823065cdca03ac9aa", null ], [ "cbTransformationsEnd", "class_dem_1_1_dem_bones.html#a8008b672232b4d2f4081e00eea2ff062", null ], [ "cbTransformationsIterBegin", "class_dem_1_1_dem_bones.html#a938532a49b8ae162b866f9b59a75a7ab", null ], - [ "cbTransformationsIterEnd", "class_dem_1_1_dem_bones.html#abeafdad7ecf17d7d6e9bd8685d5ee91b", null ], + [ "cbTransformationsIterEnd", "class_dem_1_1_dem_bones.html#aaaf326326d6094637dd0a995a778241f", null ], [ "cbWeightsBegin", "class_dem_1_1_dem_bones.html#ac4698b8e39c770e51aea7122689edcdf", null ], [ "cbWeightsEnd", "class_dem_1_1_dem_bones.html#a9dc51d56fe59c8c3e1e221b9819360f9", null ], [ "cbWeightsIterBegin", "class_dem_1_1_dem_bones.html#a6391078901046e3acbd582dba6654fdd", null ], - [ "cbWeightsIterEnd", "class_dem_1_1_dem_bones.html#add033742fc48d3c367be2ea4d687343c", null ], + [ "cbWeightsIterEnd", "class_dem_1_1_dem_bones.html#a610c7725152df6465cd5f49311a3eeed", null ], [ "clear", "class_dem_1_1_dem_bones.html#a18bcd81e4238a4a298c4ee4ca78ae2fb", null ], [ "compute", "class_dem_1_1_dem_bones.html#ac8d2821c730539490ad6ce956a0b62a6", null ], [ "computeTranformations", "class_dem_1_1_dem_bones.html#a673287121735ea64e0e4c244bacc432b", null ], diff --git a/docs/htmls/class_dem_1_1_dem_bones_ext-members.html b/docs/htmls/class_dem_1_1_dem_bones_ext-members.html index ed5e807..4c6118d 100644 --- a/docs/htmls/class_dem_1_1_dem_bones_ext-members.html +++ b/docs/htmls/class_dem_1_1_dem_bones_ext-members.html @@ -34,10 +34,10 @@

virtual void Dem::DemBones< _Scalar, _AniMeshScalar >::cbWeightsIterEnd virtual bool Dem::DemBones< _Scalar, _AniMeshScalar >::cbWeightsIterEnd ( )
- + @@ -107,18 +107,18 @@ - + - + - + - + @@ -145,24 +145,25 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + +
Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
cbInitSplitBegin()Dem::DemBones< _Scalar, _AniMeshScalar >inlinevirtual
cbInitSplitEnd()Dem::DemBones< _Scalar, _AniMeshScalar >inlinevirtual
cbIterBegin()Dem::DemBones< _Scalar, _AniMeshScalar >inlinevirtual
cbIterEnd()Dem::DemBones< _Scalar, _AniMeshScalar >inlinevirtual
cbIterEnd()Dem::DemBones< _Scalar, _AniMeshScalar >inlinevirtual
cbTranformationsBegin()Dem::DemBones< _Scalar, _AniMeshScalar >inlinevirtual
cbTransformationsEnd()Dem::DemBones< _Scalar, _AniMeshScalar >inlinevirtual
cbTransformationsIterBegin()Dem::DemBones< _Scalar, _AniMeshScalar >inlinevirtual
cbTransformationsIterEnd()Dem::DemBones< _Scalar, _AniMeshScalar >inlinevirtual
cbTransformationsIterEnd()Dem::DemBones< _Scalar, _AniMeshScalar >inlinevirtual
cbWeightsBegin()Dem::DemBones< _Scalar, _AniMeshScalar >inlinevirtual
cbWeightsEnd()Dem::DemBones< _Scalar, _AniMeshScalar >inlinevirtual
cbWeightsIterBegin()Dem::DemBones< _Scalar, _AniMeshScalar >inlinevirtual
cbWeightsIterEnd()Dem::DemBones< _Scalar, _AniMeshScalar >inlinevirtual
cbWeightsIterEnd()Dem::DemBones< _Scalar, _AniMeshScalar >inlinevirtual
clear()Dem::DemBonesExt< _Scalar, _AniMeshScalar >inline
compute()Dem::DemBones< _Scalar, _AniMeshScalar >inline
computeRTB(int s, const MatrixX &orient, MatrixX &lr, MatrixX &lt, MatrixX &gb, MatrixX &lbr, MatrixX &lbt, bool degreeRot=true)Dem::DemBonesExt< _Scalar, _AniMeshScalar >inline
computeRTB(int s, MatrixX &lr, MatrixX &lt, MatrixX &gb, MatrixX &lbr, MatrixX &lbt, bool degreeRot=true)Dem::DemBonesExt< _Scalar, _AniMeshScalar >inline
computeTranformations()Dem::DemBones< _Scalar, _AniMeshScalar >inline
computeWeights()Dem::DemBones< _Scalar, _AniMeshScalar >inline
DemBones()Dem::DemBones< _Scalar, _AniMeshScalar >inline
nTransItersDem::DemBones< _Scalar, _AniMeshScalar >
nVDem::DemBones< _Scalar, _AniMeshScalar >
nWeightsItersDem::DemBones< _Scalar, _AniMeshScalar >
parentDem::DemBonesExt< _Scalar, _AniMeshScalar >
preMulInvDem::DemBonesExt< _Scalar, _AniMeshScalar >
rmse()Dem::DemBones< _Scalar, _AniMeshScalar >inline
rotOrderDem::DemBonesExt< _Scalar, _AniMeshScalar >
SparseMatrix typedefDem::DemBonesExt< _Scalar, _AniMeshScalar >
subjectIDDem::DemBones< _Scalar, _AniMeshScalar >
transAffineDem::DemBones< _Scalar, _AniMeshScalar >
transAffineNormDem::DemBones< _Scalar, _AniMeshScalar >
Triplet typedefDem::DemBonesExt< _Scalar, _AniMeshScalar >
uDem::DemBones< _Scalar, _AniMeshScalar >
vDem::DemBones< _Scalar, _AniMeshScalar >
Vector3 typedefDem::DemBonesExt< _Scalar, _AniMeshScalar >
Vector4 typedefDem::DemBonesExt< _Scalar, _AniMeshScalar >
VectorX typedefDem::DemBonesExt< _Scalar, _AniMeshScalar >
wDem::DemBones< _Scalar, _AniMeshScalar >
weightEpsDem::DemBones< _Scalar, _AniMeshScalar >
weightsSmoothDem::DemBones< _Scalar, _AniMeshScalar >
weightsSmoothStepDem::DemBones< _Scalar, _AniMeshScalar >
orientDem::DemBonesExt< _Scalar, _AniMeshScalar >
parentDem::DemBonesExt< _Scalar, _AniMeshScalar >
preMulInvDem::DemBonesExt< _Scalar, _AniMeshScalar >
rmse()Dem::DemBones< _Scalar, _AniMeshScalar >inline
rotOrderDem::DemBonesExt< _Scalar, _AniMeshScalar >
SparseMatrix typedefDem::DemBonesExt< _Scalar, _AniMeshScalar >
subjectIDDem::DemBones< _Scalar, _AniMeshScalar >
transAffineDem::DemBones< _Scalar, _AniMeshScalar >
transAffineNormDem::DemBones< _Scalar, _AniMeshScalar >
Triplet typedefDem::DemBonesExt< _Scalar, _AniMeshScalar >
uDem::DemBones< _Scalar, _AniMeshScalar >
vDem::DemBones< _Scalar, _AniMeshScalar >
Vector3 typedefDem::DemBonesExt< _Scalar, _AniMeshScalar >
Vector4 typedefDem::DemBonesExt< _Scalar, _AniMeshScalar >
VectorX typedefDem::DemBonesExt< _Scalar, _AniMeshScalar >
wDem::DemBones< _Scalar, _AniMeshScalar >
weightEpsDem::DemBones< _Scalar, _AniMeshScalar >
weightsSmoothDem::DemBones< _Scalar, _AniMeshScalar >
weightsSmoothStepDem::DemBones< _Scalar, _AniMeshScalar >
diff --git a/docs/htmls/class_dem_1_1_dem_bones_ext.html b/docs/htmls/class_dem_1_1_dem_bones_ext.html index 368b9ba..12af4b5 100644 --- a/docs/htmls/class_dem_1_1_dem_bones_ext.html +++ b/docs/htmls/class_dem_1_1_dem_bones_ext.html @@ -34,10 +34,10 @@ - + @@ -162,9 +162,9 @@ - - - + + + @@ -195,9 +195,9 @@ - - - + + + @@ -213,15 +213,15 @@ - - - + + + - - - + + +
Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
void clear ()
 Clear all data. More...
 
void computeRTB (int s, const MatrixX &orient, MatrixX &lr, MatrixX &lt, MatrixX &gb, MatrixX &lbr, MatrixX &lbt, bool degreeRot=true)
 Local rotations, translations and global bind matrices of a subject. More...
 
void computeRTB (int s, MatrixX &lr, MatrixX &lt, MatrixX &gb, MatrixX &lbr, MatrixX &lbt, bool degreeRot=true)
 Local rotations, translations and global bind matrices of a subject. More...
 
- Public Member Functions inherited from Dem::DemBones< _Scalar, _AniMeshScalar >
 DemBones ()
 Constructor and setting default parameters. More...
virtual void cbIterBegin ()
 Callback function invoked before each global iteration update. More...
 
virtual void cbIterEnd ()
 Callback function invoked after each global iteration update. More...
 
virtual bool cbIterEnd ()
 Callback function invoked after each global iteration update, stop iteration if return true. More...
 
virtual void cbWeightsBegin ()
 Callback function invoked before each skinning weights update. More...
 
virtual void cbTransformationsIterBegin ()
 Callback function invoked before each local bone transformations update iteration. More...
 
virtual void cbTransformationsIterEnd ()
 Callback function invoked after each local bone transformations update iteration. More...
 
virtual bool cbTransformationsIterEnd ()
 Callback function invoked after each local bone transformations update iteration, stop iteration if return true. More...
 
virtual void cbWeightsIterBegin ()
 Callback function invoked before each local weights update iteration. More...
 
virtual void cbWeightsIterEnd ()
 Callback function invoked after each local weights update iteration. More...
 
virtual bool cbWeightsIterEnd ()
 Callback function invoked after each local weights update iteration, stop iteration if return true. More...
 
@@ -244,8 +244,11 @@ + + + - + @@ -332,7 +335,7 @@ class Dem::DemBonesExt< _Scalar, _AniMeshScalar >

Extended class to handle hierarchical skeleton with local rotations/translations and bind matrices.

-

Call computeRTB() to get local rotations/translations and bind matrices after skinning decomposition is done and other data is set.

+

Call computeRTB() to get local rotations/translations and bind matrices after skinning decomposition is done and other data is set.

_Scalar is the floating-point data type. _AniMeshScalar is the floating-point data type of mesh sequence v.

Definition at line 31 of file DemBonesExt.h.

@@ -509,10 +512,10 @@

Definition at line 96 of file DemBonesExt.h.

-
96  : bindUpdate(0) {
-
97  clear();
-
98  }
+

Definition at line 99 of file DemBonesExt.h.

+
99  : bindUpdate(0) {
+
100  clear();
+
101  }
@@ -544,21 +547,22 @@

Definition at line 102 of file DemBonesExt.h.

-
102  {
-
103  fTime.resize(0);
-
104  boneName.resize(0);
-
105  parent.resize(0);
-
106  bind.resize(0, 0);
-
107  preMulInv.resize(0, 0);
-
108  rotOrder.resize(0, 0);
- -
110  }
+

Definition at line 105 of file DemBonesExt.h.

+
105  {
+
106  fTime.resize(0);
+
107  boneName.resize(0);
+
108  parent.resize(0);
+
109  bind.resize(0, 0);
+
110  preMulInv.resize(0, 0);
+
111  rotOrder.resize(0, 0);
+
112  orient.resize(0, 0);
+ +
114  }
- -

◆ computeRTB()

+ +

◆ computeRTB()

@@ -574,12 +578,6 @@

int 

- - - - - - @@ -631,74 +629,81 @@

u, fv, nV, v, nF, fStart, subjectID, nS, m, w, nB

-

This function will initialize these default values for missing attributes:

    -
  • parent: -1 vector, [size] = nB
  • +

    This function will initialize missing attributes:

      +
    • parent: -1 vector (if no joint grouping) or parent to a root, [size] = nB
    • preMulInv: 4*4 identity matrix blocks, [size] = [4*nS, 4*nB]
    • rotOrder: {0, 1, 2} vector blocks, [size] = [3*nS, nB]
    • +
    • orient: 0 matrix, [size] = [3*nS, nB]
    Parameters

Public Attributes

 Rotation order, [size] = [3*nS, nB], rotOrder.col(j).segment<3>(3*s) is the rotation order of bone j on subject s, 0=X, 1=Y, 2=Z, e.g. {0, 1, 2} is XYZ order
More...
 
MatrixX orient
 Orientations of bones, [size] = [3*nS, nB], orient.col(j).segment<3>(3*s) is the(rx, ry, rz) orientation of bone j in degree. More...
 
int bindUpdate
 Bind transformation update, 0=keep original, 1=set translations to p-norm centroids (using transAffineNorm) and rotations to identity. More...
 Bind transformation update, 0=keep original, 1=set translations to p-norm centroids (using transAffineNorm) and rotations to identity, 2=do 1 and group joints. More...
 
- Public Attributes inherited from Dem::DemBones< _Scalar, _AniMeshScalar >
int nIters
s,
const MatrixXorient,
- - +
[in]sis the subject index
[in]orientis the [3, nB] orientations of bones, orient.col(j) is the (rx, ry, rz) orientation of bone j in degree
[out]lris the [3*nFr, nB] by-reference output local rotations, lr.col(j).segment<3>(3*k) is the (rx, ry, rz) of bone j at frame k
[out]ltis the [3*nFr, nB] by-reference output local translations, lt.col(j).segment<3>(3*k) is the (tx, ty, tz) of bone j at frame k
[out]gbis the [4, 4*nB] by-reference output global bind matrices, gb.block(0, 4*j, 4, 4) is the bind matrix of bone j
[out]lbris the [3, nB] by-reference output local rotations at bind pose lbr.col(j).segment<3>(3*k) is the (rx, ry, rz) of bone j
[out]lbtis the [3, nB] by-reference output local translations at bind pose, lbt.col(j).segment<3>(3**3k) is the (tx, ty, tz) of bone j
[out]lbtis the [3, nB] by-reference output local translations at bind pose, lbt.col(j).segment<3>(3*k) is the (tx, ty, tz) of bone j
[in]degreeRot=truewill output rotations in degree, otherwise output in radian
-

Definition at line 129 of file DemBonesExt.h.

-
129  {
-
130  computeBind(s, gb);
-
131 
-
132  if (parent.size()==0) parent=Eigen::VectorXi::Constant(nB, -1);
-
133  if (preMulInv.size()==0) preMulInv=MatrixX::Identity(4, 4).replicate(nS, nB);
-
134  if (rotOrder.size()==0) rotOrder=Eigen::Vector3i(0, 1, 2).replicate(nS, nB);
+

Definition at line 133 of file DemBonesExt.h.

+
133  {
+
134  computeBind(s, gb);
135 
-
136  int nFs=fStart(s+1)-fStart(s);
-
137  lr.resize(nFs*3, nB);
-
138  lt.resize(nFs*3, nB);
-
139  lbr.resize(3, nB);
-
140  lbt.resize(3, nB);
-
141 
-
142  MatrixX lm(4*nFs, 4*nB);
-
143  #pragma omp parallel for
-
144  for (int j=0; j<nB; j++) {
-
145  Eigen::Vector3i ro=rotOrder.col(j).template segment<3>(s*3);
+
136  if (parent.size()==0) {
+
137  if (bindUpdate==2) {
+
138  int root=computeRoot();
+
139  parent=Eigen::VectorXi::Constant(nB, root);
+
140  parent(root)=-1;
+
141  } else parent=Eigen::VectorXi::Constant(nB, -1);
+
142  }
+
143  if (preMulInv.size()==0) preMulInv=MatrixX::Identity(4, 4).replicate(nS, nB);
+
144  if (rotOrder.size()==0) rotOrder=Eigen::Vector3i(0, 1, 2).replicate(nS, nB);
+
145  if (orient.size()==0) orient=MatrixX::Zero(3*nS, nB);
146 
-
147  Vector3 ov=orient.col(j)*EIGEN_PI/180;
-
148  Matrix3 invOM=Matrix3(Eigen::AngleAxis<_Scalar>(ov(ro(2)), Vector3::Unit(ro(2))))*
-
149  Eigen::AngleAxis<_Scalar>(ov(ro(1)), Vector3::Unit(ro(1)))*
-
150  Eigen::AngleAxis<_Scalar>(ov(ro(0)), Vector3::Unit(ro(0)));
-
151  invOM.transposeInPlace();
+
147  int nFs=fStart(s+1)-fStart(s);
+
148  lr.resize(nFs*3, nB);
+
149  lt.resize(nFs*3, nB);
+
150  lbr.resize(3, nB);
+
151  lbt.resize(3, nB);
152 
-
153  Matrix4 lb;
-
154  if (parent(j)==-1) lb=preMulInv.blk4(s, j)*gb.blk4(0, j);
-
155  else lb=preMulInv.blk4(s, j)*gb.blk4(0, parent(j)).inverse()*gb.blk4(0, j);
-
156 
-
157  Vector3 curRot=Vector3::Zero();
-
158  toRot(invOM*lb.template topLeftCorner<3, 3>(), curRot, ro);
-
159  lbr.col(j)=curRot;
-
160  lbt.col(j)=lb.template topRightCorner<3, 1>();
-
161 
-
162  Matrix4 lm;
-
163  for (int k=0; k<nFs; k++) {
-
164  if (parent(j)==-1) lm=preMulInv.blk4(s, j)*m.blk4(k+fStart(s), j)*gb.blk4(0, j);
-
165  else lm=preMulInv.blk4(s, j)*(m.blk4(k+fStart(s), parent(j))*gb.blk4(0, parent(j))).inverse()*m.blk4(k+fStart(s), j)*gb.blk4(0, j);
-
166  toRot(invOM*lm.template topLeftCorner<3, 3>(), curRot, ro);
-
167  lr.vec3(k, j)=curRot;
-
168  lt.vec3(k, j)=lm.template topRightCorner<3, 1>();
-
169  }
-
170  }
-
171 
-
172  if (degreeRot) {
-
173  lr*=180/EIGEN_PI;
-
174  lbr*=180/EIGEN_PI;
-
175  }
-
176  }
+
153  MatrixX lm(4*nFs, 4*nB);
+
154  #pragma omp parallel for
+
155  for (int j=0; j<nB; j++) {
+
156  Eigen::Vector3i ro=rotOrder.col(j).template segment<3>(s*3);
+
157 
+
158  Vector3 ov=orient.vec3(s, j)*EIGEN_PI/180;
+
159  Matrix3 invOM=Matrix3(Eigen::AngleAxis<_Scalar>(ov(ro(2)), Vector3::Unit(ro(2))))*
+
160  Eigen::AngleAxis<_Scalar>(ov(ro(1)), Vector3::Unit(ro(1)))*
+
161  Eigen::AngleAxis<_Scalar>(ov(ro(0)), Vector3::Unit(ro(0)));
+
162  invOM.transposeInPlace();
+
163 
+
164  Matrix4 lb;
+
165  if (parent(j)==-1) lb=preMulInv.blk4(s, j)*gb.blk4(0, j);
+
166  else lb=preMulInv.blk4(s, j)*gb.blk4(0, parent(j)).inverse()*gb.blk4(0, j);
+
167 
+
168  Vector3 curRot=Vector3::Zero();
+
169  toRot(invOM*lb.template topLeftCorner<3, 3>(), curRot, ro);
+
170  lbr.col(j)=curRot;
+
171  lbt.col(j)=lb.template topRightCorner<3, 1>();
+
172 
+
173  Matrix4 lm;
+
174  for (int k=0; k<nFs; k++) {
+
175  if (parent(j)==-1) lm=preMulInv.blk4(s, j)*m.blk4(k+fStart(s), j)*gb.blk4(0, j);
+
176  else lm=preMulInv.blk4(s, j)*(m.blk4(k+fStart(s), parent(j))*gb.blk4(0, parent(j))).inverse()*m.blk4(k+fStart(s), j)*gb.blk4(0, j);
+
177  toRot(invOM*lm.template topLeftCorner<3, 3>(), curRot, ro);
+
178  lr.vec3(k, j)=curRot;
+
179  lt.vec3(k, j)=lm.template topRightCorner<3, 1>();
+
180  }
+
181  }
+
182 
+
183  if (degreeRot) {
+
184  lr*=180/EIGEN_PI;
+
185  lbr*=180/EIGEN_PI;
+
186  }
+
187  }
@@ -737,9 +742,9 @@

-

Bind transformation update, 0=keep original, 1=set translations to p-norm centroids (using transAffineNorm) and rotations to identity.

+

Bind transformation update, 0=keep original, 1=set translations to p-norm centroids (using transAffineNorm) and rotations to identity, 2=do 1 and group joints.

-

Definition at line 92 of file DemBonesExt.h.

+

Definition at line 95 of file DemBonesExt.h.

@@ -781,6 +786,26 @@

Definition at line 74 of file DemBonesExt.h.

+ + + +

◆ orient

+ +
+
+
+template<class _Scalar , class _AniMeshScalar >
+ + + + +
MatrixX Dem::DemBonesExt< _Scalar, _AniMeshScalar >::orient
+
+ +

Orientations of bones, [size] = [3*nS, nB], orient.col(j).segment<3>(3*s) is the(rx, ry, rz) orientation of bone j in degree.

+ +

Definition at line 92 of file DemBonesExt.h.

+
@@ -853,14 +878,15 @@

Eigen::Matrix< _Scalar, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Definition: DemBonesExt.h:35
Eigen::VectorXi fStart
Start frame indices, size = nS+1, fStart(s), fStart(s+1) are data frames for subject s.
Definition: DemBones.h:123
MatrixX preMulInv
Inverse pre-multiplication matrices, [size] = [4*nS, 4*nB], preMulInv.block(4*s, 4*j,...
Definition: DemBonesExt.h:86
-
void clear()
Clear all data.
Definition: DemBonesExt.h:102
+
MatrixX orient
Orientations of bones, [size] = [3*nS, nB], orient.col(j).segment<3>(3*s) is the(rx,...
Definition: DemBonesExt.h:92
+
void clear()
Clear all data.
Definition: DemBonesExt.h:105
Eigen::Matrix< _Scalar, 3, 3 > Matrix3
Definition: DemBonesExt.h:37
Eigen::VectorXd fTime
Timestamps for bone transformations m, [size] = nS, fTime(k) is the timestamp of frame k.
Definition: DemBonesExt.h:74
int nS
Number of subjects, typically indexed by s.
Definition: DemBones.h:118
Eigen::Matrix< _Scalar, 3, 1 > Vector3
Definition: DemBonesExt.h:40
MatrixX bind
Original bind pre-matrix, [size] = [4*nS, 4*nB], bind.block(4*s, 4*j, 4, 4) is the global bind matrix...
Definition: DemBonesExt.h:83
Eigen::VectorXi parent
Parent bone index, [size] = nB, parent(j) is the index of parent bone of j, parent(j) = -1 if j has n...
Definition: DemBonesExt.h:80
-
int bindUpdate
Bind transformation update, 0=keep original, 1=set translations to p-norm centroids (using transAffin...
Definition: DemBonesExt.h:92
+
int bindUpdate
Bind transformation update, 0=keep original, 1=set translations to p-norm centroids (using transAffin...
Definition: DemBonesExt.h:95
int nB
Number of bones, typically indexed by j.
Definition: DemBones.h:116
std::vector< std::string > boneName
Name of bones, [size] = nB, boneName(j) is the name bone of j.
Definition: DemBonesExt.h:77
Eigen::MatrixXi rotOrder
Rotation order, [size] = [3*nS, nB], rotOrder.col(j).segment<3>(3*s) is the rotation order of bone j ...
Definition: DemBonesExt.h:89
diff --git a/docs/htmls/class_dem_1_1_dem_bones_ext.js b/docs/htmls/class_dem_1_1_dem_bones_ext.js index ecb9f55..7def500 100644 --- a/docs/htmls/class_dem_1_1_dem_bones_ext.js +++ b/docs/htmls/class_dem_1_1_dem_bones_ext.js @@ -10,11 +10,12 @@ var class_dem_1_1_dem_bones_ext = [ "VectorX", "class_dem_1_1_dem_bones_ext.html#ae4ea2e0183a87df169cb893c1a699709", null ], [ "DemBonesExt", "class_dem_1_1_dem_bones_ext.html#a582382217aeefd8d2fb93bcb6aad9875", null ], [ "clear", "class_dem_1_1_dem_bones_ext.html#a9fd6e95de36adee0d487786315da551f", null ], - [ "computeRTB", "class_dem_1_1_dem_bones_ext.html#a194d4d943c5b85f6474f25d188872bd6", null ], + [ "computeRTB", "class_dem_1_1_dem_bones_ext.html#a4be2b221fa273518adbd3fa2e2bc86d0", null ], [ "bind", "class_dem_1_1_dem_bones_ext.html#a85422fd18d48c40485f05d77b1c4cf4d", null ], [ "bindUpdate", "class_dem_1_1_dem_bones_ext.html#a92939c0de147f8075754d9cbf66113fc", null ], [ "boneName", "class_dem_1_1_dem_bones_ext.html#afcf732ef4b030e907b7054232cc255f5", null ], [ "fTime", "class_dem_1_1_dem_bones_ext.html#aebbc9093e05f8d3a466fe40610f5289d", null ], + [ "orient", "class_dem_1_1_dem_bones_ext.html#a9a6a2004f16832cd3f97c22789147a8a", null ], [ "parent", "class_dem_1_1_dem_bones_ext.html#ad740868b3bc6cdf34e6e2ec5f35e24d7", null ], [ "preMulInv", "class_dem_1_1_dem_bones_ext.html#a3785152d056860bc55febcad64837ef3", null ], [ "rotOrder", "class_dem_1_1_dem_bones_ext.html#a30f4bfbe88493adecae038035e0b33be", null ] diff --git a/docs/htmls/class_dem_1_1indexing__functor__row-members.html b/docs/htmls/class_dem_1_1indexing__functor__row-members.html index c6465b6..5cb69bb 100644 --- a/docs/htmls/class_dem_1_1indexing__functor__row-members.html +++ b/docs/htmls/class_dem_1_1indexing__functor__row-members.html @@ -34,10 +34,10 @@ - + diff --git a/docs/htmls/class_dem_1_1indexing__functor__row.html b/docs/htmls/class_dem_1_1indexing__functor__row.html index 52f2c1d..f3be6d6 100644 --- a/docs/htmls/class_dem_1_1indexing__functor__row.html +++ b/docs/htmls/class_dem_1_1indexing__functor__row.html @@ -34,10 +34,10 @@
Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
- + diff --git a/docs/htmls/class_dem_1_1indexing__functor__row__col-members.html b/docs/htmls/class_dem_1_1indexing__functor__row__col-members.html index 8497de5..2911b94 100644 --- a/docs/htmls/class_dem_1_1indexing__functor__row__col-members.html +++ b/docs/htmls/class_dem_1_1indexing__functor__row__col-members.html @@ -34,10 +34,10 @@
Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
- + diff --git a/docs/htmls/class_dem_1_1indexing__functor__row__col.html b/docs/htmls/class_dem_1_1indexing__functor__row__col.html index b237796..d7f39d9 100644 --- a/docs/htmls/class_dem_1_1indexing__functor__row__col.html +++ b/docs/htmls/class_dem_1_1indexing__functor__row__col.html @@ -34,10 +34,10 @@
Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
- + diff --git a/docs/htmls/class_dem_1_1indexing__functor__vector-members.html b/docs/htmls/class_dem_1_1indexing__functor__vector-members.html index 20fc506..fffb68b 100644 --- a/docs/htmls/class_dem_1_1indexing__functor__vector-members.html +++ b/docs/htmls/class_dem_1_1indexing__functor__vector-members.html @@ -34,10 +34,10 @@
Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
- + diff --git a/docs/htmls/class_dem_1_1indexing__functor__vector.html b/docs/htmls/class_dem_1_1indexing__functor__vector.html index 9420f39..117285a 100644 --- a/docs/htmls/class_dem_1_1indexing__functor__vector.html +++ b/docs/htmls/class_dem_1_1indexing__functor__vector.html @@ -34,10 +34,10 @@
Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
- + diff --git a/docs/htmls/classes.html b/docs/htmls/classes.html index ca218f0..1c15aa8 100644 --- a/docs/htmls/classes.html +++ b/docs/htmls/classes.html @@ -34,10 +34,10 @@
Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
- + diff --git a/docs/htmls/dir_4df80cdcb6e25b788688d708f51a1dfc.html b/docs/htmls/dir_4df80cdcb6e25b788688d708f51a1dfc.html index 461e1c4..d831184 100644 --- a/docs/htmls/dir_4df80cdcb6e25b788688d708f51a1dfc.html +++ b/docs/htmls/dir_4df80cdcb6e25b788688d708f51a1dfc.html @@ -34,10 +34,10 @@
Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
- + diff --git a/docs/htmls/dir_d44c64559bbebec7f509842c48db8b23.html b/docs/htmls/dir_d44c64559bbebec7f509842c48db8b23.html index 223ae41..272a21c 100644 --- a/docs/htmls/dir_d44c64559bbebec7f509842c48db8b23.html +++ b/docs/htmls/dir_d44c64559bbebec7f509842c48db8b23.html @@ -34,10 +34,10 @@
Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
- + diff --git a/docs/htmls/files.html b/docs/htmls/files.html index a8142aa..509a3f0 100644 --- a/docs/htmls/files.html +++ b/docs/htmls/files.html @@ -34,10 +34,10 @@
Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
- + diff --git a/docs/htmls/functions.html b/docs/htmls/functions.html index b5293f6..f031478 100644 --- a/docs/htmls/functions.html +++ b/docs/htmls/functions.html @@ -34,10 +34,10 @@
Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
- + @@ -120,7 +120,7 @@

- c -

Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
- + @@ -107,7 +107,7 @@

- c -

Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
- + diff --git a/docs/htmls/functions_vars.html b/docs/htmls/functions_vars.html index 32d6ece..6754f32 100644 --- a/docs/htmls/functions_vars.html +++ b/docs/htmls/functions_vars.html @@ -34,10 +34,10 @@
Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
- + @@ -183,6 +183,13 @@

- n -

+

- o -

+ +

- p -

  • parent : Dem::DemBonesExt< _Scalar, _AniMeshScalar > diff --git a/docs/htmls/globals.html b/docs/htmls/globals.html index 2fc24fb..197a11a 100644 --- a/docs/htmls/globals.html +++ b/docs/htmls/globals.html @@ -34,10 +34,10 @@
Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
- + diff --git a/docs/htmls/globals_defs.html b/docs/htmls/globals_defs.html index 1ef557c..def685a 100644 --- a/docs/htmls/globals_defs.html +++ b/docs/htmls/globals_defs.html @@ -34,10 +34,10 @@
Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
- + diff --git a/docs/htmls/hierarchy.html b/docs/htmls/hierarchy.html index a7c51ad..bf739f8 100644 --- a/docs/htmls/hierarchy.html +++ b/docs/htmls/hierarchy.html @@ -34,10 +34,10 @@
Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
- + diff --git a/docs/htmls/index.html b/docs/htmls/index.html index 085a20c..792828c 100644 --- a/docs/htmls/index.html +++ b/docs/htmls/index.html @@ -34,10 +34,10 @@
Dem Bones -  1.1.0 +  1.2.0
Skinning Decomposition Library
- + @@ -123,13 +123,13 @@
  • [optional] Setup extended class:
  • [optional] Override callback functions (cb...) in the base class DemBones
  • Call decomposition function DemBones::compute(), DemBones::computeWeights(), DemBones::computeTranformations(), or DemBones::init()
  • -
  • [optional] Get local transformations/bind poses with DemBonesExt::computeRTB()
  • +
  • [optional] Get local transformations/bind poses with DemBonesExt::computeRTB()
  • diff --git a/docs/htmls/menudata.js b/docs/htmls/menudata.js index 0108039..0c0d905 100644 --- a/docs/htmls/menudata.js +++ b/docs/htmls/menudata.js @@ -63,6 +63,7 @@ var menudata={children:[ {text:"l",url:"functions_vars.html#index_l"}, {text:"m",url:"functions_vars.html#index_m"}, {text:"n",url:"functions_vars.html#index_n"}, +{text:"o",url:"functions_vars.html#index_o"}, {text:"p",url:"functions_vars.html#index_p"}, {text:"r",url:"functions_vars.html#index_r"}, {text:"s",url:"functions_vars.html#index_s"}, diff --git a/docs/htmls/namespace_dem.html b/docs/htmls/namespace_dem.html index 215a91f..4e7acb0 100644 --- a/docs/htmls/namespace_dem.html +++ b/docs/htmls/namespace_dem.html @@ -34,10 +34,10 @@
    Dem Bones -  1.1.0 +  1.2.0
    Skinning Decomposition Library
    - + diff --git a/docs/htmls/namespacemembers.html b/docs/htmls/namespacemembers.html index 860393d..d79b63b 100644 --- a/docs/htmls/namespacemembers.html +++ b/docs/htmls/namespacemembers.html @@ -34,10 +34,10 @@
    Dem Bones -  1.1.0 +  1.2.0
    Skinning Decomposition Library
    - + diff --git a/docs/htmls/namespacemembers_func.html b/docs/htmls/namespacemembers_func.html index 1f071b7..c44e6ed 100644 --- a/docs/htmls/namespacemembers_func.html +++ b/docs/htmls/namespacemembers_func.html @@ -34,10 +34,10 @@
    Dem Bones -  1.1.0 +  1.2.0
    Skinning Decomposition Library
    - + diff --git a/docs/htmls/namespaces.html b/docs/htmls/namespaces.html index ba900ac..25a15e6 100644 --- a/docs/htmls/namespaces.html +++ b/docs/htmls/namespaces.html @@ -34,10 +34,10 @@
    Dem Bones -  1.1.0 +  1.2.0
    Skinning Decomposition Library
    - + diff --git a/docs/htmls/navtreeindex0.js b/docs/htmls/navtreeindex0.js index e939325..09c9175 100644 --- a/docs/htmls/navtreeindex0.js +++ b/docs/htmls/navtreeindex0.js @@ -30,7 +30,6 @@ var NAVTREEINDEX0 = "class_dem_1_1_dem_bones.html#a050b398499f5daa9e42119b0774f25d0":[2,0,0,1,26], "class_dem_1_1_dem_bones.html#a06065f12b701c9bb556b7a79d14e984b":[2,0,0,1,29], "class_dem_1_1_dem_bones.html#a0c30c98fb363f888345d86e5a11acd14":[2,0,0,1,6], -"class_dem_1_1_dem_bones.html#a14c76ee13ad4bd1892a5a00aee5b6d7b":[2,0,0,1,12], "class_dem_1_1_dem_bones.html#a14f83e468b4a1eb6e2c6c951e7b5a4d3":[2,0,0,1,9], "class_dem_1_1_dem_bones.html#a153f756d2284f955e35229f15753264c":[2,0,0,1,33], "class_dem_1_1_dem_bones.html#a18bcd81e4238a4a298c4ee4ca78ae2fb":[2,0,0,1,21], @@ -43,6 +42,7 @@ var NAVTREEINDEX0 = "class_dem_1_1_dem_bones.html#a53f9859cd63a8c51f6f50fdfa7251681":[2,0,0,1,45], "class_dem_1_1_dem_bones.html#a5d5a50f2d4622a4823065cdca03ac9aa":[2,0,0,1,13], "class_dem_1_1_dem_bones.html#a5e4b99c4a233b477116204f9f1fae9cd":[2,0,0,1,2], +"class_dem_1_1_dem_bones.html#a610c7725152df6465cd5f49311a3eeed":[2,0,0,1,20], "class_dem_1_1_dem_bones.html#a6391078901046e3acbd582dba6654fdd":[2,0,0,1,19], "class_dem_1_1_dem_bones.html#a673287121735ea64e0e4c244bacc432b":[2,0,0,1,23], "class_dem_1_1_dem_bones.html#a8008b672232b4d2f4081e00eea2ff062":[2,0,0,1,14], @@ -52,6 +52,7 @@ var NAVTREEINDEX0 = "class_dem_1_1_dem_bones.html#a913edb0e3273c6b18012c000a0764915":[2,0,0,1,40], "class_dem_1_1_dem_bones.html#a938532a49b8ae162b866f9b59a75a7ab":[2,0,0,1,15], "class_dem_1_1_dem_bones.html#a9404399e2528175da18fd80d7d4fc4f9":[2,0,0,1,5], +"class_dem_1_1_dem_bones.html#a978a27bd67c19d78bd36242a29876212":[2,0,0,1,12], "class_dem_1_1_dem_bones.html#a9afbf2acccc4126e1e76c2a41f3ac649":[2,0,0,1,41], "class_dem_1_1_dem_bones.html#a9dc51d56fe59c8c3e1e221b9819360f9":[2,0,0,1,18], "class_dem_1_1_dem_bones.html#aa0b51ddfe06be09fdf3c74a00f5dd867":[2,0,0,1,35], @@ -59,9 +60,9 @@ var NAVTREEINDEX0 = "class_dem_1_1_dem_bones.html#aa7f14b41174dc22e81b089d0c5a56950":[2,0,0,1,38], "class_dem_1_1_dem_bones.html#aa8ea3a6b166652e954decbf135b3255b":[2,0,0,1,3], "class_dem_1_1_dem_bones.html#aa9cf74a32230ec9c61096a58cdc555bf":[2,0,0,1,36], +"class_dem_1_1_dem_bones.html#aaaf326326d6094637dd0a995a778241f":[2,0,0,1,16], "class_dem_1_1_dem_bones.html#aae8731033731fbe34df518e15137724a":[2,0,0,1,47], "class_dem_1_1_dem_bones.html#aba10dbe999f33dfb5456c0f3554700a3":[2,0,0,1,51], -"class_dem_1_1_dem_bones.html#abeafdad7ecf17d7d6e9bd8685d5ee91b":[2,0,0,1,16], "class_dem_1_1_dem_bones.html#ac4698b8e39c770e51aea7122689edcdf":[2,0,0,1,17], "class_dem_1_1_dem_bones.html#ac4f7e7cb1b5cdfd737ddfc9e682de6f5":[2,0,0,1,28], "class_dem_1_1_dem_bones.html#ac6f69fb5e7a91330f21f48ad9f019212":[2,0,0,1,4], @@ -69,7 +70,6 @@ var NAVTREEINDEX0 = "class_dem_1_1_dem_bones.html#ac99a3d810ab4fc1286e9677ce5c322b0":[2,0,0,1,44], "class_dem_1_1_dem_bones.html#ad2a018d01cdb2a44f8ee964ddb4e8278":[2,0,0,1,1], "class_dem_1_1_dem_bones.html#ad6ded1630b2bac8d192e6134823a37f8":[2,0,0,1,39], -"class_dem_1_1_dem_bones.html#add033742fc48d3c367be2ea4d687343c":[2,0,0,1,20], "class_dem_1_1_dem_bones.html#adf3d4f2aa7408bb6a9db540e86fd69c7":[2,0,0,1,27], "class_dem_1_1_dem_bones.html#ae381fbe6610c9f4b169b16106dfbae94":[2,0,0,1,43], "class_dem_1_1_dem_bones.html#aeb37e92f6b19ed95f4d2793c5f3dd300":[2,0,0,1,10], @@ -83,16 +83,17 @@ var NAVTREEINDEX0 = "class_dem_1_1_dem_bones_ext.html":[2,0,0,2], "class_dem_1_1_dem_bones_ext.html#a033b6fd2dcf075cd48ed433f8a33cca1":[2,0,0,2,6], "class_dem_1_1_dem_bones_ext.html#a039349271cd9bd256ba359f0eab2ac7c":[2,0,0,2,3], -"class_dem_1_1_dem_bones_ext.html#a194d4d943c5b85f6474f25d188872bd6":[2,0,0,2,10], -"class_dem_1_1_dem_bones_ext.html#a30f4bfbe88493adecae038035e0b33be":[2,0,0,2,17], -"class_dem_1_1_dem_bones_ext.html#a3785152d056860bc55febcad64837ef3":[2,0,0,2,16], +"class_dem_1_1_dem_bones_ext.html#a30f4bfbe88493adecae038035e0b33be":[2,0,0,2,18], +"class_dem_1_1_dem_bones_ext.html#a3785152d056860bc55febcad64837ef3":[2,0,0,2,17], +"class_dem_1_1_dem_bones_ext.html#a4be2b221fa273518adbd3fa2e2bc86d0":[2,0,0,2,10], "class_dem_1_1_dem_bones_ext.html#a582382217aeefd8d2fb93bcb6aad9875":[2,0,0,2,8], "class_dem_1_1_dem_bones_ext.html#a7bc7c59a436c5a0d217adef008bb0eb3":[2,0,0,2,2], "class_dem_1_1_dem_bones_ext.html#a7da7e93c85500a1a23855d85c5db08c6":[2,0,0,2,1], "class_dem_1_1_dem_bones_ext.html#a85422fd18d48c40485f05d77b1c4cf4d":[2,0,0,2,11], "class_dem_1_1_dem_bones_ext.html#a92939c0de147f8075754d9cbf66113fc":[2,0,0,2,12], +"class_dem_1_1_dem_bones_ext.html#a9a6a2004f16832cd3f97c22789147a8a":[2,0,0,2,15], "class_dem_1_1_dem_bones_ext.html#a9fd6e95de36adee0d487786315da551f":[2,0,0,2,9], -"class_dem_1_1_dem_bones_ext.html#ad740868b3bc6cdf34e6e2ec5f35e24d7":[2,0,0,2,15], +"class_dem_1_1_dem_bones_ext.html#ad740868b3bc6cdf34e6e2ec5f35e24d7":[2,0,0,2,16], "class_dem_1_1_dem_bones_ext.html#ae4ea2e0183a87df169cb893c1a699709":[2,0,0,2,7], "class_dem_1_1_dem_bones_ext.html#aebbc9093e05f8d3a466fe40610f5289d":[2,0,0,2,14], "class_dem_1_1_dem_bones_ext.html#aedb230a6a7eede0d751355b385e58938":[2,0,0,2,4], @@ -122,8 +123,8 @@ var NAVTREEINDEX0 = "globals.html":[3,1,0], "globals_defs.html":[3,1,1], "hierarchy.html":[2,2], -"index.html":[], "index.html":[0], +"index.html":[], "namespace_dem.html":[1,0,0], "namespace_dem.html":[2,0,0], "namespacemembers.html":[1,1,0], diff --git a/docs/htmls/search/all_1.js b/docs/htmls/search/all_1.js index d56e9dc..3a6f6f2 100644 --- a/docs/htmls/search/all_1.js +++ b/docs/htmls/search/all_1.js @@ -3,18 +3,18 @@ var searchData= ['cbinitsplitbegin_4',['cbInitSplitBegin',['../class_dem_1_1_dem_bones.html#a14f83e468b4a1eb6e2c6c951e7b5a4d3',1,'Dem::DemBones']]], ['cbinitsplitend_5',['cbInitSplitEnd',['../class_dem_1_1_dem_bones.html#aeb37e92f6b19ed95f4d2793c5f3dd300',1,'Dem::DemBones']]], ['cbiterbegin_6',['cbIterBegin',['../class_dem_1_1_dem_bones.html#af43507c4ae91a4bf6550bc2afc25c023',1,'Dem::DemBones']]], - ['cbiterend_7',['cbIterEnd',['../class_dem_1_1_dem_bones.html#a14c76ee13ad4bd1892a5a00aee5b6d7b',1,'Dem::DemBones']]], + ['cbiterend_7',['cbIterEnd',['../class_dem_1_1_dem_bones.html#a978a27bd67c19d78bd36242a29876212',1,'Dem::DemBones']]], ['cbtranformationsbegin_8',['cbTranformationsBegin',['../class_dem_1_1_dem_bones.html#a5d5a50f2d4622a4823065cdca03ac9aa',1,'Dem::DemBones']]], ['cbtransformationsend_9',['cbTransformationsEnd',['../class_dem_1_1_dem_bones.html#a8008b672232b4d2f4081e00eea2ff062',1,'Dem::DemBones']]], ['cbtransformationsiterbegin_10',['cbTransformationsIterBegin',['../class_dem_1_1_dem_bones.html#a938532a49b8ae162b866f9b59a75a7ab',1,'Dem::DemBones']]], - ['cbtransformationsiterend_11',['cbTransformationsIterEnd',['../class_dem_1_1_dem_bones.html#abeafdad7ecf17d7d6e9bd8685d5ee91b',1,'Dem::DemBones']]], + ['cbtransformationsiterend_11',['cbTransformationsIterEnd',['../class_dem_1_1_dem_bones.html#aaaf326326d6094637dd0a995a778241f',1,'Dem::DemBones']]], ['cbweightsbegin_12',['cbWeightsBegin',['../class_dem_1_1_dem_bones.html#ac4698b8e39c770e51aea7122689edcdf',1,'Dem::DemBones']]], ['cbweightsend_13',['cbWeightsEnd',['../class_dem_1_1_dem_bones.html#a9dc51d56fe59c8c3e1e221b9819360f9',1,'Dem::DemBones']]], ['cbweightsiterbegin_14',['cbWeightsIterBegin',['../class_dem_1_1_dem_bones.html#a6391078901046e3acbd582dba6654fdd',1,'Dem::DemBones']]], - ['cbweightsiterend_15',['cbWeightsIterEnd',['../class_dem_1_1_dem_bones.html#add033742fc48d3c367be2ea4d687343c',1,'Dem::DemBones']]], + ['cbweightsiterend_15',['cbWeightsIterEnd',['../class_dem_1_1_dem_bones.html#a610c7725152df6465cd5f49311a3eeed',1,'Dem::DemBones']]], ['clear_16',['clear',['../class_dem_1_1_dem_bones.html#a18bcd81e4238a4a298c4ee4ca78ae2fb',1,'Dem::DemBones::clear()'],['../class_dem_1_1_dem_bones_ext.html#a9fd6e95de36adee0d487786315da551f',1,'Dem::DemBonesExt::clear()']]], ['compute_17',['compute',['../class_dem_1_1_dem_bones.html#ac8d2821c730539490ad6ce956a0b62a6',1,'Dem::DemBones']]], - ['computertb_18',['computeRTB',['../class_dem_1_1_dem_bones_ext.html#a194d4d943c5b85f6474f25d188872bd6',1,'Dem::DemBonesExt']]], + ['computertb_18',['computeRTB',['../class_dem_1_1_dem_bones_ext.html#a4be2b221fa273518adbd3fa2e2bc86d0',1,'Dem::DemBonesExt']]], ['computetranformations_19',['computeTranformations',['../class_dem_1_1_dem_bones.html#a673287121735ea64e0e4c244bacc432b',1,'Dem::DemBones']]], ['computeweights_20',['computeWeights',['../class_dem_1_1_dem_bones.html#a3101275f535d5c2435747b8ea5406f7d',1,'Dem::DemBones']]], ['convexls_21',['ConvexLS',['../class_dem_1_1_convex_l_s.html',1,'Dem::ConvexLS< _Scalar >'],['../class_dem_1_1_convex_l_s.html#a42f2e62346ddc90f930d0d473773fd06',1,'Dem::ConvexLS::ConvexLS()']]], diff --git a/docs/htmls/search/all_8.js b/docs/htmls/search/all_8.js index a653733..d3354ac 100644 --- a/docs/htmls/search/all_8.js +++ b/docs/htmls/search/all_8.js @@ -1,5 +1,6 @@ var searchData= [ ['overview_61',['Overview',['../index.html',1,'']]], - ['operator_28_29_62',['operator()',['../class_dem_1_1indexing__functor__row__col.html#ac6067acba820bc79ac95155ab6953997',1,'Dem::indexing_functor_row_col::operator()()'],['../class_dem_1_1indexing__functor__row.html#a34919c1d4949766981bd5470eac39041',1,'Dem::indexing_functor_row::operator()()'],['../class_dem_1_1indexing__functor__vector.html#a8d0cfd3b916ade83de9b797b4c9fde50',1,'Dem::indexing_functor_vector::operator()()']]] + ['operator_28_29_62',['operator()',['../class_dem_1_1indexing__functor__row__col.html#ac6067acba820bc79ac95155ab6953997',1,'Dem::indexing_functor_row_col::operator()()'],['../class_dem_1_1indexing__functor__row.html#a34919c1d4949766981bd5470eac39041',1,'Dem::indexing_functor_row::operator()()'],['../class_dem_1_1indexing__functor__vector.html#a8d0cfd3b916ade83de9b797b4c9fde50',1,'Dem::indexing_functor_vector::operator()()']]], + ['orient_63',['orient',['../class_dem_1_1_dem_bones_ext.html#a9a6a2004f16832cd3f97c22789147a8a',1,'Dem::DemBonesExt']]] ]; diff --git a/docs/htmls/search/all_9.js b/docs/htmls/search/all_9.js index 0a36063..a072f67 100644 --- a/docs/htmls/search/all_9.js +++ b/docs/htmls/search/all_9.js @@ -1,5 +1,5 @@ var searchData= [ - ['parent_63',['parent',['../class_dem_1_1_dem_bones_ext.html#ad740868b3bc6cdf34e6e2ec5f35e24d7',1,'Dem::DemBonesExt']]], - ['premulinv_64',['preMulInv',['../class_dem_1_1_dem_bones_ext.html#a3785152d056860bc55febcad64837ef3',1,'Dem::DemBonesExt']]] + ['parent_64',['parent',['../class_dem_1_1_dem_bones_ext.html#ad740868b3bc6cdf34e6e2ec5f35e24d7',1,'Dem::DemBonesExt']]], + ['premulinv_65',['preMulInv',['../class_dem_1_1_dem_bones_ext.html#a3785152d056860bc55febcad64837ef3',1,'Dem::DemBonesExt']]] ]; diff --git a/docs/htmls/search/all_a.js b/docs/htmls/search/all_a.js index 913003a..b2b2f9d 100644 --- a/docs/htmls/search/all_a.js +++ b/docs/htmls/search/all_a.js @@ -1,6 +1,6 @@ var searchData= [ - ['rmse_65',['rmse',['../class_dem_1_1_dem_bones.html#a050b398499f5daa9e42119b0774f25d0',1,'Dem::DemBones']]], - ['rotmat_66',['rotMat',['../_mat_blocks_8h.html#af8911e62d9ea5214390af1c948c7fd4d',1,'MatBlocks.h']]], - ['rotorder_67',['rotOrder',['../class_dem_1_1_dem_bones_ext.html#a30f4bfbe88493adecae038035e0b33be',1,'Dem::DemBonesExt']]] + ['rmse_66',['rmse',['../class_dem_1_1_dem_bones.html#a050b398499f5daa9e42119b0774f25d0',1,'Dem::DemBones']]], + ['rotmat_67',['rotMat',['../_mat_blocks_8h.html#af8911e62d9ea5214390af1c948c7fd4d',1,'MatBlocks.h']]], + ['rotorder_68',['rotOrder',['../class_dem_1_1_dem_bones_ext.html#a30f4bfbe88493adecae038035e0b33be',1,'Dem::DemBonesExt']]] ]; diff --git a/docs/htmls/search/all_b.js b/docs/htmls/search/all_b.js index fb1746f..ed83ea4 100644 --- a/docs/htmls/search/all_b.js +++ b/docs/htmls/search/all_b.js @@ -1,6 +1,6 @@ var searchData= [ - ['solve_68',['solve',['../class_dem_1_1_convex_l_s.html#a68f946876bc5259e699f0c311d18e266',1,'Dem::ConvexLS']]], - ['sparsematrix_69',['SparseMatrix',['../class_dem_1_1_dem_bones.html#aa8ea3a6b166652e954decbf135b3255b',1,'Dem::DemBones::SparseMatrix()'],['../class_dem_1_1_dem_bones_ext.html#a039349271cd9bd256ba359f0eab2ac7c',1,'Dem::DemBonesExt::SparseMatrix()']]], - ['subjectid_70',['subjectID',['../class_dem_1_1_dem_bones.html#ac99a3d810ab4fc1286e9677ce5c322b0',1,'Dem::DemBones']]] + ['solve_69',['solve',['../class_dem_1_1_convex_l_s.html#a68f946876bc5259e699f0c311d18e266',1,'Dem::ConvexLS']]], + ['sparsematrix_70',['SparseMatrix',['../class_dem_1_1_dem_bones.html#aa8ea3a6b166652e954decbf135b3255b',1,'Dem::DemBones::SparseMatrix()'],['../class_dem_1_1_dem_bones_ext.html#a039349271cd9bd256ba359f0eab2ac7c',1,'Dem::DemBonesExt::SparseMatrix()']]], + ['subjectid_71',['subjectID',['../class_dem_1_1_dem_bones.html#ac99a3d810ab4fc1286e9677ce5c322b0',1,'Dem::DemBones']]] ]; diff --git a/docs/htmls/search/all_c.js b/docs/htmls/search/all_c.js index 7e887f9..15b8875 100644 --- a/docs/htmls/search/all_c.js +++ b/docs/htmls/search/all_c.js @@ -1,7 +1,7 @@ var searchData= [ - ['transaffine_71',['transAffine',['../class_dem_1_1_dem_bones.html#a53f9859cd63a8c51f6f50fdfa7251681',1,'Dem::DemBones']]], - ['transaffinenorm_72',['transAffineNorm',['../class_dem_1_1_dem_bones.html#a3b125934b440ebcebb3ba44acda41366',1,'Dem::DemBones']]], - ['transvec_73',['transVec',['../_mat_blocks_8h.html#a59df0c210b2ea616135f313a28a5333d',1,'MatBlocks.h']]], - ['triplet_74',['Triplet',['../class_dem_1_1_dem_bones.html#ac6f69fb5e7a91330f21f48ad9f019212',1,'Dem::DemBones::Triplet()'],['../class_dem_1_1_dem_bones_ext.html#aedb230a6a7eede0d751355b385e58938',1,'Dem::DemBonesExt::Triplet()']]] + ['transaffine_72',['transAffine',['../class_dem_1_1_dem_bones.html#a53f9859cd63a8c51f6f50fdfa7251681',1,'Dem::DemBones']]], + ['transaffinenorm_73',['transAffineNorm',['../class_dem_1_1_dem_bones.html#a3b125934b440ebcebb3ba44acda41366',1,'Dem::DemBones']]], + ['transvec_74',['transVec',['../_mat_blocks_8h.html#a59df0c210b2ea616135f313a28a5333d',1,'MatBlocks.h']]], + ['triplet_75',['Triplet',['../class_dem_1_1_dem_bones.html#ac6f69fb5e7a91330f21f48ad9f019212',1,'Dem::DemBones::Triplet()'],['../class_dem_1_1_dem_bones_ext.html#aedb230a6a7eede0d751355b385e58938',1,'Dem::DemBonesExt::Triplet()']]] ]; diff --git a/docs/htmls/search/all_d.js b/docs/htmls/search/all_d.js index 5f8ba61..d9a0151 100644 --- a/docs/htmls/search/all_d.js +++ b/docs/htmls/search/all_d.js @@ -1,4 +1,4 @@ var searchData= [ - ['u_75',['u',['../class_dem_1_1_dem_bones.html#aae8731033731fbe34df518e15137724a',1,'Dem::DemBones']]] + ['u_76',['u',['../class_dem_1_1_dem_bones.html#aae8731033731fbe34df518e15137724a',1,'Dem::DemBones']]] ]; diff --git a/docs/htmls/search/all_e.js b/docs/htmls/search/all_e.js index c8abe5f..0e584fd 100644 --- a/docs/htmls/search/all_e.js +++ b/docs/htmls/search/all_e.js @@ -1,9 +1,9 @@ var searchData= [ - ['v_76',['v',['../class_dem_1_1_dem_bones.html#a276046cc5a2a13802762d65c17ec67fb',1,'Dem::DemBones']]], - ['vec3_77',['vec3',['../_mat_blocks_8h.html#a25ecc71b082683565b54b7f2b8cd913c',1,'MatBlocks.h']]], - ['vector3_78',['Vector3',['../class_dem_1_1_dem_bones.html#a9404399e2528175da18fd80d7d4fc4f9',1,'Dem::DemBones::Vector3()'],['../class_dem_1_1_dem_bones_ext.html#af058734937a4b845b089291d4392f8ef',1,'Dem::DemBonesExt::Vector3()']]], - ['vector4_79',['Vector4',['../class_dem_1_1_dem_bones.html#a0c30c98fb363f888345d86e5a11acd14',1,'Dem::DemBones::Vector4()'],['../class_dem_1_1_dem_bones_ext.html#a033b6fd2dcf075cd48ed433f8a33cca1',1,'Dem::DemBonesExt::Vector4()']]], - ['vectortype_80',['VectorType',['../class_dem_1_1indexing__functor__vector.html#ae6acac4685ed51524c1c9db29d8f3d89',1,'Dem::indexing_functor_vector']]], - ['vectorx_81',['VectorX',['../class_dem_1_1_convex_l_s.html#a066dff3827a4d933cfed98276e8d41d0',1,'Dem::ConvexLS::VectorX()'],['../class_dem_1_1_dem_bones.html#aee5cdd95063d2b11d8a461f0e2efa9f9',1,'Dem::DemBones::VectorX()'],['../class_dem_1_1_dem_bones_ext.html#ae4ea2e0183a87df169cb893c1a699709',1,'Dem::DemBonesExt::VectorX()']]] + ['v_77',['v',['../class_dem_1_1_dem_bones.html#a276046cc5a2a13802762d65c17ec67fb',1,'Dem::DemBones']]], + ['vec3_78',['vec3',['../_mat_blocks_8h.html#a25ecc71b082683565b54b7f2b8cd913c',1,'MatBlocks.h']]], + ['vector3_79',['Vector3',['../class_dem_1_1_dem_bones.html#a9404399e2528175da18fd80d7d4fc4f9',1,'Dem::DemBones::Vector3()'],['../class_dem_1_1_dem_bones_ext.html#af058734937a4b845b089291d4392f8ef',1,'Dem::DemBonesExt::Vector3()']]], + ['vector4_80',['Vector4',['../class_dem_1_1_dem_bones.html#a0c30c98fb363f888345d86e5a11acd14',1,'Dem::DemBones::Vector4()'],['../class_dem_1_1_dem_bones_ext.html#a033b6fd2dcf075cd48ed433f8a33cca1',1,'Dem::DemBonesExt::Vector4()']]], + ['vectortype_81',['VectorType',['../class_dem_1_1indexing__functor__vector.html#ae6acac4685ed51524c1c9db29d8f3d89',1,'Dem::indexing_functor_vector']]], + ['vectorx_82',['VectorX',['../class_dem_1_1_convex_l_s.html#a066dff3827a4d933cfed98276e8d41d0',1,'Dem::ConvexLS::VectorX()'],['../class_dem_1_1_dem_bones.html#aee5cdd95063d2b11d8a461f0e2efa9f9',1,'Dem::DemBones::VectorX()'],['../class_dem_1_1_dem_bones_ext.html#ae4ea2e0183a87df169cb893c1a699709',1,'Dem::DemBonesExt::VectorX()']]] ]; diff --git a/docs/htmls/search/all_f.js b/docs/htmls/search/all_f.js index f9f1858..dabfca8 100644 --- a/docs/htmls/search/all_f.js +++ b/docs/htmls/search/all_f.js @@ -1,7 +1,7 @@ var searchData= [ - ['w_82',['w',['../class_dem_1_1_dem_bones.html#a8fa642adc3a5610f0a391fa5f437a9b3',1,'Dem::DemBones']]], - ['weighteps_83',['weightEps',['../class_dem_1_1_dem_bones.html#afab4c23ab2a15d11225934c9e4252881',1,'Dem::DemBones']]], - ['weightssmooth_84',['weightsSmooth',['../class_dem_1_1_dem_bones.html#aba10dbe999f33dfb5456c0f3554700a3',1,'Dem::DemBones']]], - ['weightssmoothstep_85',['weightsSmoothStep',['../class_dem_1_1_dem_bones.html#a26babdede07e8e220002e420b9161aa9',1,'Dem::DemBones']]] + ['w_83',['w',['../class_dem_1_1_dem_bones.html#a8fa642adc3a5610f0a391fa5f437a9b3',1,'Dem::DemBones']]], + ['weighteps_84',['weightEps',['../class_dem_1_1_dem_bones.html#afab4c23ab2a15d11225934c9e4252881',1,'Dem::DemBones']]], + ['weightssmooth_85',['weightsSmooth',['../class_dem_1_1_dem_bones.html#aba10dbe999f33dfb5456c0f3554700a3',1,'Dem::DemBones']]], + ['weightssmoothstep_86',['weightsSmoothStep',['../class_dem_1_1_dem_bones.html#a26babdede07e8e220002e420b9161aa9',1,'Dem::DemBones']]] ]; diff --git a/docs/htmls/search/classes_0.js b/docs/htmls/search/classes_0.js index 19ea71e..2d83c87 100644 --- a/docs/htmls/search/classes_0.js +++ b/docs/htmls/search/classes_0.js @@ -1,4 +1,4 @@ var searchData= [ - ['convexls_86',['ConvexLS',['../class_dem_1_1_convex_l_s.html',1,'Dem']]] + ['convexls_87',['ConvexLS',['../class_dem_1_1_convex_l_s.html',1,'Dem']]] ]; diff --git a/docs/htmls/search/classes_1.js b/docs/htmls/search/classes_1.js index d6e1f14..e385588 100644 --- a/docs/htmls/search/classes_1.js +++ b/docs/htmls/search/classes_1.js @@ -1,5 +1,5 @@ var searchData= [ - ['dembones_87',['DemBones',['../class_dem_1_1_dem_bones.html',1,'Dem']]], - ['dembonesext_88',['DemBonesExt',['../class_dem_1_1_dem_bones_ext.html',1,'Dem']]] + ['dembones_88',['DemBones',['../class_dem_1_1_dem_bones.html',1,'Dem']]], + ['dembonesext_89',['DemBonesExt',['../class_dem_1_1_dem_bones_ext.html',1,'Dem']]] ]; diff --git a/docs/htmls/search/classes_2.js b/docs/htmls/search/classes_2.js index 16b6ec5..64f5f3f 100644 --- a/docs/htmls/search/classes_2.js +++ b/docs/htmls/search/classes_2.js @@ -1,6 +1,6 @@ var searchData= [ - ['indexing_5ffunctor_5frow_89',['indexing_functor_row',['../class_dem_1_1indexing__functor__row.html',1,'Dem']]], - ['indexing_5ffunctor_5frow_5fcol_90',['indexing_functor_row_col',['../class_dem_1_1indexing__functor__row__col.html',1,'Dem']]], - ['indexing_5ffunctor_5fvector_91',['indexing_functor_vector',['../class_dem_1_1indexing__functor__vector.html',1,'Dem']]] + ['indexing_5ffunctor_5frow_90',['indexing_functor_row',['../class_dem_1_1indexing__functor__row.html',1,'Dem']]], + ['indexing_5ffunctor_5frow_5fcol_91',['indexing_functor_row_col',['../class_dem_1_1indexing__functor__row__col.html',1,'Dem']]], + ['indexing_5ffunctor_5fvector_92',['indexing_functor_vector',['../class_dem_1_1indexing__functor__vector.html',1,'Dem']]] ]; diff --git a/docs/htmls/search/defines_0.js b/docs/htmls/search/defines_0.js index fd92c96..be199bc 100644 --- a/docs/htmls/search/defines_0.js +++ b/docs/htmls/search/defines_0.js @@ -1,4 +1,4 @@ var searchData= [ - ['blk4_171',['blk4',['../_mat_blocks_8h.html#ad6bfbb18a677b025229474998396c667',1,'MatBlocks.h']]] + ['blk4_173',['blk4',['../_mat_blocks_8h.html#ad6bfbb18a677b025229474998396c667',1,'MatBlocks.h']]] ]; diff --git a/docs/htmls/search/defines_1.js b/docs/htmls/search/defines_1.js index f906755..623801e 100644 --- a/docs/htmls/search/defines_1.js +++ b/docs/htmls/search/defines_1.js @@ -1,5 +1,5 @@ var searchData= [ - ['dem_5fbones_5fdem_5fbones_5fext_5fmat_5fblocks_5fundefined_172',['DEM_BONES_DEM_BONES_EXT_MAT_BLOCKS_UNDEFINED',['../_dem_bones_ext_8h.html#a17555af6ed4631ab94d00c90fefb8532',1,'DemBonesExt.h']]], - ['dem_5fbones_5fdem_5fbones_5fmat_5fblocks_5fundefined_173',['DEM_BONES_DEM_BONES_MAT_BLOCKS_UNDEFINED',['../_dem_bones_8h.html#aaa0daf4013ddd01ce5d2d28e8aaad6f5',1,'DemBones.h']]] + ['dem_5fbones_5fdem_5fbones_5fext_5fmat_5fblocks_5fundefined_174',['DEM_BONES_DEM_BONES_EXT_MAT_BLOCKS_UNDEFINED',['../_dem_bones_ext_8h.html#a17555af6ed4631ab94d00c90fefb8532',1,'DemBonesExt.h']]], + ['dem_5fbones_5fdem_5fbones_5fmat_5fblocks_5fundefined_175',['DEM_BONES_DEM_BONES_MAT_BLOCKS_UNDEFINED',['../_dem_bones_8h.html#aaa0daf4013ddd01ce5d2d28e8aaad6f5',1,'DemBones.h']]] ]; diff --git a/docs/htmls/search/defines_2.js b/docs/htmls/search/defines_2.js index 7c3171f..817c7db 100644 --- a/docs/htmls/search/defines_2.js +++ b/docs/htmls/search/defines_2.js @@ -1,4 +1,4 @@ var searchData= [ - ['rotmat_174',['rotMat',['../_mat_blocks_8h.html#af8911e62d9ea5214390af1c948c7fd4d',1,'MatBlocks.h']]] + ['rotmat_176',['rotMat',['../_mat_blocks_8h.html#af8911e62d9ea5214390af1c948c7fd4d',1,'MatBlocks.h']]] ]; diff --git a/docs/htmls/search/defines_3.js b/docs/htmls/search/defines_3.js index 9d7b081..40d05f7 100644 --- a/docs/htmls/search/defines_3.js +++ b/docs/htmls/search/defines_3.js @@ -1,4 +1,4 @@ var searchData= [ - ['transvec_175',['transVec',['../_mat_blocks_8h.html#a59df0c210b2ea616135f313a28a5333d',1,'MatBlocks.h']]] + ['transvec_177',['transVec',['../_mat_blocks_8h.html#a59df0c210b2ea616135f313a28a5333d',1,'MatBlocks.h']]] ]; diff --git a/docs/htmls/search/defines_4.js b/docs/htmls/search/defines_4.js index 4dd7e0c..de2f0f2 100644 --- a/docs/htmls/search/defines_4.js +++ b/docs/htmls/search/defines_4.js @@ -1,4 +1,4 @@ var searchData= [ - ['vec3_176',['vec3',['../_mat_blocks_8h.html#a25ecc71b082683565b54b7f2b8cd913c',1,'MatBlocks.h']]] + ['vec3_178',['vec3',['../_mat_blocks_8h.html#a25ecc71b082683565b54b7f2b8cd913c',1,'MatBlocks.h']]] ]; diff --git a/docs/htmls/search/files_0.js b/docs/htmls/search/files_0.js index 7ac9889..7781f37 100644 --- a/docs/htmls/search/files_0.js +++ b/docs/htmls/search/files_0.js @@ -1,4 +1,4 @@ var searchData= [ - ['convexls_2eh_93',['ConvexLS.h',['../_convex_l_s_8h.html',1,'']]] + ['convexls_2eh_94',['ConvexLS.h',['../_convex_l_s_8h.html',1,'']]] ]; diff --git a/docs/htmls/search/files_1.js b/docs/htmls/search/files_1.js index 77093e5..7c56d51 100644 --- a/docs/htmls/search/files_1.js +++ b/docs/htmls/search/files_1.js @@ -1,5 +1,5 @@ var searchData= [ - ['dembones_2eh_94',['DemBones.h',['../_dem_bones_8h.html',1,'']]], - ['dembonesext_2eh_95',['DemBonesExt.h',['../_dem_bones_ext_8h.html',1,'']]] + ['dembones_2eh_95',['DemBones.h',['../_dem_bones_8h.html',1,'']]], + ['dembonesext_2eh_96',['DemBonesExt.h',['../_dem_bones_ext_8h.html',1,'']]] ]; diff --git a/docs/htmls/search/files_2.js b/docs/htmls/search/files_2.js index 7a5aeb9..9a04214 100644 --- a/docs/htmls/search/files_2.js +++ b/docs/htmls/search/files_2.js @@ -1,4 +1,4 @@ var searchData= [ - ['indexing_2eh_96',['Indexing.h',['../_indexing_8h.html',1,'']]] + ['indexing_2eh_97',['Indexing.h',['../_indexing_8h.html',1,'']]] ]; diff --git a/docs/htmls/search/files_3.js b/docs/htmls/search/files_3.js index 4e18559..b6c3541 100644 --- a/docs/htmls/search/files_3.js +++ b/docs/htmls/search/files_3.js @@ -1,4 +1,4 @@ var searchData= [ - ['matblocks_2eh_97',['MatBlocks.h',['../_mat_blocks_8h.html',1,'']]] + ['matblocks_2eh_98',['MatBlocks.h',['../_mat_blocks_8h.html',1,'']]] ]; diff --git a/docs/htmls/search/functions_0.js b/docs/htmls/search/functions_0.js index 4f08900..ced8eef 100644 --- a/docs/htmls/search/functions_0.js +++ b/docs/htmls/search/functions_0.js @@ -1,21 +1,21 @@ var searchData= [ - ['cbinitsplitbegin_98',['cbInitSplitBegin',['../class_dem_1_1_dem_bones.html#a14f83e468b4a1eb6e2c6c951e7b5a4d3',1,'Dem::DemBones']]], - ['cbinitsplitend_99',['cbInitSplitEnd',['../class_dem_1_1_dem_bones.html#aeb37e92f6b19ed95f4d2793c5f3dd300',1,'Dem::DemBones']]], - ['cbiterbegin_100',['cbIterBegin',['../class_dem_1_1_dem_bones.html#af43507c4ae91a4bf6550bc2afc25c023',1,'Dem::DemBones']]], - ['cbiterend_101',['cbIterEnd',['../class_dem_1_1_dem_bones.html#a14c76ee13ad4bd1892a5a00aee5b6d7b',1,'Dem::DemBones']]], - ['cbtranformationsbegin_102',['cbTranformationsBegin',['../class_dem_1_1_dem_bones.html#a5d5a50f2d4622a4823065cdca03ac9aa',1,'Dem::DemBones']]], - ['cbtransformationsend_103',['cbTransformationsEnd',['../class_dem_1_1_dem_bones.html#a8008b672232b4d2f4081e00eea2ff062',1,'Dem::DemBones']]], - ['cbtransformationsiterbegin_104',['cbTransformationsIterBegin',['../class_dem_1_1_dem_bones.html#a938532a49b8ae162b866f9b59a75a7ab',1,'Dem::DemBones']]], - ['cbtransformationsiterend_105',['cbTransformationsIterEnd',['../class_dem_1_1_dem_bones.html#abeafdad7ecf17d7d6e9bd8685d5ee91b',1,'Dem::DemBones']]], - ['cbweightsbegin_106',['cbWeightsBegin',['../class_dem_1_1_dem_bones.html#ac4698b8e39c770e51aea7122689edcdf',1,'Dem::DemBones']]], - ['cbweightsend_107',['cbWeightsEnd',['../class_dem_1_1_dem_bones.html#a9dc51d56fe59c8c3e1e221b9819360f9',1,'Dem::DemBones']]], - ['cbweightsiterbegin_108',['cbWeightsIterBegin',['../class_dem_1_1_dem_bones.html#a6391078901046e3acbd582dba6654fdd',1,'Dem::DemBones']]], - ['cbweightsiterend_109',['cbWeightsIterEnd',['../class_dem_1_1_dem_bones.html#add033742fc48d3c367be2ea4d687343c',1,'Dem::DemBones']]], - ['clear_110',['clear',['../class_dem_1_1_dem_bones.html#a18bcd81e4238a4a298c4ee4ca78ae2fb',1,'Dem::DemBones::clear()'],['../class_dem_1_1_dem_bones_ext.html#a9fd6e95de36adee0d487786315da551f',1,'Dem::DemBonesExt::clear()']]], - ['compute_111',['compute',['../class_dem_1_1_dem_bones.html#ac8d2821c730539490ad6ce956a0b62a6',1,'Dem::DemBones']]], - ['computertb_112',['computeRTB',['../class_dem_1_1_dem_bones_ext.html#a194d4d943c5b85f6474f25d188872bd6',1,'Dem::DemBonesExt']]], - ['computetranformations_113',['computeTranformations',['../class_dem_1_1_dem_bones.html#a673287121735ea64e0e4c244bacc432b',1,'Dem::DemBones']]], - ['computeweights_114',['computeWeights',['../class_dem_1_1_dem_bones.html#a3101275f535d5c2435747b8ea5406f7d',1,'Dem::DemBones']]], - ['convexls_115',['ConvexLS',['../class_dem_1_1_convex_l_s.html#a42f2e62346ddc90f930d0d473773fd06',1,'Dem::ConvexLS']]] + ['cbinitsplitbegin_99',['cbInitSplitBegin',['../class_dem_1_1_dem_bones.html#a14f83e468b4a1eb6e2c6c951e7b5a4d3',1,'Dem::DemBones']]], + ['cbinitsplitend_100',['cbInitSplitEnd',['../class_dem_1_1_dem_bones.html#aeb37e92f6b19ed95f4d2793c5f3dd300',1,'Dem::DemBones']]], + ['cbiterbegin_101',['cbIterBegin',['../class_dem_1_1_dem_bones.html#af43507c4ae91a4bf6550bc2afc25c023',1,'Dem::DemBones']]], + ['cbiterend_102',['cbIterEnd',['../class_dem_1_1_dem_bones.html#a978a27bd67c19d78bd36242a29876212',1,'Dem::DemBones']]], + ['cbtranformationsbegin_103',['cbTranformationsBegin',['../class_dem_1_1_dem_bones.html#a5d5a50f2d4622a4823065cdca03ac9aa',1,'Dem::DemBones']]], + ['cbtransformationsend_104',['cbTransformationsEnd',['../class_dem_1_1_dem_bones.html#a8008b672232b4d2f4081e00eea2ff062',1,'Dem::DemBones']]], + ['cbtransformationsiterbegin_105',['cbTransformationsIterBegin',['../class_dem_1_1_dem_bones.html#a938532a49b8ae162b866f9b59a75a7ab',1,'Dem::DemBones']]], + ['cbtransformationsiterend_106',['cbTransformationsIterEnd',['../class_dem_1_1_dem_bones.html#aaaf326326d6094637dd0a995a778241f',1,'Dem::DemBones']]], + ['cbweightsbegin_107',['cbWeightsBegin',['../class_dem_1_1_dem_bones.html#ac4698b8e39c770e51aea7122689edcdf',1,'Dem::DemBones']]], + ['cbweightsend_108',['cbWeightsEnd',['../class_dem_1_1_dem_bones.html#a9dc51d56fe59c8c3e1e221b9819360f9',1,'Dem::DemBones']]], + ['cbweightsiterbegin_109',['cbWeightsIterBegin',['../class_dem_1_1_dem_bones.html#a6391078901046e3acbd582dba6654fdd',1,'Dem::DemBones']]], + ['cbweightsiterend_110',['cbWeightsIterEnd',['../class_dem_1_1_dem_bones.html#a610c7725152df6465cd5f49311a3eeed',1,'Dem::DemBones']]], + ['clear_111',['clear',['../class_dem_1_1_dem_bones.html#a18bcd81e4238a4a298c4ee4ca78ae2fb',1,'Dem::DemBones::clear()'],['../class_dem_1_1_dem_bones_ext.html#a9fd6e95de36adee0d487786315da551f',1,'Dem::DemBonesExt::clear()']]], + ['compute_112',['compute',['../class_dem_1_1_dem_bones.html#ac8d2821c730539490ad6ce956a0b62a6',1,'Dem::DemBones']]], + ['computertb_113',['computeRTB',['../class_dem_1_1_dem_bones_ext.html#a4be2b221fa273518adbd3fa2e2bc86d0',1,'Dem::DemBonesExt']]], + ['computetranformations_114',['computeTranformations',['../class_dem_1_1_dem_bones.html#a673287121735ea64e0e4c244bacc432b',1,'Dem::DemBones']]], + ['computeweights_115',['computeWeights',['../class_dem_1_1_dem_bones.html#a3101275f535d5c2435747b8ea5406f7d',1,'Dem::DemBones']]], + ['convexls_116',['ConvexLS',['../class_dem_1_1_convex_l_s.html#a42f2e62346ddc90f930d0d473773fd06',1,'Dem::ConvexLS']]] ]; diff --git a/docs/htmls/search/functions_1.js b/docs/htmls/search/functions_1.js index bf70cf2..7310f19 100644 --- a/docs/htmls/search/functions_1.js +++ b/docs/htmls/search/functions_1.js @@ -1,5 +1,5 @@ var searchData= [ - ['dembones_116',['DemBones',['../class_dem_1_1_dem_bones.html#aa5bb61bfa1a60d355f4cce7f9cc60d5c',1,'Dem::DemBones']]], - ['dembonesext_117',['DemBonesExt',['../class_dem_1_1_dem_bones_ext.html#a582382217aeefd8d2fb93bcb6aad9875',1,'Dem::DemBonesExt']]] + ['dembones_117',['DemBones',['../class_dem_1_1_dem_bones.html#aa5bb61bfa1a60d355f4cce7f9cc60d5c',1,'Dem::DemBones']]], + ['dembonesext_118',['DemBonesExt',['../class_dem_1_1_dem_bones_ext.html#a582382217aeefd8d2fb93bcb6aad9875',1,'Dem::DemBonesExt']]] ]; diff --git a/docs/htmls/search/functions_2.js b/docs/htmls/search/functions_2.js index a95652e..0f53bb3 100644 --- a/docs/htmls/search/functions_2.js +++ b/docs/htmls/search/functions_2.js @@ -1,10 +1,10 @@ var searchData= [ - ['indexing_5ffunctor_5frow_118',['indexing_functor_row',['../class_dem_1_1indexing__functor__row.html#a469b785a20a628da4c30b8f224dd3bee',1,'Dem::indexing_functor_row']]], - ['indexing_5ffunctor_5frow_5fcol_119',['indexing_functor_row_col',['../class_dem_1_1indexing__functor__row__col.html#a8a7c618f00b1188ffae30d8bf093791f',1,'Dem::indexing_functor_row_col']]], - ['indexing_5ffunctor_5fvector_120',['indexing_functor_vector',['../class_dem_1_1indexing__functor__vector.html#a862b95972590645843c42d7672bcddf7',1,'Dem::indexing_functor_vector']]], - ['indexing_5frow_121',['indexing_row',['../namespace_dem.html#ae66a43a80ec99faa99e8ab163cb5beae',1,'Dem']]], - ['indexing_5frow_5fcol_122',['indexing_row_col',['../namespace_dem.html#a86c6e47fcd8031262219c42b65cf84ed',1,'Dem']]], - ['indexing_5fvector_123',['indexing_vector',['../namespace_dem.html#a5f2dfa58c8c80cb8b494cbdf8d82f105',1,'Dem']]], - ['init_124',['init',['../class_dem_1_1_convex_l_s.html#ac601e6ddfcad0b277ad805449b3510f3',1,'Dem::ConvexLS::init()'],['../class_dem_1_1_dem_bones.html#af1fcf96f35f6c4662fd95998225b9bda',1,'Dem::DemBones::init()']]] + ['indexing_5ffunctor_5frow_119',['indexing_functor_row',['../class_dem_1_1indexing__functor__row.html#a469b785a20a628da4c30b8f224dd3bee',1,'Dem::indexing_functor_row']]], + ['indexing_5ffunctor_5frow_5fcol_120',['indexing_functor_row_col',['../class_dem_1_1indexing__functor__row__col.html#a8a7c618f00b1188ffae30d8bf093791f',1,'Dem::indexing_functor_row_col']]], + ['indexing_5ffunctor_5fvector_121',['indexing_functor_vector',['../class_dem_1_1indexing__functor__vector.html#a862b95972590645843c42d7672bcddf7',1,'Dem::indexing_functor_vector']]], + ['indexing_5frow_122',['indexing_row',['../namespace_dem.html#ae66a43a80ec99faa99e8ab163cb5beae',1,'Dem']]], + ['indexing_5frow_5fcol_123',['indexing_row_col',['../namespace_dem.html#a86c6e47fcd8031262219c42b65cf84ed',1,'Dem']]], + ['indexing_5fvector_124',['indexing_vector',['../namespace_dem.html#a5f2dfa58c8c80cb8b494cbdf8d82f105',1,'Dem']]], + ['init_125',['init',['../class_dem_1_1_convex_l_s.html#ac601e6ddfcad0b277ad805449b3510f3',1,'Dem::ConvexLS::init()'],['../class_dem_1_1_dem_bones.html#af1fcf96f35f6c4662fd95998225b9bda',1,'Dem::DemBones::init()']]] ]; diff --git a/docs/htmls/search/functions_3.js b/docs/htmls/search/functions_3.js index dc9b2b2..0b9ff1f 100644 --- a/docs/htmls/search/functions_3.js +++ b/docs/htmls/search/functions_3.js @@ -1,4 +1,4 @@ var searchData= [ - ['operator_28_29_125',['operator()',['../class_dem_1_1indexing__functor__row__col.html#ac6067acba820bc79ac95155ab6953997',1,'Dem::indexing_functor_row_col::operator()()'],['../class_dem_1_1indexing__functor__row.html#a34919c1d4949766981bd5470eac39041',1,'Dem::indexing_functor_row::operator()()'],['../class_dem_1_1indexing__functor__vector.html#a8d0cfd3b916ade83de9b797b4c9fde50',1,'Dem::indexing_functor_vector::operator()()']]] + ['operator_28_29_126',['operator()',['../class_dem_1_1indexing__functor__row__col.html#ac6067acba820bc79ac95155ab6953997',1,'Dem::indexing_functor_row_col::operator()()'],['../class_dem_1_1indexing__functor__row.html#a34919c1d4949766981bd5470eac39041',1,'Dem::indexing_functor_row::operator()()'],['../class_dem_1_1indexing__functor__vector.html#a8d0cfd3b916ade83de9b797b4c9fde50',1,'Dem::indexing_functor_vector::operator()()']]] ]; diff --git a/docs/htmls/search/functions_4.js b/docs/htmls/search/functions_4.js index 8744c0e..9825af4 100644 --- a/docs/htmls/search/functions_4.js +++ b/docs/htmls/search/functions_4.js @@ -1,4 +1,4 @@ var searchData= [ - ['rmse_126',['rmse',['../class_dem_1_1_dem_bones.html#a050b398499f5daa9e42119b0774f25d0',1,'Dem::DemBones']]] + ['rmse_127',['rmse',['../class_dem_1_1_dem_bones.html#a050b398499f5daa9e42119b0774f25d0',1,'Dem::DemBones']]] ]; diff --git a/docs/htmls/search/functions_5.js b/docs/htmls/search/functions_5.js index cd0746f..775e845 100644 --- a/docs/htmls/search/functions_5.js +++ b/docs/htmls/search/functions_5.js @@ -1,4 +1,4 @@ var searchData= [ - ['solve_127',['solve',['../class_dem_1_1_convex_l_s.html#a68f946876bc5259e699f0c311d18e266',1,'Dem::ConvexLS']]] + ['solve_128',['solve',['../class_dem_1_1_convex_l_s.html#a68f946876bc5259e699f0c311d18e266',1,'Dem::ConvexLS']]] ]; diff --git a/docs/htmls/search/namespaces_0.js b/docs/htmls/search/namespaces_0.js index 871bfd9..c189d34 100644 --- a/docs/htmls/search/namespaces_0.js +++ b/docs/htmls/search/namespaces_0.js @@ -1,4 +1,4 @@ var searchData= [ - ['dem_92',['Dem',['../namespace_dem.html',1,'']]] + ['dem_93',['Dem',['../namespace_dem.html',1,'']]] ]; diff --git a/docs/htmls/search/pages_0.js b/docs/htmls/search/pages_0.js index b4f6212..f8c2f27 100644 --- a/docs/htmls/search/pages_0.js +++ b/docs/htmls/search/pages_0.js @@ -1,4 +1,4 @@ var searchData= [ - ['overview_177',['Overview',['../index.html',1,'']]] + ['overview_179',['Overview',['../index.html',1,'']]] ]; diff --git a/docs/htmls/search/searchdata.js b/docs/htmls/search/searchdata.js index f622581..a552999 100644 --- a/docs/htmls/search/searchdata.js +++ b/docs/htmls/search/searchdata.js @@ -5,7 +5,7 @@ var indexSectionsWithContent = 2: "d", 3: "cdim", 4: "cdiors", - 5: "bfilmnprstuvw", + 5: "bfilmnoprstuvw", 6: "mstv", 7: "bdrtv", 8: "o" diff --git a/docs/htmls/search/typedefs_0.js b/docs/htmls/search/typedefs_0.js index 2f59e02..2b57755 100644 --- a/docs/htmls/search/typedefs_0.js +++ b/docs/htmls/search/typedefs_0.js @@ -1,7 +1,7 @@ var searchData= [ - ['matrix3_161',['Matrix3',['../class_dem_1_1_dem_bones.html#aed480cb1bda1b33f20171f7f847c1b06',1,'Dem::DemBones::Matrix3()'],['../class_dem_1_1_dem_bones_ext.html#af372c94208c01a28f9a57b6377223470',1,'Dem::DemBonesExt::Matrix3()']]], - ['matrix4_162',['Matrix4',['../class_dem_1_1_dem_bones.html#ad2a018d01cdb2a44f8ee964ddb4e8278',1,'Dem::DemBones::Matrix4()'],['../class_dem_1_1_dem_bones_ext.html#a7da7e93c85500a1a23855d85c5db08c6',1,'Dem::DemBonesExt::Matrix4()']]], - ['matrixtype_163',['MatrixType',['../class_dem_1_1indexing__functor__row__col.html#a3b60c9d162a386342f729652fad60710',1,'Dem::indexing_functor_row_col::MatrixType()'],['../class_dem_1_1indexing__functor__row.html#a51654362946e68e4ffc8728d0e49dda0',1,'Dem::indexing_functor_row::MatrixType()']]], - ['matrixx_164',['MatrixX',['../class_dem_1_1_convex_l_s.html#ae6da3230d1826b15b369e6879cbb7191',1,'Dem::ConvexLS::MatrixX()'],['../class_dem_1_1_dem_bones.html#a5e4b99c4a233b477116204f9f1fae9cd',1,'Dem::DemBones::MatrixX()'],['../class_dem_1_1_dem_bones_ext.html#a7bc7c59a436c5a0d217adef008bb0eb3',1,'Dem::DemBonesExt::MatrixX()']]] + ['matrix3_163',['Matrix3',['../class_dem_1_1_dem_bones.html#aed480cb1bda1b33f20171f7f847c1b06',1,'Dem::DemBones::Matrix3()'],['../class_dem_1_1_dem_bones_ext.html#af372c94208c01a28f9a57b6377223470',1,'Dem::DemBonesExt::Matrix3()']]], + ['matrix4_164',['Matrix4',['../class_dem_1_1_dem_bones.html#ad2a018d01cdb2a44f8ee964ddb4e8278',1,'Dem::DemBones::Matrix4()'],['../class_dem_1_1_dem_bones_ext.html#a7da7e93c85500a1a23855d85c5db08c6',1,'Dem::DemBonesExt::Matrix4()']]], + ['matrixtype_165',['MatrixType',['../class_dem_1_1indexing__functor__row__col.html#a3b60c9d162a386342f729652fad60710',1,'Dem::indexing_functor_row_col::MatrixType()'],['../class_dem_1_1indexing__functor__row.html#a51654362946e68e4ffc8728d0e49dda0',1,'Dem::indexing_functor_row::MatrixType()']]], + ['matrixx_166',['MatrixX',['../class_dem_1_1_convex_l_s.html#ae6da3230d1826b15b369e6879cbb7191',1,'Dem::ConvexLS::MatrixX()'],['../class_dem_1_1_dem_bones.html#a5e4b99c4a233b477116204f9f1fae9cd',1,'Dem::DemBones::MatrixX()'],['../class_dem_1_1_dem_bones_ext.html#a7bc7c59a436c5a0d217adef008bb0eb3',1,'Dem::DemBonesExt::MatrixX()']]] ]; diff --git a/docs/htmls/search/typedefs_1.js b/docs/htmls/search/typedefs_1.js index c551c39..aaaa17e 100644 --- a/docs/htmls/search/typedefs_1.js +++ b/docs/htmls/search/typedefs_1.js @@ -1,4 +1,4 @@ var searchData= [ - ['sparsematrix_165',['SparseMatrix',['../class_dem_1_1_dem_bones.html#aa8ea3a6b166652e954decbf135b3255b',1,'Dem::DemBones::SparseMatrix()'],['../class_dem_1_1_dem_bones_ext.html#a039349271cd9bd256ba359f0eab2ac7c',1,'Dem::DemBonesExt::SparseMatrix()']]] + ['sparsematrix_167',['SparseMatrix',['../class_dem_1_1_dem_bones.html#aa8ea3a6b166652e954decbf135b3255b',1,'Dem::DemBones::SparseMatrix()'],['../class_dem_1_1_dem_bones_ext.html#a039349271cd9bd256ba359f0eab2ac7c',1,'Dem::DemBonesExt::SparseMatrix()']]] ]; diff --git a/docs/htmls/search/typedefs_2.js b/docs/htmls/search/typedefs_2.js index 8b61707..880dec9 100644 --- a/docs/htmls/search/typedefs_2.js +++ b/docs/htmls/search/typedefs_2.js @@ -1,4 +1,4 @@ var searchData= [ - ['triplet_166',['Triplet',['../class_dem_1_1_dem_bones.html#ac6f69fb5e7a91330f21f48ad9f019212',1,'Dem::DemBones::Triplet()'],['../class_dem_1_1_dem_bones_ext.html#aedb230a6a7eede0d751355b385e58938',1,'Dem::DemBonesExt::Triplet()']]] + ['triplet_168',['Triplet',['../class_dem_1_1_dem_bones.html#ac6f69fb5e7a91330f21f48ad9f019212',1,'Dem::DemBones::Triplet()'],['../class_dem_1_1_dem_bones_ext.html#aedb230a6a7eede0d751355b385e58938',1,'Dem::DemBonesExt::Triplet()']]] ]; diff --git a/docs/htmls/search/typedefs_3.js b/docs/htmls/search/typedefs_3.js index 77bc4ed..6ed4ebb 100644 --- a/docs/htmls/search/typedefs_3.js +++ b/docs/htmls/search/typedefs_3.js @@ -1,7 +1,7 @@ var searchData= [ - ['vector3_167',['Vector3',['../class_dem_1_1_dem_bones.html#a9404399e2528175da18fd80d7d4fc4f9',1,'Dem::DemBones::Vector3()'],['../class_dem_1_1_dem_bones_ext.html#af058734937a4b845b089291d4392f8ef',1,'Dem::DemBonesExt::Vector3()']]], - ['vector4_168',['Vector4',['../class_dem_1_1_dem_bones.html#a0c30c98fb363f888345d86e5a11acd14',1,'Dem::DemBones::Vector4()'],['../class_dem_1_1_dem_bones_ext.html#a033b6fd2dcf075cd48ed433f8a33cca1',1,'Dem::DemBonesExt::Vector4()']]], - ['vectortype_169',['VectorType',['../class_dem_1_1indexing__functor__vector.html#ae6acac4685ed51524c1c9db29d8f3d89',1,'Dem::indexing_functor_vector']]], - ['vectorx_170',['VectorX',['../class_dem_1_1_convex_l_s.html#a066dff3827a4d933cfed98276e8d41d0',1,'Dem::ConvexLS::VectorX()'],['../class_dem_1_1_dem_bones.html#aee5cdd95063d2b11d8a461f0e2efa9f9',1,'Dem::DemBones::VectorX()'],['../class_dem_1_1_dem_bones_ext.html#ae4ea2e0183a87df169cb893c1a699709',1,'Dem::DemBonesExt::VectorX()']]] + ['vector3_169',['Vector3',['../class_dem_1_1_dem_bones.html#a9404399e2528175da18fd80d7d4fc4f9',1,'Dem::DemBones::Vector3()'],['../class_dem_1_1_dem_bones_ext.html#af058734937a4b845b089291d4392f8ef',1,'Dem::DemBonesExt::Vector3()']]], + ['vector4_170',['Vector4',['../class_dem_1_1_dem_bones.html#a0c30c98fb363f888345d86e5a11acd14',1,'Dem::DemBones::Vector4()'],['../class_dem_1_1_dem_bones_ext.html#a033b6fd2dcf075cd48ed433f8a33cca1',1,'Dem::DemBonesExt::Vector4()']]], + ['vectortype_171',['VectorType',['../class_dem_1_1indexing__functor__vector.html#ae6acac4685ed51524c1c9db29d8f3d89',1,'Dem::indexing_functor_vector']]], + ['vectorx_172',['VectorX',['../class_dem_1_1_convex_l_s.html#a066dff3827a4d933cfed98276e8d41d0',1,'Dem::ConvexLS::VectorX()'],['../class_dem_1_1_dem_bones.html#aee5cdd95063d2b11d8a461f0e2efa9f9',1,'Dem::DemBones::VectorX()'],['../class_dem_1_1_dem_bones_ext.html#ae4ea2e0183a87df169cb893c1a699709',1,'Dem::DemBonesExt::VectorX()']]] ]; diff --git a/docs/htmls/search/variables_0.js b/docs/htmls/search/variables_0.js index 3a00d2d..5b05bcb 100644 --- a/docs/htmls/search/variables_0.js +++ b/docs/htmls/search/variables_0.js @@ -1,6 +1,6 @@ var searchData= [ - ['bind_128',['bind',['../class_dem_1_1_dem_bones_ext.html#a85422fd18d48c40485f05d77b1c4cf4d',1,'Dem::DemBonesExt']]], - ['bindupdate_129',['bindUpdate',['../class_dem_1_1_dem_bones_ext.html#a92939c0de147f8075754d9cbf66113fc',1,'Dem::DemBonesExt']]], - ['bonename_130',['boneName',['../class_dem_1_1_dem_bones_ext.html#afcf732ef4b030e907b7054232cc255f5',1,'Dem::DemBonesExt']]] + ['bind_129',['bind',['../class_dem_1_1_dem_bones_ext.html#a85422fd18d48c40485f05d77b1c4cf4d',1,'Dem::DemBonesExt']]], + ['bindupdate_130',['bindUpdate',['../class_dem_1_1_dem_bones_ext.html#a92939c0de147f8075754d9cbf66113fc',1,'Dem::DemBonesExt']]], + ['bonename_131',['boneName',['../class_dem_1_1_dem_bones_ext.html#afcf732ef4b030e907b7054232cc255f5',1,'Dem::DemBonesExt']]] ]; diff --git a/docs/htmls/search/variables_1.js b/docs/htmls/search/variables_1.js index 46aa378..a90a7b8 100644 --- a/docs/htmls/search/variables_1.js +++ b/docs/htmls/search/variables_1.js @@ -1,6 +1,6 @@ var searchData= [ - ['fstart_131',['fStart',['../class_dem_1_1_dem_bones.html#adf3d4f2aa7408bb6a9db540e86fd69c7',1,'Dem::DemBones']]], - ['ftime_132',['fTime',['../class_dem_1_1_dem_bones_ext.html#aebbc9093e05f8d3a466fe40610f5289d',1,'Dem::DemBonesExt']]], - ['fv_133',['fv',['../class_dem_1_1_dem_bones.html#ac4f7e7cb1b5cdfd737ddfc9e682de6f5',1,'Dem::DemBones']]] + ['fstart_132',['fStart',['../class_dem_1_1_dem_bones.html#adf3d4f2aa7408bb6a9db540e86fd69c7',1,'Dem::DemBones']]], + ['ftime_133',['fTime',['../class_dem_1_1_dem_bones_ext.html#aebbc9093e05f8d3a466fe40610f5289d',1,'Dem::DemBonesExt']]], + ['fv_134',['fv',['../class_dem_1_1_dem_bones.html#ac4f7e7cb1b5cdfd737ddfc9e682de6f5',1,'Dem::DemBones']]] ]; diff --git a/docs/htmls/search/variables_2.js b/docs/htmls/search/variables_2.js index 30cfeb2..79c486a 100644 --- a/docs/htmls/search/variables_2.js +++ b/docs/htmls/search/variables_2.js @@ -1,6 +1,6 @@ var searchData= [ - ['iter_134',['iter',['../class_dem_1_1_dem_bones.html#a06065f12b701c9bb556b7a79d14e984b',1,'Dem::DemBones']]], - ['itertransformations_135',['iterTransformations',['../class_dem_1_1_dem_bones.html#aed55acae84af67a7e958c830b821e747',1,'Dem::DemBones']]], - ['iterweights_136',['iterWeights',['../class_dem_1_1_dem_bones.html#aef1b9e1d0815f32c8f8374376c8d2c22',1,'Dem::DemBones']]] + ['iter_135',['iter',['../class_dem_1_1_dem_bones.html#a06065f12b701c9bb556b7a79d14e984b',1,'Dem::DemBones']]], + ['itertransformations_136',['iterTransformations',['../class_dem_1_1_dem_bones.html#aed55acae84af67a7e958c830b821e747',1,'Dem::DemBones']]], + ['iterweights_137',['iterWeights',['../class_dem_1_1_dem_bones.html#aef1b9e1d0815f32c8f8374376c8d2c22',1,'Dem::DemBones']]] ]; diff --git a/docs/htmls/search/variables_3.js b/docs/htmls/search/variables_3.js index 65d4d74..9569d51 100644 --- a/docs/htmls/search/variables_3.js +++ b/docs/htmls/search/variables_3.js @@ -1,5 +1,5 @@ var searchData= [ - ['lockm_137',['lockM',['../class_dem_1_1_dem_bones.html#a8391d148fee49d4c056b3b62bc1c7c08',1,'Dem::DemBones']]], - ['lockw_138',['lockW',['../class_dem_1_1_dem_bones.html#a153f756d2284f955e35229f15753264c',1,'Dem::DemBones']]] + ['lockm_138',['lockM',['../class_dem_1_1_dem_bones.html#a8391d148fee49d4c056b3b62bc1c7c08',1,'Dem::DemBones']]], + ['lockw_139',['lockW',['../class_dem_1_1_dem_bones.html#a153f756d2284f955e35229f15753264c',1,'Dem::DemBones']]] ]; diff --git a/docs/htmls/search/variables_4.js b/docs/htmls/search/variables_4.js index 92419aa..434d23f 100644 --- a/docs/htmls/search/variables_4.js +++ b/docs/htmls/search/variables_4.js @@ -1,4 +1,4 @@ var searchData= [ - ['m_139',['m',['../class_dem_1_1_dem_bones.html#a3462ee570b8b809ecff8739000783813',1,'Dem::DemBones']]] + ['m_140',['m',['../class_dem_1_1_dem_bones.html#a3462ee570b8b809ecff8739000783813',1,'Dem::DemBones']]] ]; diff --git a/docs/htmls/search/variables_5.js b/docs/htmls/search/variables_5.js index 3fcd464..9e6a81f 100644 --- a/docs/htmls/search/variables_5.js +++ b/docs/htmls/search/variables_5.js @@ -1,12 +1,12 @@ var searchData= [ - ['nb_140',['nB',['../class_dem_1_1_dem_bones.html#aa0b51ddfe06be09fdf3c74a00f5dd867',1,'Dem::DemBones']]], - ['nf_141',['nF',['../class_dem_1_1_dem_bones.html#aa9cf74a32230ec9c61096a58cdc555bf',1,'Dem::DemBones']]], - ['ninititers_142',['nInitIters',['../class_dem_1_1_dem_bones.html#a9079e21634edb0dd2502bfc3a1eedbd0',1,'Dem::DemBones']]], - ['niters_143',['nIters',['../class_dem_1_1_dem_bones.html#aa7f14b41174dc22e81b089d0c5a56950',1,'Dem::DemBones']]], - ['nnz_144',['nnz',['../class_dem_1_1_dem_bones.html#ad6ded1630b2bac8d192e6134823a37f8',1,'Dem::DemBones']]], - ['ns_145',['nS',['../class_dem_1_1_dem_bones.html#a913edb0e3273c6b18012c000a0764915',1,'Dem::DemBones']]], - ['ntransiters_146',['nTransIters',['../class_dem_1_1_dem_bones.html#a9afbf2acccc4126e1e76c2a41f3ac649',1,'Dem::DemBones']]], - ['nv_147',['nV',['../class_dem_1_1_dem_bones.html#a277dac86c8474a12eb489bedf98ddee2',1,'Dem::DemBones']]], - ['nweightsiters_148',['nWeightsIters',['../class_dem_1_1_dem_bones.html#ae381fbe6610c9f4b169b16106dfbae94',1,'Dem::DemBones']]] + ['nb_141',['nB',['../class_dem_1_1_dem_bones.html#aa0b51ddfe06be09fdf3c74a00f5dd867',1,'Dem::DemBones']]], + ['nf_142',['nF',['../class_dem_1_1_dem_bones.html#aa9cf74a32230ec9c61096a58cdc555bf',1,'Dem::DemBones']]], + ['ninititers_143',['nInitIters',['../class_dem_1_1_dem_bones.html#a9079e21634edb0dd2502bfc3a1eedbd0',1,'Dem::DemBones']]], + ['niters_144',['nIters',['../class_dem_1_1_dem_bones.html#aa7f14b41174dc22e81b089d0c5a56950',1,'Dem::DemBones']]], + ['nnz_145',['nnz',['../class_dem_1_1_dem_bones.html#ad6ded1630b2bac8d192e6134823a37f8',1,'Dem::DemBones']]], + ['ns_146',['nS',['../class_dem_1_1_dem_bones.html#a913edb0e3273c6b18012c000a0764915',1,'Dem::DemBones']]], + ['ntransiters_147',['nTransIters',['../class_dem_1_1_dem_bones.html#a9afbf2acccc4126e1e76c2a41f3ac649',1,'Dem::DemBones']]], + ['nv_148',['nV',['../class_dem_1_1_dem_bones.html#a277dac86c8474a12eb489bedf98ddee2',1,'Dem::DemBones']]], + ['nweightsiters_149',['nWeightsIters',['../class_dem_1_1_dem_bones.html#ae381fbe6610c9f4b169b16106dfbae94',1,'Dem::DemBones']]] ]; diff --git a/docs/htmls/search/variables_6.js b/docs/htmls/search/variables_6.js index bfb3154..bbdb455 100644 --- a/docs/htmls/search/variables_6.js +++ b/docs/htmls/search/variables_6.js @@ -1,5 +1,4 @@ var searchData= [ - ['parent_149',['parent',['../class_dem_1_1_dem_bones_ext.html#ad740868b3bc6cdf34e6e2ec5f35e24d7',1,'Dem::DemBonesExt']]], - ['premulinv_150',['preMulInv',['../class_dem_1_1_dem_bones_ext.html#a3785152d056860bc55febcad64837ef3',1,'Dem::DemBonesExt']]] + ['orient_150',['orient',['../class_dem_1_1_dem_bones_ext.html#a9a6a2004f16832cd3f97c22789147a8a',1,'Dem::DemBonesExt']]] ]; diff --git a/docs/htmls/search/variables_7.js b/docs/htmls/search/variables_7.js index 2f3d78e..7144b00 100644 --- a/docs/htmls/search/variables_7.js +++ b/docs/htmls/search/variables_7.js @@ -1,4 +1,5 @@ var searchData= [ - ['rotorder_151',['rotOrder',['../class_dem_1_1_dem_bones_ext.html#a30f4bfbe88493adecae038035e0b33be',1,'Dem::DemBonesExt']]] + ['parent_151',['parent',['../class_dem_1_1_dem_bones_ext.html#ad740868b3bc6cdf34e6e2ec5f35e24d7',1,'Dem::DemBonesExt']]], + ['premulinv_152',['preMulInv',['../class_dem_1_1_dem_bones_ext.html#a3785152d056860bc55febcad64837ef3',1,'Dem::DemBonesExt']]] ]; diff --git a/docs/htmls/search/variables_8.js b/docs/htmls/search/variables_8.js index a557af6..cfc8c66 100644 --- a/docs/htmls/search/variables_8.js +++ b/docs/htmls/search/variables_8.js @@ -1,4 +1,4 @@ var searchData= [ - ['subjectid_152',['subjectID',['../class_dem_1_1_dem_bones.html#ac99a3d810ab4fc1286e9677ce5c322b0',1,'Dem::DemBones']]] + ['rotorder_153',['rotOrder',['../class_dem_1_1_dem_bones_ext.html#a30f4bfbe88493adecae038035e0b33be',1,'Dem::DemBonesExt']]] ]; diff --git a/docs/htmls/search/variables_9.js b/docs/htmls/search/variables_9.js index 83ad303..823be1d 100644 --- a/docs/htmls/search/variables_9.js +++ b/docs/htmls/search/variables_9.js @@ -1,5 +1,4 @@ var searchData= [ - ['transaffine_153',['transAffine',['../class_dem_1_1_dem_bones.html#a53f9859cd63a8c51f6f50fdfa7251681',1,'Dem::DemBones']]], - ['transaffinenorm_154',['transAffineNorm',['../class_dem_1_1_dem_bones.html#a3b125934b440ebcebb3ba44acda41366',1,'Dem::DemBones']]] + ['subjectid_154',['subjectID',['../class_dem_1_1_dem_bones.html#ac99a3d810ab4fc1286e9677ce5c322b0',1,'Dem::DemBones']]] ]; diff --git a/docs/htmls/search/variables_a.js b/docs/htmls/search/variables_a.js index 395be54..960831f 100644 --- a/docs/htmls/search/variables_a.js +++ b/docs/htmls/search/variables_a.js @@ -1,4 +1,5 @@ var searchData= [ - ['u_155',['u',['../class_dem_1_1_dem_bones.html#aae8731033731fbe34df518e15137724a',1,'Dem::DemBones']]] + ['transaffine_155',['transAffine',['../class_dem_1_1_dem_bones.html#a53f9859cd63a8c51f6f50fdfa7251681',1,'Dem::DemBones']]], + ['transaffinenorm_156',['transAffineNorm',['../class_dem_1_1_dem_bones.html#a3b125934b440ebcebb3ba44acda41366',1,'Dem::DemBones']]] ]; diff --git a/docs/htmls/search/variables_b.js b/docs/htmls/search/variables_b.js index c277245..dd3376a 100644 --- a/docs/htmls/search/variables_b.js +++ b/docs/htmls/search/variables_b.js @@ -1,4 +1,4 @@ var searchData= [ - ['v_156',['v',['../class_dem_1_1_dem_bones.html#a276046cc5a2a13802762d65c17ec67fb',1,'Dem::DemBones']]] + ['u_157',['u',['../class_dem_1_1_dem_bones.html#aae8731033731fbe34df518e15137724a',1,'Dem::DemBones']]] ]; diff --git a/docs/htmls/search/variables_c.js b/docs/htmls/search/variables_c.js index ffa012f..1d705a2 100644 --- a/docs/htmls/search/variables_c.js +++ b/docs/htmls/search/variables_c.js @@ -1,7 +1,4 @@ var searchData= [ - ['w_157',['w',['../class_dem_1_1_dem_bones.html#a8fa642adc3a5610f0a391fa5f437a9b3',1,'Dem::DemBones']]], - ['weighteps_158',['weightEps',['../class_dem_1_1_dem_bones.html#afab4c23ab2a15d11225934c9e4252881',1,'Dem::DemBones']]], - ['weightssmooth_159',['weightsSmooth',['../class_dem_1_1_dem_bones.html#aba10dbe999f33dfb5456c0f3554700a3',1,'Dem::DemBones']]], - ['weightssmoothstep_160',['weightsSmoothStep',['../class_dem_1_1_dem_bones.html#a26babdede07e8e220002e420b9161aa9',1,'Dem::DemBones']]] + ['v_158',['v',['../class_dem_1_1_dem_bones.html#a276046cc5a2a13802762d65c17ec67fb',1,'Dem::DemBones']]] ]; diff --git a/docs/htmls/search/variables_d.html b/docs/htmls/search/variables_d.html new file mode 100644 index 0000000..8b53e60 --- /dev/null +++ b/docs/htmls/search/variables_d.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/htmls/search/variables_d.js b/docs/htmls/search/variables_d.js new file mode 100644 index 0000000..2c4e412 --- /dev/null +++ b/docs/htmls/search/variables_d.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['w_159',['w',['../class_dem_1_1_dem_bones.html#a8fa642adc3a5610f0a391fa5f437a9b3',1,'Dem::DemBones']]], + ['weighteps_160',['weightEps',['../class_dem_1_1_dem_bones.html#afab4c23ab2a15d11225934c9e4252881',1,'Dem::DemBones']]], + ['weightssmooth_161',['weightsSmooth',['../class_dem_1_1_dem_bones.html#aba10dbe999f33dfb5456c0f3554700a3',1,'Dem::DemBones']]], + ['weightssmoothstep_162',['weightsSmoothStep',['../class_dem_1_1_dem_bones.html#a26babdede07e8e220002e420b9161aa9',1,'Dem::DemBones']]] +]; diff --git a/include/DemBones/DemBones.h b/include/DemBones/DemBones.h index a88618c..201668b 100644 --- a/include/DemBones/DemBones.h +++ b/include/DemBones/DemBones.h @@ -44,7 +44,7 @@ namespace Dem - DemBones::nTransIters, DemBones::transAffine, DemBones::transAffineNorm - DemBones::nWeightsIters, DemBones::nnz, DemBones::weightsSmooth, DemBones::weightsSmoothStep, DemBones::weightEps -# [@c optional] Setup extended class: - - Load data: DemBonesExt::parent, DemBonesExt::preMulInv, DemBonesExt::rotOrder, DemBonesExt::bind + - Load data: DemBonesExt::parent, DemBonesExt::preMulInv, DemBonesExt::rotOrder, DemBonesExt::orient, DemBonesExt::bind - Set parameter DemBonesExt::bindUpdate -# [@c optional] Override callback functions (cb...) in the base class @ref DemBones -# Call decomposition function DemBones::compute(), DemBones::computeWeights(), DemBones::computeTranformations(), or DemBones::init() @@ -56,7 +56,7 @@ namespace Dem @details Setup the required data, parameters, and call either compute(), computeWeights(), computeTranformations(), or init(). - Callback functions and read-only values can be used to report progress: cbInitSplitBegin(), cbInitSplitEnd(), + Callback functions and read-only values can be used to report progress and stop on convergence: cbInitSplitBegin(), cbInitSplitEnd(), cbIterBegin(), cbIterEnd(), cbWeightsBegin(), cbWeightsEnd(), cbTranformationsBegin(), cbTransformationsEnd(), cbTransformationsIterBegin(), cbTransformationsIterEnd(), cbWeightsIterBegin(), cbWeightsIterEnd(), rmse(), #iter, #iterTransformations, #iterWeights. @@ -254,7 +254,7 @@ class DemBones { if (uuT.innerIdx(it)!=j) qpT-=m.blk4(k, uuT.innerIdx(it))*uuT.val.blk4(subjectID(k), it); qpT2m(qpT, k, j); } - cbTransformationsIterEnd(); + if (cbTransformationsIterEnd()) return; } cbTransformationsEnd(); @@ -323,7 +323,7 @@ class DemBones { w.resize(nB, nV); w.setFromTriplets(trip.begin(), trip.end()); - cbWeightsIterEnd(); + if (cbWeightsIterEnd()) return; } cbWeightsEnd(); @@ -348,16 +348,16 @@ class DemBones { cbIterBegin(); computeTranformations(); computeWeights(); - cbIterEnd(); + if (cbIterEnd()) break; } } - + //! @return Root mean squared reconstruction error _Scalar rmse() { _Scalar e=0; #pragma omp parallel for for (int i=0; i { using DemBones<_Scalar, _AniMeshScalar>::fStart; using DemBones<_Scalar, _AniMeshScalar>::subjectID; using DemBones<_Scalar, _AniMeshScalar>::u; - using DemBones<_Scalar, _AniMeshScalar>::w; + using DemBones<_Scalar, _AniMeshScalar>::w; using DemBones<_Scalar, _AniMeshScalar>::lockW; - using DemBones<_Scalar, _AniMeshScalar>::m; + using DemBones<_Scalar, _AniMeshScalar>::m; using DemBones<_Scalar, _AniMeshScalar>::lockM; using DemBones<_Scalar, _AniMeshScalar>::v; using DemBones<_Scalar, _AniMeshScalar>::fv; @@ -88,7 +88,10 @@ class DemBonesExt: public DemBones<_Scalar, _AniMeshScalar> { //! Rotation order, [@c size] = [3*#nS, #nB], #rotOrder.@a col(@p j).@a segment<3>(3*@p s) is the rotation order of bone @p j on subject @p s, 0=@c X, 1=@c Y, 2=@c Z, e.g. {0, 1, 2} is @c XYZ order Eigen::MatrixXi rotOrder; - //! Bind transformation update, 0=keep original, 1=set translations to p-norm centroids (using #transAffineNorm) and rotations to identity + //! Orientations of bones, [@c size] = [3*#nS, #nB], @p orient.@a col(@p j).@a segment<3>(3*@p s) is the(@c rx, @c ry, @c rz) orientation of bone @p j in degree + MatrixX orient; + + //! Bind transformation update, 0=keep original, 1=set translations to p-norm centroids (using #transAffineNorm) and rotations to identity, 2=do 1 and group joints int bindUpdate; /** @brief Constructor and setting default parameters @@ -106,32 +109,40 @@ class DemBonesExt: public DemBones<_Scalar, _AniMeshScalar> { bind.resize(0, 0); preMulInv.resize(0, 0); rotOrder.resize(0, 0); + orient.resize(0, 0); DemBones<_Scalar, _AniMeshScalar>::clear(); } /** @brief Local rotations, translations and global bind matrices of a subject @details Required all data in the base class: #u, #fv, #nV, #v, #nF, #fStart, #subjectID, #nS, #m, #w, #nB - - This function will initialize these default values for missing attributes: - - #parent: -1 vector, [@c size] = #nB + + This function will initialize missing attributes: + - #parent: -1 vector (if no joint grouping) or parent to a root, [@c size] = #nB - #preMulInv: 4*4 identity matrix blocks, [@c size] = [4*#nS, 4*#nB] - #rotOrder: {0, 1, 2} vector blocks, [@c size] = [3*#nS, #nB] + - #orient: 0 matrix, [@c size] = [3*#nS, #nB] @param[in] s is the subject index - @param[in] orient is the [3, #nB] orientations of bones, @p orient.@a col(@p j) is the (@c rx, @c ry, @c rz) orientation of bone @p j in degree @param[out] lr is the [3*@p nFr, #nB] by-reference output local rotations, @p lr.@a col(@p j).segment<3>(3*@p k) is the (@c rx, @c ry, @c rz) of bone @p j at frame @p k @param[out] lt is the [3*@p nFr, #nB] by-reference output local translations, @p lt.@a col(@p j).segment<3>(3*@p k) is the (@c tx, @c ty, @c tz) of bone @p j at frame @p k @param[out] gb is the [4, 4*#nB] by-reference output global bind matrices, @p gb.@a block(0, 4*@p j, 4, 4) is the bind matrix of bone j @param[out] lbr is the [3, #nB] by-reference output local rotations at bind pose @p lbr.@a col(@p j).segment<3>(3*@p k) is the (@c rx, @c ry, @c rz) of bone @p j - @param[out] lbt is the [3, #nB] by-reference output local translations at bind pose, @p lbt.@a col(@p j).segment<3>(3**3k) is the (@c tx, @c ty, @c tz) of bone @p j + @param[out] lbt is the [3, #nB] by-reference output local translations at bind pose, @p lbt.@a col(@p j).segment<3>(3*@p k) is the (@c tx, @c ty, @c tz) of bone @p j @param[in] degreeRot=true will output rotations in degree, otherwise output in radian */ - void computeRTB(int s, const MatrixX& orient, MatrixX& lr, MatrixX& lt, MatrixX& gb, MatrixX& lbr, MatrixX& lbt, bool degreeRot=true) { + void computeRTB(int s, MatrixX& lr, MatrixX& lt, MatrixX& gb, MatrixX& lbr, MatrixX& lbt, bool degreeRot=true) { computeBind(s, gb); - if (parent.size()==0) parent=Eigen::VectorXi::Constant(nB, -1); + if (parent.size()==0) { + if (bindUpdate==2) { + int root=computeRoot(); + parent=Eigen::VectorXi::Constant(nB, root); + parent(root)=-1; + } else parent=Eigen::VectorXi::Constant(nB, -1); + } if (preMulInv.size()==0) preMulInv=MatrixX::Identity(4, 4).replicate(nS, nB); if (rotOrder.size()==0) rotOrder=Eigen::Vector3i(0, 1, 2).replicate(nS, nB); + if (orient.size()==0) orient=MatrixX::Zero(3*nS, nB); int nFs=fStart(s+1)-fStart(s); lr.resize(nFs*3, nB); @@ -144,7 +155,7 @@ class DemBonesExt: public DemBones<_Scalar, _AniMeshScalar> { for (int j=0; j(s*3); - Vector3 ov=orient.col(j)*EIGEN_PI/180; + Vector3 ov=orient.vec3(s, j)*EIGEN_PI/180; Matrix3 invOM=Matrix3(Eigen::AngleAxis<_Scalar>(ov(ro(2)), Vector3::Unit(ro(2))))* Eigen::AngleAxis<_Scalar>(ov(ro(1)), Vector3::Unit(ro(1)))* Eigen::AngleAxis<_Scalar>(ov(ro(0)), Vector3::Unit(ro(0))); @@ -191,7 +202,7 @@ class DemBonesExt: public DemBones<_Scalar, _AniMeshScalar> { /** Global bind pose @param s is the subject index - @param bindUpdate is the type of bind pose update, 0=keep original, 1=set translations to p-norm centroids (using #transAffineNorm) and rotations to identity + @param bindUpdate is the type of bind pose update, 0=keep original, 1 or 2=set translations to p-norm centroids (using #transAffineNorm) and rotations to identity @param b is the the [4, 4*#nB] by-reference output global bind matrices, #b.#a block(0, 4*@p j, 4, 4) is the bind matrix of bone @p j */ void computeBind(int s, MatrixX& b) { @@ -206,7 +217,23 @@ class DemBonesExt: public DemBones<_Scalar, _AniMeshScalar> { } b=bind.block(4*s, 0, 4, 4*nB); - if (bindUpdate==1) computeCentroids(s, b); + if (bindUpdate>=1) computeCentroids(s, b); + } + + /** Root joint + */ + int computeRoot() { + VectorX err(nB); + #pragma omp parallel for + for (int j=0; j()).squaredNorm(); + err(j)=ej; + } + int rj; + err.minCoeff(&rj); + return rj; } /** Euler angles from rotation matrix diff --git a/logo/DemBones_small.png b/logo/DemBones_small.png new file mode 100644 index 0000000..072d62c Binary files /dev/null and b/logo/DemBones_small.png differ diff --git a/src/command/FbxReader.cpp b/src/command/FbxReader.cpp index 642e842..06e48ab 100644 --- a/src/command/FbxReader.cpp +++ b/src/command/FbxReader.cpp @@ -27,6 +27,7 @@ class FbxSceneImporter: public FbxSceneShared { map, aligned_allocator>> wT; map, aligned_allocator>> bind, preMulInv; map, aligned_allocator>> rotOrder; + map, aligned_allocator>> orient; map, aligned_allocator>> m; map lockM; VectorXd lockW; @@ -170,6 +171,9 @@ class FbxSceneImporter: public FbxSceneShared { case eEulerZYX: rotOrder[name]=Vector3i(2, 1, 0); break; } + FbxDouble3 oj=jn[j].pNode->PreRotation.Get(); + orient[name]<GetParent()!=jn[j].pParentJoint) { Matrix4d gp=Map((double*)(jn[j].pNode->GetParent()->EvaluateGlobalTransform())); if (jn[j].pParentJoint==NULL) preMulInv[name]=gp.inverse(); else { @@ -251,6 +255,7 @@ bool readFBXs(const vector& fileNames, DemBonesExt& model model.bind.resize(model.nS*4, model.nB*4); model.preMulInv.resize(model.nS*4, model.nB*4); model.rotOrder.resize(model.nS*3, model.nB); + model.orient.resize(model.nS*3, model.nB); model.lockM.resize(model.nB); for (int j=0; j& fileNames, DemBonesExt& model model.bind.blk4(s, j)=importer.bind[nj]; model.preMulInv.blk4(s, j)=importer.preMulInv[nj]; model.rotOrder.vec3(s, j)=importer.rotOrder[nj]; + model.orient.vec3(s, j)=importer.orient[nj]; model.lockM(j)=importer.lockM[nj]; } @@ -282,11 +288,6 @@ bool readFBXs(const vector& fileNames, DemBonesExt& model if (model.nB!=importer.jointName.size()) err("Inconsistent joints set.\n"); - model.parent.resize(model.nB); - model.bind.resize(model.nS*4, model.nB*4); - model.preMulInv.resize(model.nS*4, model.nB*4); - model.rotOrder.resize(model.nS*3, model.nB); - for (int j=0; j& fileNames, DemBonesExt& model model.preMulInv.blk4(s, j)=importer.preMulInv[nj]; if (importer.rotOrder.find(nj)==importer.rotOrder.end()) err("Inconsistent joints set.\n"); model.rotOrder.vec3(s, j)=importer.rotOrder[nj]; + if (importer.orient.find(nj)==importer.orient.end()) err("Inconsistent joints set.\n"); + model.orient.vec3(s, j)=importer.orient[nj]; if (model.lockM(j)!=importer.lockM[nj]) err("Inconsistent joint lock set.\n"); } diff --git a/src/command/FbxReader.h b/src/command/FbxReader.h index 57d34d4..441828f 100644 --- a/src/command/FbxReader.h +++ b/src/command/FbxReader.h @@ -14,7 +14,7 @@ using namespace std; using namespace Dem; /** Read FBX files and set: model.u, model.fv, model.w (if exist), model.m (if exist), model.nB, - model.boneName (if exist), model.parent (if exist), model.bind (if exist), model.preMulInv (if exist), model.rotOrder (if exist) + model.boneName (if exist), model.parent (if exist), model.bind (if exist), model.preMulInv (if exist), model.rotOrder (if exist), model.orient (if exist) @return true if success */ bool readFBXs(const vector& fileNames, DemBonesExt& model); diff --git a/src/command/FbxWriter.cpp b/src/command/FbxWriter.cpp index 979c22b..0953e16 100644 --- a/src/command/FbxWriter.cpp +++ b/src/command/FbxWriter.cpp @@ -44,25 +44,30 @@ class FbxSceneExporter: public FbxSceneShared { return true; } - void createJoints(const vector& name, double radius) { - for (int j=0; j!=name.size(); j++) { - FbxSkeleton* lSkeletonAttribute=FbxSkeleton::Create(lScene, name[j].c_str()); - lSkeletonAttribute->SetSkeletonType(FbxSkeleton::eLimb); - lSkeletonAttribute->Size.Set(radius); - FbxNode* lSkeleton=FbxNode::Create(lScene, name[j].c_str()); - lSkeleton->SetNodeAttribute(lSkeletonAttribute); - lSkeleton->SetRotationOrder(FbxNode::eSourcePivot, eEulerXYZ); - lScene->GetRootNode()->AddChild(lSkeleton); - } - } + void createJoints(const vector& name, const ArrayXi& parent, double radius) { + FbxNode* lRoot=NULL; + for (int j=0; j!=name.size(); j++) + if (parent(j)==-1) { + FbxSkeleton* lSkeletonAttribute=FbxSkeleton::Create(lScene, name[j].c_str()); + lSkeletonAttribute->SetSkeletonType(((parent==j).count()>0)?FbxSkeleton::eRoot:FbxSkeleton::eLimb); + lSkeletonAttribute->Size.Set(radius); + FbxNode* lSkeleton=FbxNode::Create(lScene, name[j].c_str()); + lSkeleton->SetNodeAttribute(lSkeletonAttribute); + lSkeleton->SetRotationOrder(FbxNode::eSourcePivot, eEulerXYZ); + lScene->GetRootNode()->AddChild(lSkeleton); + lRoot=lSkeleton; + } - void getOrientations(const vector& name, MatrixXd& o) { - o.resize(3, name.size()); - for (int j=0; j!=name.size(); j++) { - FbxNode* lSkeleton=lScene->FindNodeByName(FbxString(name[j].c_str())); - FbxDouble3 oj=lSkeleton->PreRotation.Get(); - o.col(j)<SetSkeletonType(FbxSkeleton::eLimb); + lSkeletonAttribute->Size.Set(radius); + FbxNode* lSkeleton=FbxNode::Create(lScene, name[j].c_str()); + lSkeleton->SetNodeAttribute(lSkeletonAttribute); + lSkeleton->SetRotationOrder(FbxNode::eSourcePivot, eEulerXYZ); + lRoot->AddChild(lSkeleton); + } } void addToCurve(const VectorXd& val, const VectorXd& fTime, FbxAnimCurve* lCurve) { @@ -188,13 +193,11 @@ bool writeFBXs(const vector& fileNames, const vector& inputFileN if (!exporter.open(inputFileNames[s])) err("Error on opening file.\n"); msg(1, "--> \""< #include +#include #include "FbxReader.h" #include "AbcReader.h" #include "FbxWriter.h" @@ -19,17 +20,37 @@ using namespace Dem; class MyDemBones: public DemBonesExt { public: + double tolerance; + int patience; + + MyDemBones(): tolerance(1e-3), patience(3) { nIters=100; } + + void compute() { + prevErr=-1; + np=patience; + DemBonesExt::compute(); + } + void cbIterBegin() { msg(1, " Iter #"<"); - } void cbInitSplitEnd() { @@ -52,13 +73,19 @@ class MyDemBones: public DemBonesExt { msg(1, " Done! "); } - void cbTransformationsIterEnd() { + bool cbTransformationsIterEnd() { msg(1, "."); + return false; } - void cbWeightsIterEnd() { + bool cbWeightsIterEnd() { msg(1, "."); + return false; } + +private: + double prevErr; + int np; } model; int main(int argc, char** argv) { @@ -67,7 +94,7 @@ int main(int argc, char** argv) { CmdLine cmd("Dem Bones - (c) Electronic Arts 2019\n" " - This tool only handles clean input data, i.e. only one piece of geometry with one skinCluster and no excessive joint.\n\ - To hard-lock the transformations of bones: in the input fbx files, create bool attributes for joint nodes (bones) with name \"demLock\" and set the value to \"true\".\n\ - - To soft-lock skinning weights of vertices: in the input fbx files, paint per-vertex colors in gray-scale. The closer the color to white, the more skinning weights of the vertex are preserved.", '=', "1.1.0"); + - To soft-lock skinning weights of vertices: in the input fbx files, paint per-vertex colors in gray-scale. The closer the color to white, the more skinning weights of the vertex are preserved.", '=', "1.2.0"); ValueArg logFile("", "log", "log file name", false, "", "filename", cmd); ValueArg dbg("", "dbg", "debug level", false, 1, "int", cmd); @@ -79,9 +106,12 @@ int main(int argc, char** argv) { ValueArg transAffineNorm("", "transAffineNorm", "p-Norm for bone translations affinity", false, model.transAffineNorm, "double", cmd); ValueArg transAffine("", "transAffine", "bone translations affinity soft constraint", false, model.transAffine, "double", cmd); - ValueArg bindUpdate("", "bindUpdate", "update bind pose (0=no update, 1=update joint positions)", false, model.bindUpdate, "int", cmd); + ValueArg bindUpdate("", "bindUpdate", "update bind pose (0=no update, 1=update joint positions, 2=regroup joints under one root)", false, model.bindUpdate, "int", cmd); ValueArg nTransIters("", "nTransIters", "number of transformation update iterations per global iteration", false, model.nTransIters, "int", cmd); + ValueArg patience("", "patience", "convergence patience, stop if error relatively reduces less than [--tolerance] in [--patience] consecutive iterations", false, model.patience, "int", cmd); + ValueArg tolerance("", "tolerance", "convergence tolerance, stop if error relatively reduces less than [--tolerance] in [--patience] consecutive iterations", false, model.tolerance, "double", cmd); + ValueArg nIters("n", "nIters", "number of global iterations", false, model.nIters, "int", cmd); ValueArg nInitIters("", "nInitIters", "number iterations per init cluster splitting", false, model.nInitIters, "int", cmd); @@ -125,14 +155,20 @@ int main(int argc, char** argv) { } msg(1, " nIters = "<
    Dem Bones -  1.1.0 +  1.2.0
    Skinning Decomposition Library