From 8f1ea05bef131e71bb374678ca0a777322dea2ae Mon Sep 17 00:00:00 2001 From: Alessio Quaglino Date: Thu, 29 Feb 2024 07:23:46 -0800 Subject: [PATCH] Add disc mesh generation to user_flexcomp. PiperOrigin-RevId: 611462985 Change-Id: I0fc195d8733172f5f4347b04b5de0edfdd12613d --- model/plugin/elasticity/pancake_flex.xml | 50 ++++++++++++++++++ src/user/user_flexcomp.cc | 67 ++++++++++++++++++++---- src/user/user_flexcomp.h | 3 ++ src/xml/xml_native_reader.cc | 2 + 4 files changed, 112 insertions(+), 10 deletions(-) create mode 100644 model/plugin/elasticity/pancake_flex.xml 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