Improve quality of maxhullvert coarse convex hulls using Qhull's Q9 option.

PiperOrigin-RevId: 928417339
Change-Id: I59ecd454f063f2e32e1c3ce08eb4a18506ddf8c8
This commit is contained in:
Yuval Tassa
2026-06-08 01:55:54 -07:00
committed by Copybara-Service
parent 0093210173
commit ea2d785e0a
2 changed files with 7 additions and 4 deletions
+5 -3
View File
@@ -7,15 +7,17 @@ Upcoming version (not yet released)
General General
^^^^^^^ ^^^^^^^
- Added :ref:`mju_threadpool`, a new function for creating a thread pool on an ``mjData`` instance. When a thread pool
is initialized, parts of the simulation pipeline, such as collision detection and constraint solving across islands,
are parallelized. The thread pool is automatically destroyed when the ``mjData`` is freed.
- Improved primal solver convergence under float32. Improvements initially proposed by :github:user:`n3b` in - Improved primal solver convergence under float32. Improvements initially proposed by :github:user:`n3b` in
:issue:`2313` and :github:user:`denzeler-nvidia` in :doc:`MJWarp <mjwarp/index>` pull request :issue:`2313` and :github:user:`denzeler-nvidia` in :doc:`MJWarp <mjwarp/index>` pull request
`1374 <https://github.com/google-deepmind/mujoco_warp/pull/1374>`__. `1374 <https://github.com/google-deepmind/mujoco_warp/pull/1374>`__.
- Added :ref:`mjs_makeFlex`, a new C API function equivalent to the :ref:`flexcomp<body-flexcomp>` element for - Added :ref:`mjs_makeFlex`, a new C API function equivalent to the :ref:`flexcomp<body-flexcomp>` element for
programmatically creating flex objects with auto-generated bodies, joints, and equality constraints. Exposed as programmatically creating flex objects with auto-generated bodies, joints, and equality constraints. Exposed as
``body.make_flex()`` in Python. ``body.make_flex()`` in Python.
- Added :ref:`mju_threadpool`, a new function for creating a thread pool on an ``mjData`` instance. When a thread pool - Significantly improved the quality of coarse convex hulls produced by the :ref:`maxhullvert<asset-mesh-maxhullvert>`
is initialized, parts of the simulation pipeline, such as collision detection and constraint solving across islands, attribute by invoking Qhull's `Q9 <http://www.qhull.org/html/qh-optq.htm#Q9>`__ option.
are parallelized. The thread pool is automatically destroyed when the ``mjData`` is freed.
.. admonition:: Breaking API changes .. admonition:: Breaking API changes
:class: attention :class: attention
+2 -1
View File
@@ -1730,8 +1730,9 @@ void mjCMesh::MakeGraph(const double* dvert) {
std::string qhopt = "qhull Qt"; std::string qhopt = "qhull Qt";
if (maxhullvert_ > -1) { if (maxhullvert_ > -1) {
// qhull "Q9" picks the furthest of all furthest points across facets.
// qhull "TA" actually means "number of vertices added after the initial simplex" // qhull "TA" actually means "number of vertices added after the initial simplex"
qhopt += " TA" + std::to_string(maxhullvert_ - 4); qhopt += " Q9 TA" + std::to_string(maxhullvert_ - 4);
} }
// graph not needed for small meshes // graph not needed for small meshes