SimKit : A Simulation Toolkit for Computer Animation
This library should be considered a toolbox for the development of physically-based animation research. It is designed to be modular, easy to use, and easy to extend. In particular, it is designed to be emphasize fast creative and experimental prototyping.
Installation
Clone the repository:
git clone --recursive https://github.com/otmanon/simkit.git
Installation is recommended on a fresh conda environment:
cd simkit
conda create -n simkit python=3.11
conda activate simkit
pip install -e .
Optional Dependencies
The base install only requires numpy and scipy -- and now covers the
clustering / sampling helpers (farthest_point_sampling, spectral_clustering,
spectral_cubature) too. Heavier or specialized dependencies are exposed as
named extras so you only install what you need. Importing simkit is always
safe -- functionality whose extras are missing just isn't exported, and a
one-line warning tells you exactly what to install.
| Extra | Adds | Enables |
|---|---|---|
mesh |
libigl |
2D Triangle meshing (shape_outlines) |
viz |
matplotlib, polyscope |
simkit.matplotlib, simkit.polyscope plotters |
solvers |
cvxopt |
Sparse eigensolvers (simkit.eigs) |
video |
Pillow |
simkit.filesystem image / video frame helpers |
cmaes |
cma |
simkit.solvers.CMAESSolver |
all |
union of the above | Everything end-user-facing |
dev |
pytest, pytest-cov |
Running the test suite |
docs |
sphinx, sphinx-autoapi, pydata-sphinx-theme, ... |
Building the documentation |
Install one or more extras with the usual pip syntax:
pip install -e ".[mesh]" # just mesh ops
pip install -e ".[mesh,viz]" # multiple extras
pip install -e ".[all]" # everything end-user-facing
pip install -e ".[all,dev,docs]" # everything, including dev tooling
Running Examples
The repository includes several end-to-end demos under examples/, each
reproducing a slice of a published paper:
fast_complementary_dynamics/-- Fast Complementary Dynamics via Skinning Eigenmodes (SIGGRAPH 2023).modal_muscles/-- CMA-ES-optimised modal-actuator locomotion.subspace_mfem/-- Subspace Mixed FEM elastodynamics (SIGGRAPH Asia 2023), including an interactive demo.interactive_demos/-- 15 short polyscope demos, from a single deformation gradient up to interactive 3D mixed FEM.
Force-dual / linear modal-analysis subspaces are not on main yet; they live on the
force_dual_modes
branch.
Each demo has its own README with the exact extras to install and the command
to run. See examples/README.md for the index. As a
quick start:
pip install -e ".[mesh,viz,video]"
python examples/subspace_mfem/drop_fem_vs_mfem.py
Running tests
pip install -e ".[dev]"
pytest
Building the documentation
The docs are generated from the docstrings in the simkit package using
Sphinx + sphinx-autoapi + the PyData theme. To build them locally:
pip install -e ".[docs]"
sphinx-build -b html docs docs/_build/html
Then open docs/_build/html/index.html in your browser. Every function in
simkit/ is automatically picked up and rendered into the API reference --
just write a good docstring and rebuild.
Release / dev workflow
Two equivalent ways to do every build/test/release/docs task. Pick whichever you prefer.
scripts/COMMANDS.md— raw, copy/paste-able bash commands organized by task. Read it top-to-bottom or grab whichever block you need. No abstraction, no functions, just shell commands.scripts/release.sh— the same commands wrapped as subcommands so you can run e.g../scripts/release.sh buildinstead of pasting. There's also aMakefilewithmake build/make docs/ etc. targets.
First-time setup on a new machine:
chmod +x scripts/release.sh
conda activate simkit # so `python` points at the right interpreter
Quick reference for the script form:
| What | Command |
|---|---|
| Build sdist + wheel | ./scripts/release.sh build (or make build) |
| Upload to TestPyPI | ./scripts/release.sh upload-test |
| Install from TestPyPI in a throwaway venv | ./scripts/release.sh test-install |
| Upload to real PyPI | ./scripts/release.sh upload-prod |
| Build the docs | ./scripts/release.sh docs |
| Build + open the docs | ./scripts/release.sh docs-open |
| Remove all build/docs/cache junk | ./scripts/release.sh clean |
Local upload vs GitHub Actions Trusted Publishing
The script has the full tradeoff in a header comment. Summarized:
- Local (
upload-test/upload-prod): fastest path, but requires a PyPI API token on your laptop and the build runs in your local environment. Best for the very first upload (claiming the project name) or one-off hotfixes. - GitHub Actions (
.github/workflows/release.yml, triggered by pushing avX.Y.Zgit tag): no secrets stored anywhere thanks to Trusted Publishing; every release is a reproducible build from a tagged commit; auto-publishes to TestPyPI first, then PyPI. Best for every release after the first.
Recommended flow: claim the project on PyPI/TestPyPI with one local upload, then switch to tag-triggered GitHub Actions for everything afterward:
git tag v0.1.1
git push --tags
Metadata
Release files for simkit 0.1.8
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| simkit-0.1.8.tar.gz | 214.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| simkit-0.1.8-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 410.0 kB
Release files / simkit-0.1.8.tar.gz
| Download URL | simkit-0.1.8.tar.gz |
|---|---|
| Size | 214.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
cc41ee7026e132d564a39319e0d66469af249dca19703036514a17f17ac5f4bb
|
|
BLAKE2b-256 checksum How to use checksums |
60effffedf3e35e63801c522a72fa1618e9f77fa00d87d280b1fa953fd75efa8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 24, 2026.
Transparency logRelease files / simkit-0.1.8-py3-none-any.whl
| Download URL | simkit-0.1.8-py3-none-any.whl |
|---|---|
| Size | 195.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f5a7758a91a7975ef21f1de17ae4ef4d003b1bfb51d56bcdbc1af4bd54595da9
|
|
BLAKE2b-256 checksum How to use checksums |
4aaba47ccf2277af9e59111f226dd53ad01c533181b50ff5090e876c23065d75
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 24, 2026.
Transparency log