{"id":17250127,"url":"https://github.com/stephengold/minie","last_synced_at":"2025-04-04T08:04:23.518Z","repository":{"id":34007174,"uuid":"159544942","full_name":"stephengold/Minie","owner":"stephengold","description":"Integrate Bullet Physics and V-HACD into jMonkeyEngine projects (code has New BSD license)","archived":false,"fork":false,"pushed_at":"2025-03-27T07:52:48.000Z","size":121226,"stargazers_count":124,"open_issues_count":7,"forks_count":22,"subscribers_count":18,"default_branch":"master","last_synced_at":"2025-03-27T08:38:08.583Z","etag":null,"topics":["bullet-physics","collision-detection","collision-shape","game-physics","inverse-kinematics","java","jme3","jmonkeyengine","jmonkeyengine3","jvm-library","open-source","physics-3d","physics-simulation","ragdoll","rigid-bodies","rigid-body-dynamics","soft-bodies","soft-body-simulation","vhacd"],"latest_commit_sha":null,"homepage":"https://stephengold.github.io/Minie/minie/overview.html","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/stephengold.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-11-28T18:12:48.000Z","updated_at":"2025-03-27T07:51:48.000Z","dependencies_parsed_at":"2023-10-15T18:47:54.848Z","dependency_job_id":"22fbbe8d-1f51-42da-a35c-8f8726f88b78","html_url":"https://github.com/stephengold/Minie","commit_stats":{"total_commits":5248,"total_committers":5,"mean_commits":1049.6,"dds":"0.030297256097560954","last_synced_commit":"917969ecf1027cecc7ea8520b21c48ff33477c8c"},"previous_names":[],"tags_count":108,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stephengold%2FMinie","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stephengold%2FMinie/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stephengold%2FMinie/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stephengold%2FMinie/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stephengold","download_url":"https://codeload.github.com/stephengold/Minie/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247142032,"owners_count":20890651,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bullet-physics","collision-detection","collision-shape","game-physics","inverse-kinematics","java","jme3","jmonkeyengine","jmonkeyengine3","jvm-library","open-source","physics-3d","physics-simulation","ragdoll","rigid-bodies","rigid-body-dynamics","soft-bodies","soft-body-simulation","vhacd"],"created_at":"2024-10-15T06:46:16.395Z","updated_at":"2025-04-04T08:04:23.502Z","avatar_url":"https://github.com/stephengold.png","language":"Java","readme":"\u003cimg height=\"150\" src=\"https://i.imgur.com/YEPFEcx.png\" alt=\"Minie Project logo\"\u003e\n\nThe [Minie Project][project] is about improving the integration of\n[Bullet real-time physics simulation][bullet]\nand [Khaled Mamou's V-HACD Library][vhacd] into\n[the jMonkeyEngine (JME) game engine][jme].\n\nIt contains 6 subprojects:\n\n 1. MinieLibrary: the Minie runtime library and its automated tests\n 2. TutorialApps: tutorial apps\n 3. MinieExamples: demos, examples, and non-automated test software\n 4. MinieAssets: generate assets used in MinieExamples\n 5. MinieDump: a command-line utility to dump J3O assets\n 6. Jme3Examples: physics examples from jme3-examples\n\nThe `DacWizard` application, formerly a subproject,\nis now [a separate project at GitHub][dacwizard].\n\nThe `VhacdTuner` application, formerly a subproject,\nis now [a separate project at GitHub][vhacdTuner].\n\nComplete source code (in Java) is provided under\n[a 3-clause BSD license][license].\n\n\n\u003ca name=\"toc\"\u003e\u003c/a\u003e\n\n## Contents of this document\n\n+ [Why use Minie?](#why)\n+ [Downloads](#downloads)\n+ [Conventions](#conventions)\n+ [Overview and design considerations](#overview)\n+ [How to build Minie from source](#build)\n+ [Tutorials](#tutorials)\n+ [An overview of the demo applications](#demos)\n+ [External links](#links)\n+ [History](#history)\n+ [Acknowledgments](#acks)\n\n\n\u003ca name=\"why\"\u003e\u003c/a\u003e\n\n## Why use Minie?\n\n[jMonkeyEngine][jme] comes with `jme3-jbullet`,\nits own Bullet integration library.\nWhy use Minie instead of `jme3-jbullet`?\n\n + Minie has many more features. (See the feature list below.)\n + Minie fixes many bugs found in `jme3-jbullet`.\n + Due to its shorter release cycle, future features and bug fixes\n   will probably appear first in Minie.\n + Minie uses automated testing to reduce the risk of regressions and new bugs.\n + Minie's classes are better encapsulated, with fewer public/protected fields\n   and less aliasing of small objects like vectors.  This reduces the risk\n   of accidentally corrupting its internal data structures.\n + Minie validates method arguments.  This helps detect usage errors that\n   can lead to subtle bugs.\n + Minie's source code is more readable and better documented.\n\nSummary of added features:\n\n + Extensions to `DynamicAnimControl`\n + Soft-body simulation based on `btSoftBody` and `btSoftRigidDynamicsWorld`,\n    including anchors and soft-body joints\n + Multi-body simulation based on `btMultiBody` and `btMultiBodyDynamicsWorld`\n + Convex decomposition of meshes using [Khaled Mamou's V-HACD Library][vhacd],\n   including progress listeners\n + `New6Dof` physics joints based on `btGeneric6DofSpring2Constraint`\n + Alternative contact-and-constraint solvers based on `btDantzigSolver`,\n   `btLemkeSolver`, `btSolveProjectedGaussSeidel`, and `btNNCGConstraintSolver`\n + collision shapes:\n   + `MultiSphere` shapes based on `btMultiSphereShape`\n   + `Box2dShape` shapes based on `btBox2dShape`\n   + `Convex2dShape` shapes based on `btConvex2dShape`\n   + `EmptyShape` shape based on `btEmptyShape`\n + debugging aids:\n    + dump the contents of a `BulletAppState`, `PhysicsSpace`,\n      `CollisionShape`, or `MultiBody`\n    + visualize physics objects in multiple viewports\n    + customize debug material per collision object\n    + visualize the local axes, velocities, bounding boxes, CCD swept spheres,\n      and gravity vectors of collision objects\n    + visualize the children of compound collision shapes\n    + optional high-resolution debug meshes for convex shapes\n    + options to generate debug meshes that include indices,\n      normals (for shading), and/or texture coordinates (for texturing)\n + all joints, shapes, collision objects, and multibodies\n   implement the `JmeCloneable` and `Comparable` interfaces\n + enable/disable a `PhysicsJoint`\n + single-ended physics joints\n + ignore lists for collision objects\n + application-specific data for collision objects\n + access more parameters of rigid bodies, vehicles, characters, joints,\n   collision shapes, contact/constraint solvers, etcetera\n + option to apply scaling with a `RigidBodyControl`\n\nSome jme3-jbullet classes that Minie omits:\n\n + `KinematicRagdollControl`, `HumanoidRagdollPreset`, and `RagdollPreset`:\n   use `DynamicAnimControl` instead\n + `RagdollUtils`: not needed\n\nOther important differences:\n\n + `PhysicsSpace.addAll()` and `PhysicsSpace.removeAll()` add/remove collision\n   objects only; they do not add/remove joints.\n + `RagdollCollisionListener` interface changed and moved\n   from the `com.jme3.bullet.collision` package\n   to the `com.jme3.bullet.animation` package.\n\n[Jump to the table of contents](#toc)\n\n\n\u003ca name=\"downloads\"\u003e\u003c/a\u003e\n\n## Downloads\n\nNewer releases (since v0.5.0) can be downloaded from\n[GitHub](https://github.com/stephengold/Minie/releases).\n\nOlder releases (v0.1.1 through v0.4.5) can be downloaded from\n[the Jme3-utilities Project](https://github.com/stephengold/jme3-utilities/releases).\n\nMaven artifacts since v3.1.0 are available from\n[MavenCentral](https://central.sonatype.com/search?q=Minie\u0026namespace=com.github.stephengold).\n\n[Jump to the table of contents](#toc)\n\n\n\u003ca name=\"conventions\"\u003e\u003c/a\u003e\n\n## Conventions\n\nPackage names begin with `jme3utilities.`\n(if Stephen Gold holds the copyright) or\n`com.jme3.`/`jme3test.` (if the jMonkeyEngine Project holds the copyright).\n\nThe source code and pre-built libraries are compatible with JDK 8.\n\n[Jump to the table of contents](#toc)\n\n\n\u003ca name=\"overview\"\u003e\u003c/a\u003e\n\n## Overview and design considerations\n\n### The role of physics simulation in games\n\nMost computer games don't require detailed physics simulation.\n\n + Canned animations usually suffice to illustrate characters walking,\n   jumping, and fighting.\n + Detecting when a character enters a fixed zone\n   or comes into range of another character is a simple geometric calculation,\n   provided the zone or range has a box or sphere shape.\n + For outer-space games, the equations of motion (Newton's 3rd Law) are easily\n   implemented from scratch.\n\nOther games require physics simulation, either because detailed physics is\nintegral to gameplay (as in bowling or auto racing) or else to enhance the\nverisimilitude of effects such as collapsing buildings and/or people.\nFor such games, a real-time physics library such as Minie should prove useful.\n\n### How Minie works\n\n[How Minie works](https://stephengold.github.io/Minie/minie/implementation.html)\n\n### Computational efficiency\n\nThe computational cost of collision detection grows rapidly with\nthe number of collision objects and the complexity of their shapes.\nTo simulate physics in real time, with modest CPUs,\nit's vital to keep the physics simple:\n\n + Use very simple collision shapes (such as boxes, capsules, and spheres)\n   wherever possible.\n + Minimize the number of collision objects by\n   merging static bodies together and\n   simulating only the most relevant moving bodies.\n + Minimize the number of nodes in each soft body.\n\n### Scaling the world\n\nFor a physics simulation, it might seem natural to choose kilograms and meters\nas the units of mass and distance, respectively.\nHowever, this is not a requirement, and for many games,\nMKS units are not the best choice.\n\nBullet documentation recommends that dynamic bodies have\nmasses as close as possible to 1.\n\nAlso, to improve the performance and reliability of collision detection,\nBullet applies a margin to most collision objects.\nBy default, this margin is 0.04 physics-space units (psu).\nWhile the margin is configurable, Bullet documentation\nrecommends against doing so.\nFor some collision shapes, margin increases the effective size of the object\nand distorts its effective shape.\nFor this reason, it's undesirable to have a collision object\nwith any radius smaller than about 0.2 psu.\n\nDynamic bodies in forced contact tend to jiggle.\nJiggling is mostly noticeable for sharp-edged bodies (such as boxes)\nresting on uneven surfaces, under high gravity.\nThe higher the gravity (in psu per second squared),\nthe shorter the time step (in seconds) needs to be.\nFor efficient and realistic simulation of Earth-like gravity (9.8 m/s^2)\nwith the default margin (0.04 psu) and time step (0.0167 seconds),\nthe psu should be 0.3 meters or larger.\nThis puts a soft lower limit on the dimensions (in psu) of dynamic bodies.\n\nSince Minie's debug visualization assumes that physics coordinates are\nequivalent to world coordinates, these recommendations could impact\nmodel creation and scene-graph design.\nPhysics units should therefore be chosen with care,\npreferably early in the development process.\n\n[Jump to the table of contents](#toc)\n\n\n\u003ca name=\"build\"\u003e\u003c/a\u003e\n\n## How to build Minie from source\n\n[How to build Minie from source](https://stephengold.github.io/Minie/minie/build.html)\n\n[Jump to the table of contents](#toc)\n\n\u003ca name=\"tutorials\"\u003e\u003c/a\u003e\n\u003ca name=\"add\"\u003e\u003c/a\u003e\n\u003ca name=\"rigidbody\"\u003e\u003c/a\u003e\n\u003ca name=\"shape\"\u003e\u003c/a\u003e\n\u003ca name=\"debugging\"\u003e\u003c/a\u003e\n\u003ca name=\"new6dof\"\u003e\u003c/a\u003e\n\u003ca name=\"dac\"\u003e\u003c/a\u003e\n\u003ca name=\"detect\"\u003e\u003c/a\u003e\n\u003ca name=\"softbody\"\u003e\u003c/a\u003e\n\n## Tutorials\n\n + [How to add Minie to an existing project](https://stephengold.github.io/Minie/minie/minie-library-tutorials/add.html)\n + [An introduction to rigid-body physics](https://stephengold.github.io/Minie/minie/minie-library-tutorials/rigidbody.html)\n + [Choosing collision shapes](https://stephengold.github.io/Minie/minie/minie-library-tutorials/shape.html)\n + [Debugging physics issues](https://stephengold.github.io/Minie/minie/minie-library-tutorials/debug.html)\n + [An introduction to New6Dof](https://stephengold.github.io/Minie/minie/minie-library-tutorials/new6dof.html)\n + [An introduction to DynamicAnimControl](https://stephengold.github.io/Minie/minie/minie-library-tutorials/dac.html)\n + [Collision detection](https://stephengold.github.io/Minie/minie/minie-library-tutorials/collision.html)\n + [An introduction to soft-body physics](https://stephengold.github.io/Minie/minie/minie-library-tutorials/softbody.html)\n\n[Jump to the table of contents](#toc)\n\n\n\u003ca name=\"demos\"\u003e\u003c/a\u003e\n\n## An overview of the demo applications\n\n[An overview of the demo applications](https://stephengold.github.io/Minie/minie/demos.html)\n\n[Jump to the table of contents](#toc)\n\n\n\u003ca name=\"links\"\u003e\u003c/a\u003e\n\n## External links\n\n+ [the Minie Physics Library page](https://library.jmonkeyengine.org/#!entry=11511%2F38308161-c3cf-4e23-8754-528ca8387c11)\n  in [the JmonkeyEngine Library][library]\n+ [The Bullet Physics SDK Manual (2015)](https://github.com/bulletphysics/bullet3/blob/master/docs/Bullet_User_Manual.pdf)\n+ [The physics section of the jMonkeyEngine Wiki (2020)](https://wiki.jmonkeyengine.org/docs/3.4/physics/physics.html)\n+ [Alan Chou's game-physics tutorial (2013)](http://allenchou.net/game-physics-series/)\n+ [V-HACD v4 slideshow (2022)](https://docs.google.com/presentation/d/1OZ4mtZYrGEC8qffqb8F7Le2xzufiqvaPpRbLHKKgTIM)\n\nYouTube videos about Minie:\n\n  + September 2022 teaser (splitting rigid bodies in real time)\n    [watch](https://www.youtube.com/watch?v=9IsCSgoKJeE) (0:53)\n    [source code](https://github.com/stephengold/Minie/blob/fd0a61d2d24f354e0a9418cfc904c5985b69cfd8/MinieExamples/src/main/java/jme3utilities/minie/test/SplitDemo.java)\n  + August 2022 walkthru of the VhacdTuner application\n    [watch](https://www.youtube.com/watch?v=iEWJtPujmM8) (7:45)\n    [source code](https://github.com/stephengold/Minie/blob/e1b7781fd06d8060ab96928379509a732fd9398f/VhacdTuner/src/main/java/jme3utilities/minie/tuner/VhacdTuner.java)\n  + June 2019 teaser #2 (rubber duck)\n    [watch](https://www.youtube.com/watch?v=GKc-_SqcpZo) (0:16)\n    [source code](https://github.com/stephengold/Minie/blob/d0326f636dbed76c809cb8ec654bfaf94786e988/MinieExamples/src/main/java/jme3utilities/minie/test/TestSoftBodyControl.java)\n  + June 2019 teaser #1 (jogger in skirt)\n    [watch](https://www.youtube.com/watch?v=lLMBIASzAAM) (0:24)\n    [source code](https://github.com/stephengold/Minie/blob/40add685ec9243c3fa1e10f8b38b805a04a32863/MinieExamples/src/main/java/jme3utilities/minie/test/TestSoftBody.java)\n  + May 2019 teaser #3 (wind-blown flag)\n    [watch](https://www.youtube.com/watch?v=7dcBr0j6sKw) (0:06)\n    [source code](https://github.com/stephengold/Minie/blob/9fb33ce21c5082af36ce2969daa79d63b57c0641/MinieExamples/src/main/java/jme3utilities/minie/test/TestSoftBody.java)\n  + May 2019 teaser #2 (squishy ball and tablecloth)\n    [watch](https://www.youtube.com/watch?v=-ECGEe4CpcY) (0:12)\n    [source code](https://github.com/stephengold/Minie/blob/fe55f9baf83158d6347f765b4ff6bbf892056919/MinieExamples/src/main/java/jme3utilities/minie/test/TestSoftBody.java)\n  + May 2019 teaser #1 (squishy ball)\n    [watch](https://www.youtube.com/watch?v=W3x4gdDn-Ko) (0:13)\n    [source code](https://github.com/stephengold/Minie/blob/b1a83f8a6440d8374f09258c6b1d471279833cfa/MinieExamples/src/main/java/jme3utilities/minie/test/TestSoftBody.java)\n  + April 2019 walkthru of the DacWizard application\n    [watch](https://www.youtube.com/watch?v=iWyrzZe45jA) (8:12)\n    [source code](https://github.com/stephengold/Minie/blob/master/DacWizard/src/main/java/jme3utilities/minie/wizard/DacWizard.java)\n  + March 2019 short demo (IK for head/eye directions)\n    [watch](https://www.youtube.com/watch?v=8zquudx3A1A) (1:25)\n    [source code](https://github.com/stephengold/Minie/blob/master/MinieExamples/src/main/java/jme3utilities/minie/test/WatchDemo.java)\n  + March 2019 teaser (buoyancy)\n    [watch](https://www.youtube.com/watch?v=eq09m7pbk5A) (0:10)\n    [source code](https://github.com/stephengold/Minie/blob/master/MinieExamples/src/main/java/jme3utilities/minie/test/BuoyDemo.java)\n  + February 2019 demo (ropes)\n    [watch](https://www.youtube.com/watch?v=7PYDAyB5RCE) (4:47)\n    [source code](https://github.com/stephengold/Minie/blob/master/MinieExamples/src/main/java/jme3utilities/minie/test/RopeDemo.java)\n  + December 2018 demo (inverse kinematics)\n    [watch](https://www.youtube.com/watch?v=ZGqN9ZCCu-8) (6:27)\n    [source code](https://github.com/stephengold/Minie/blob/master/MinieExamples/src/main/java/jme3utilities/minie/test/BalanceDemo.java)\n  + December 2018 teaser (inverse kinematics)\n    [watch](https://www.youtube.com/watch?v=fTWQ9m47GIA) (0:51)\n  + November 2018 demo (single-ended joints)\n    [watch](https://www.youtube.com/watch?v=Mh9k5AfWzbg) (5:50)\n    [source code](https://github.com/stephengold/Minie/blob/master/MinieExamples/src/main/java/jme3utilities/minie/test/SeJointDemo.java)\n  + November 2018 demo (`MultiSphere` shape)\n    [watch](https://www.youtube.com/watch?v=OS2zjB01c6E) (0:13)\n    [source code](https://github.com/stephengold/Minie/blob/master/MinieExamples/src/main/java/jme3utilities/minie/test/MultiSphereDemo.java)\n  + October 2018 demo (`DynamicAnimControl` ragdolls)\n    [watch](https://www.youtube.com/watch?v=A1Rii99nb3Q) (2:49)\n    [source code](https://github.com/stephengold/Minie/blob/master/MinieExamples/src/main/java/jme3utilities/minie/test/TestDac.java)\n\n[Jump to the table of contents](#toc)\n\n\n\u003ca name=\"history\"\u003e\u003c/a\u003e\n\n## History\n\nThe evolution of this project is chronicled in\n[its release log][log].\n\nMost of Minie was originally forked from `jme3-bullet`,\na library in the [jMonkeyEngine Game Engine][jme].\n\nFrom January to November 2018, Minie was a subproject of\n[the Jme3-utilities Project][utilities].\n\nSince November 2018, Minie has been a separate project, hosted at\n[GitHub][minie].\n\n[Jump to the table of contents](#toc)\n\n\n\u003ca name=\"acks\"\u003e\u003c/a\u003e\n\n## Acknowledgments\n\nLike most projects, the Minie Project builds on the work of many who\nhave gone before.  I therefore acknowledge the following\nartists and software developers:\n\n+ Normen Hansen (aka \"normen\") for creating most of the `jme3-bullet` library\n  (on which Minie is based) and also for helpful insights\n+ Rémy Bouquet (aka \"nehon\") for co-creating\n  `KinematicRagdollControl` (on which `DynamicAnimControl` is based),\n  for creating the Jaime model, and also for many helpful insights\n+ Jules (aka \"dokthar\") for creating [the soft-body fork of jMonkeyEngine][dokthar]\n  from which Minie's soft-body support is derived\n+ Khaled Mamou for creating and licensing the [V-HACD Library][vhacd]\n  for decomposing meshes into convex hulls\n+ Riccardo Balbo (aka \"riccardo\") for creating and licensing\n  the [V-HACD Java Bindings Project][vhacdBindings]\n+ \"ndebruyn\" for early testing of Minie on Android platforms\n+ Pavly Gerges (aka \"Pavl_G\") for testing Minie on Raspberry Pi\n+ Adam T. Ryder (aka \"tryder\") for creating and licensing\n  the [jME-TTF] rendering system\n+ [Paul Speed (aka \"pspeed42\")][pspeed], for creating the [SimMath library][simmath]\n+ \"oxplay2\", for reporting a `PhysicsRigidBody` bug and helping me pin it down\n+ \"duncanj\", for pull request #15\n+ \"qwq\", for suggesting changes to how rigid-body contacts are managed\n  and for authoring the `ConveyorDemo` application\n+ [Nathan Vegdahl][vegdahl], for creating the Puppet model\n+ Tobias Jung, for distributing [ProFont]\n+ plus the creators of (and contributors to) the following software:\n    + the [Antora] static website generator\n    + the [Blender] 3-D animation suite\n    + the [Bullet] real-time physics library\n    + the [Checkstyle] tool\n    + the [FindBugs] source-code analyzer\n    + the [Firefox] and [Google Chrome][chrome] web browsers\n    + the [Git] revision-control system and GitK commit viewer\n    + the [GitKraken] client\n    + the [GNU Project Debugger][gdb]\n    + the [Gradle] build tool\n    + the [IntelliJ IDEA][idea] and [NetBeans] integrated development environments\n    + the [Java] compiler, standard doclet, and runtime environment\n    + [jMonkeyEngine][jme] and the jME3 Software Development Kit\n    + the [Linux Mint][mint] operating system\n    + LWJGL, the Lightweight Java Game Library\n    + the [MakeHuman] 3-D character creation tool\n    + the [Markdown] document-conversion tool\n    + the [Meld] visual merge tool\n    + Microsoft Windows\n    + the [Nifty] graphical user-interface library\n    + [Open Broadcaster Software Studio][obs]\n    + the PMD source-code analyzer\n    + [ProFont], the programmers' font\n    + the [WinMerge] differencing and merging tool\n\nI am grateful to [GitHub], [Sonatype], [JFrog],\n[Travis], [MacStadium], [YouTube], and [Imgur]\nfor providing free hosting for this project\nand many other open-source projects.\n\nI'm also grateful to my dear Holly, for keeping me sane.\n\nIf I've misattributed anything or left anyone out, please let me know, so I can\ncorrect the situation: sgold@sonic.net\n\n[Jump to the table of contents](#toc)\n\n\n[antora]: https://antora.org/ \"Antora Project\"\n[blender]: https://docs.blender.org \"Blender Project\"\n[bullet]: https://pybullet.org/wordpress \"Bullet Real-Time Physics Simulation\"\n[checkstyle]: https://checkstyle.org \"Checkstyle\"\n[chrome]: https://www.google.com/chrome \"Chrome\"\n[dacwizard]: https://github.com/stephengold/DacWizard \"DacWizard Project\"\n[dokthar]: https://github.com/dokthar/jmonkeyengine \"Dokthar's fork of JMonkeyEngine\"\n[elements]: https://www.adobe.com/products/photoshop-elements.html \"Photoshop Elements\"\n[findbugs]: http://findbugs.sourceforge.net \"FindBugs Project\"\n[firefox]: https://www.mozilla.org/en-US/firefox \"Firefox\"\n[gdb]: https://www.gnu.org/software/gdb/ \"GNU Project Debugger\"\n[git]: https://git-scm.com \"Git\"\n[github]: https://github.com \"GitHub\"\n[gitkraken]: https://www.gitkraken.com \"GitKraken client\"\n[gradle]: https://gradle.org \"Gradle Project\"\n[heart]: https://github.com/stephengold/Heart \"Heart Project\"\n[idea]: https://www.jetbrains.com/idea/ \"IntelliJ IDEA\"\n[imgur]: https://imgur.com/ \"Imgur\"\n[java]: https://en.wikipedia.org/wiki/Java_(programming_language) \"Java programming language\"\n[jfrog]: https://www.jfrog.com \"JFrog\"\n[jme]: https://jmonkeyengine.org \"jMonkeyEngine Project\"\n[jme-ttf]: https://1337atr.weebly.com/jttf.html \"jME-TTF Rendering System\"\n[library]: https://library.jmonkeyengine.org \"jMonkeyEngine Library\"\n[license]: https://github.com/stephengold/Minie/blob/master/LICENSE \"Minie license\"\n[log]: https://github.com/stephengold/Minie/blob/master/MinieLibrary/release-notes.md \"release log\"\n[macstadium]: https://www.macstadium.com/ \"MacStadium\"\n[makehuman]: http://www.makehumancommunity.org/ \"MakeHuman Community\"\n[manual]: https://github.com/bulletphysics/bullet3/blob/master/docs/Bullet_User_Manual.pdf \"Bullet User Manual\"\n[markdown]: https://daringfireball.net/projects/markdown \"Markdown Project\"\n[meld]: https://meldmerge.org \"Meld merge tool\"\n[minie]: https://stephengold.github.io/Minie/minie/overview.html \"Minie Project\"\n[mint]: https://linuxmint.com \"Linux Mint Project\"\n[netbeans]: https://netbeans.org \"NetBeans Project\"\n[nifty]: https://nifty-gui.github.io/nifty-gui \"Nifty GUI Project\"\n[obs]: https://obsproject.com \"Open Broadcaster Software Project\"\n[profont]: https://tobiasjung.name/profont \"ProFont Project\"\n[project]: https://stephengold.github.io/Minie \"Minie Project\"\n[simmath]: https://github.com/Simsilica/SimMath \"SimMath Library\"\n[sonatype]: https://www.sonatype.com \"Sonatype\"\n[travis]: https://travis-ci.com \"Travis CI\"\n[utilities]: https://github.com/stephengold/jme3-utilities \"Jme3-utilities Project\"\n[vegdahl]: https://www.cessen.com \"Nathan Vegdahl\"\n[vhacd]: https://github.com/kmammou/v-hacd \"V-HACD Library\"\n[vhacdBindings]: https://github.com/riccardobl/v-hacd-java-bindings \"Riccardo's V-hacd-java-bindings Project\"\n[vhacdTuner]: https://github.com/stephengold/VhacdTuner \"VhacdTuner Project\"\n[wes]: https://github.com/stephengold/Wes \"Wes Project\"\n[winmerge]: https://winmerge.org \"WinMerge Project\"\n[youtube]: https://www.youtube.com/ \"YouTube\"\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstephengold%2Fminie","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstephengold%2Fminie","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstephengold%2Fminie/lists"}