Convex decomposition for generating stable and exact collision shapes
When running physical simulations in blender, the choice of the correct collision shapes is crucial to achieve stable results.
While using the CONVEX_HULL
collision shape results in very stable simulations, the result might look very implausible for non-convex objects (e.q. objects floating).
The MESH
collision shape allows for more exact collisions, however the simulation also gets very unstable and objects can glitch through each other.
CONVEX_DECOMPOSITION
is a compromise between both:
The V-HACD algorithm is used to decompose a given non-convex object into multiple approximate convex parts.
The union of these parts can then be used as an exact and stable collision shape for the object.
In this example we load a bin and some highly non-convex shapenet objects, apply convex decomposition to generate collision shapes and then let the objects drop into the bin.
Usage
Execute in the BlenderProc main directory:
blenderproc run examples/advanced/physics_convex_decomposition/main.py examples/advanced/physics_convex_decomposition/bin.obj <PATH_TO_ShapeNetCore.v2> examples/advanced/physics_convex_decomposition/output
examples/advanced/physics_convex_decomposition/main.py
: path to the main python file to run.examples/advanced/physics_convex_decomposition/bin.obj
: path to the object file containing the bin<PATH_TO_ShapeNetCore.v2>: path to the downloaded shape net core v2 dataset, get it [here](http://www.shapenet.org/)
examples/advanced/physics_convex_decomposition/output
: path to the output directory.
Visualization
Visualize the generated data:
blenderproc vis hdf5 examples/advanced/physics_convex_decomposition/output/0.hdf5
Implementation
# Make the bin object passively participate in the physics simulation
bin_obj.enable_rigidbody(active=False, collision_shape="COMPOUND")
# Let its collision shape be a convex decomposition of its original mesh
# This will make the simulation more stable, while still having accurate collision detection
bin_obj.build_convex_decomposition_collision_shape(args.vhacd_path)
The collision shape of the original object is set to
COMPOUND
and will therefore consist of the UNION of their children’s collision shapesV-HACD is called to do the actual convex decomposition (this may take a while)
The approximate convex parts are placed as children to the original objects in the scene graph
The convex parts are hidden during rendering and are provided with
CONVEX_HULL
collision shapesThe result of the convex decomposition of each object is cached in
resources/decomposition_cache
(key is a hash based on the object’s local vertex coordinates). Therefore, running the example a second time will be a lot faster.