diff --git a/model/plugin/elasticity/pancake_flex.xml b/model/plugin/elasticity/pancake_flex.xml
new file mode 100644
index 00000000..38e839f9
--- /dev/null
+++ b/model/plugin/elasticity/pancake_flex.xml
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/user/user_flexcomp.cc b/src/user/user_flexcomp.cc
index eefbc391..94fb3b25 100644
--- a/src/user/user_flexcomp.cc
+++ b/src/user/user_flexcomp.cc
@@ -84,6 +84,7 @@ mjCFlexcomp::mjCFlexcomp(void) {
// make flexcomp object
bool mjCFlexcomp::Make(mjCModel* model, mjmBody* body, char* error, int error_sz) {
mjmFlex* dflex = def.spec.flex;
+ int dim = dflex->dim;
bool radial = (type==mjFCOMPTYPE_BOX ||
type==mjFCOMPTYPE_CYLINDER ||
type==mjFCOMPTYPE_ELLIPSOID);
@@ -96,9 +97,14 @@ bool mjCFlexcomp::Make(mjCModel* model, mjmBody* body, char* error, int error_sz
return comperr(error, "Parent body must have name", error_sz);
}
+ // check dim
+ if (dim<1 || dim>3) {
+ return comperr(error, "Invalid dim, must be between 1 and 3", error_sz);
+ }
+
// check counts
for (int i=0; i<3; i++) {
- if (count[i]<1 || (radial && count[i]<2)) {
+ if (count[i]<1 || ((radial && count[i]<2) && dim==3)) {
return comperr(error, "Count too small", error_sz);
}
}
@@ -142,6 +148,11 @@ bool mjCFlexcomp::Make(mjCModel* model, mjmBody* body, char* error, int error_sz
res = MakeBox(error, error_sz);
break;
+ case mjFCOMPTYPE_SQUARE:
+ case mjFCOMPTYPE_DISC:
+ res = MakeSquare(error, error_sz);
+ break;
+
case mjFCOMPTYPE_MESH:
res = MakeMesh(model, error, error_sz);
break;
@@ -161,12 +172,6 @@ bool mjCFlexcomp::Make(mjCModel* model, mjmBody* body, char* error, int error_sz
return false;
}
- // get dim and check
- int dim = dflex->dim;
- if (dim<1 || dim>3) {
- return comperr(error, "Invalid dim, must be between 1 and 3", error_sz);
- }
-
// force flatskin shading for box, cylinder and 3D grid
if (type==mjFCOMPTYPE_BOX || type==mjFCOMPTYPE_CYLINDER ||
(type==mjFCOMPTYPE_GRID && dim==3)) {
@@ -540,12 +545,15 @@ bool mjCFlexcomp::MakeGrid(char* error, int error_sz) {
// 2D
else if (dim==2) {
- int quad2tri[2][3] = {{0, 1, 2}, {0, 2, 3}};
for (int ix=0; ix -mjEPS) ||
+ (pos[0] > -mjEPS && pos[1] < -mjEPS)) &&
+ type == mjFCOMPTYPE_DISC) {
+ quad2tri[0][2] = 3;
+ quad2tri[1][0] = 1;
+ }
+
// add elements
if (ixdim = 2;
+
+ // create square
+ if (!MakeGrid(error, error_sz)) {
+ return false;
+ }
+
+ // do projection
+ if (type==mjFCOMPTYPE_DISC) {
+ double size[2] = {
+ 0.5*spacing[0]*(count[0]-1),
+ 0.5*spacing[1]*(count[1]-1),
+ };
+
+ for (int i=0; i