Files
Mujoco_WASM/plugin/sdf
Alessio Quaglino 5d46c39529 Increased SdfLib bounding box by 10% to prevent querying outside it during collision detection.
In case a query outside is performed, add SDF gradient computation using finite differences.

For SDFs generated from meshes, when the query point lies outside of the bounding box, the gradient provided by SdfLib ignores the SDF and is equivalent to the gradient of the distance from the bounding box, causing local minima in the contact point optimization. This CL increased the size of the bounding boxes and replaces the SdfLib gradient with a finite difference approximation of the gradient if a point lies outside it.

PiperOrigin-RevId: 597839637
Change-Id: I79dfddbe25288eca7eb235db51781fc2bb2c3c5f
2024-01-12 07:54:10 -08:00
..
2023-10-30 03:09:25 -07:00
2023-10-30 03:09:25 -07:00
2023-10-30 03:09:25 -07:00
2024-01-03 08:10:01 -08:00
2023-10-30 03:09:25 -07:00
2023-10-30 03:09:25 -07:00
2023-10-30 03:09:25 -07:00

MuJoCo

Signed distance function (SDF) plugins

These are first-party plugins that implement implicit geometries using SDFs. They can be applied to geoms and meshes (in the asset section). Sample models can be found in this folder.

Bolt

Implemented in bolt.cc. Example usage in nutbolt.xml.

This plugin implements a bolt with a hexagonal head, similar to https://www.shadertoy.com/view/XtffzX.

Parameters:

  • radius [m]: bolt radius (default 0.26).

Bowl

Implemented in bowl.cc. Example usage in bowl.xml.

The plugin implements a cut hollow sphere from https://www.shadertoy.com/view/7tVXRt.

Parameters:

  • height [m]: location of the cut plane (default 0.4).
  • radius [m]: radius of the sphere (default 1).
  • thickness [m]: thickness of the bowl (default 0.02).

Gear

Implemented in gear.cc. Example usage in gear.xml.

The plugin implements a 3D extrusion of the 2D gear geometry from https://www.shadertoy.com/view/3lG3WR.

Parameters:

  • alpha [m]: initial angle of rotation of the gear (default 0).
  • diameter [m]: gear diameter (default 2.8).
  • teeth []: number of teeth (default 25).

Nut

Implemented in nut.cc. Example usage in nutbolt.xml.

This plugin implements a hexagonal nut identical to the bolt head from https://www.shadertoy.com/view/XtffzX.

Parameters:

  • radius [m]: nut radius (default 0.26).

Torus

Implemented in torus.cc. Example usage in torus.xml.

This plugin implements a torus.

Parameters:

  • radius1 [m]: major radius (default 0.35).
  • radius1 [m]: minor radius (default 0.15).

How to make your own SDF

Create your MySDF.h and MySDF.cc files in the SDF folder, where this README is located. Implement your SDF using the following interface:

struct MySDFAttribute {
  static constexpr int nattribute =
  /* insert the number of attributes */;
  static constexpr char const* names[nattribute] =
  /* an array of attributes with the same order as the attribute array in your SDF class */;
  static constexpr mjtNum defaults[nattribute] =
  /* an array of default values for your attributes */;
};

class MySDF {
 public:
  // creates a new MySDF instance or returns null on failure.
  static std::optional<MySDF> Create(const mjModel* m, mjData* d, int instance);
  MySDF(MySDF&&) = default;
  ~MySDF() = default;

  // functions that return the SDF and its gradient at a query point
  mjtNum Distance(const mjtNum point[3]) const;
  void Gradient(mjtNum grad[3], const mjtNum point[3]) const;

  // a call to this needs to be added to register.cc
  static void RegisterPlugin();

  // an array of attributes with the same order as in the struct above
  mjtNum attribute[MySDFAttribute::nattribute];

 private:
  MySDF(const mjModel* m, mjData* d, int instance);
};