Compute moment of inertia for concave and boundary meshes. Resolve #338.
- Mesh inertias can now be computed exactly for well-formed (no holes) non-convex meshes. - To activate this feature, set `<compiler exactmeshinertia="true">` (defaults to `false`). This default may change in the future. - Added `<geom shellinertia="true/false">` (defaults to `false`). When true, geom inertia is computed assuming all the mass is concentrated on the surface, and `density` is interpreted as surface density (mass/area). Currently only mesh geoms are supported. PiperOrigin-RevId: 464368395 Change-Id: I17afd99b9b221c9d24ae951f6e63d5c61ff89820
This commit is contained in:
committed by
Copybara-Service
parent
52d78f8d24
commit
5c5449bf82
+23
-7
@@ -76,6 +76,13 @@ typedef enum _mjtMark {
|
||||
} mjtMark;
|
||||
|
||||
|
||||
// type of mesh
|
||||
typedef enum _mjtMeshType {
|
||||
mjVOLUME_MESH,
|
||||
mjSHELL_MESH,
|
||||
} mjtMeshType;
|
||||
|
||||
|
||||
// error information
|
||||
class mjCError {
|
||||
public:
|
||||
@@ -298,6 +305,7 @@ class mjCGeom : public mjCBase {
|
||||
std::string material; // name of material used for rendering
|
||||
std::vector<double> userdata; // user data
|
||||
float rgba[4]; // rgba when material is omitted
|
||||
mjtMeshType typeinertia; // selects between surface and volume inertia
|
||||
|
||||
// variables set by user and used during compilation
|
||||
double _mass; // used to compute density
|
||||
@@ -443,9 +451,11 @@ class mjCMesh: public mjCBase {
|
||||
friend class mjXWriter;
|
||||
|
||||
public:
|
||||
void GetPos(double* pos); // get position
|
||||
void GetQuat(double* quat); // get orientation
|
||||
void FitGeom(mjCGeom* geom, double* meshpos); // approximate mesh with simple geom
|
||||
double* GetPosPtr(mjtMeshType type); // get position
|
||||
double* GetQuatPtr(mjtMeshType type); // get orientation
|
||||
double* GetInertiaBoxPtr(mjtMeshType type); // get inertia box
|
||||
double& GetVolumeRef(mjtMeshType type); // get volume
|
||||
void FitGeom(mjCGeom* geom, double* meshpos); // approximate mesh with simple geom
|
||||
|
||||
std::string file; // mesh file
|
||||
double refpos[3]; // reference position (translate)
|
||||
@@ -469,14 +479,20 @@ class mjCMesh: public mjCBase {
|
||||
void MakeGraph(void); // make graph of convex hull
|
||||
void CopyGraph(void); // copy graph into face data
|
||||
void MakeNormal(void); // compute vertex normals
|
||||
void Process(void); // apply transformations
|
||||
void Process(); // apply transformations
|
||||
void RemoveRepeated(void); // remove repeated vertices
|
||||
void ComputeInertia(mjtMeshType type); // compute inertia
|
||||
|
||||
// mesh properties computed by Compile
|
||||
double pos[3]; // CoM position
|
||||
double quat[4]; // inertia orientation
|
||||
double boxsz[3]; // half-sizes of equivalent inertia box
|
||||
double pos_volume[3]; // CoM position
|
||||
double pos_surface[3]; // CoM position
|
||||
double quat_volume[4]; // inertia orientation
|
||||
double quat_surface[4]; // inertia orientation
|
||||
double boxsz_volume[3]; // half-sizes of equivalent inertia box (volume)
|
||||
double boxsz_surface[3]; // half-sizes of equivalent inertia box (surface)
|
||||
double aabb[3]; // half-sizes of axis-aligned bounding box
|
||||
double volume; // volume of the mesh
|
||||
double surface; // surface of the mesh
|
||||
|
||||
// mesh data to be copied into mjModel
|
||||
int nvert; // number of vertices
|
||||
|
||||
Reference in New Issue
Block a user