softbody.html 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]--><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="Asciidoctor 1.5.4"><title>Physics : SoftBody</title><link rel="stylesheet" href="./asciidoctor.css">
  2. <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/css/font-awesome.min.css">
  3. <link rel="stylesheet" href="./coderay-asciidoctor.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/docsearch.js/2/docsearch.min.css"><link rel="stylesheet" href="/home/travis/build/jMonkeyEngine/wiki/build/asciidoc/html5/jme3/advanced/twemoji-awesome.css"></head><body class="article toc2 toc-left"><div id="header"><div id="toolbar"><a href="https://github.com/jMonkeyEngine/wiki/edit/master/src/docs/asciidoc/jme3/advanced/softbody.adoc"><i class="fa fa-pencil-square" aria-hidden="true"></i></a><a href="https://github.com/jMonkeyEngine/wiki/new/master/src/docs/asciidoc/jme3/advanced/"><i class="fa fa-plus-square" aria-hidden="true"></i></a><input dir="auto" style="position: relative; vertical-align: top;" spellcheck="false" autocomplete="off" class="searchbox__input aa-input" id="doc-search" name="search" placeholder="Search in the doc" required="required" type="search"></div><h1>Physics : SoftBody</h1><div class="details"><span class="author" id="author"></span><br><span id="revnumber">version ,</span> <span id="revdate">2016/03/17 20:48</span></div><div id="toc" class="toc2"><div id="toctitle">Table of Contents</div><ul class="sectlevel1"><li><a href="#getting-started">Getting Started</a><ul class="sectlevel2"><li><a href="#how-to">How to :</a></li></ul></li><li><a href="#simple-example">Simple Example</a></li><li><a href="#documentation">Documentation</a><ul class="sectlevel2"><li><a href="#ropes">Ropes</a></li><li><a href="#note">Note</a></li><li><a href="#linearjoint">LinearJoint</a></li><li><a href="#angularjoint">AngularJoint</a></li><li><a href="#linearjoint-2">LinearJoint</a></li><li><a href="#angularjoint-2">AngularJoint</a></li></ul></li></ul></div></div><div id="content"><div id="preamble"><div class="sectionbody"><div class="admonitionblock warning"><table><tr><td class="icon"><i class="fa icon-warning" title="Warning"></i></td><td class="content"><div class="paragraph"><p>Writing in progress, checkout the forum for additional infos <a href="http://hub.jmonkeyengine.org/t/bullet-softbody-in-jme3-1/33110">http://hub.jmonkeyengine.org/t/bullet-softbody-in-jme3-1/33110</a></p></div></td></tr></table></div>
  4. <div class="paragraph"><p>what is a soft body ?</p></div>
  5. <div class="paragraph"><p>how a soft body is simulated ? ( node, link, face ; spring &amp; damper )</p></div>
  6. <div class="paragraph"><p><a href="https://en.wikipedia.org/wiki/Soft_body_dynamics">https://en.wikipedia.org/wiki/Soft_body_dynamics</a></p></div></div></div>
  7. <div class="sect2"><h3 id="getting-started">Getting Started</h3><div class="paragraph"><p>The dynamics libraries for softbody (.so , .dll …) isn&#8217;t (yet) prebuild for your platform so you have to checkout the entire project from GitHub then build the project.</p></div>
  8. <div class="sect2"><h3 id="how-to">How to :</h3><div class="olist arabic"><ol class="arabic"><li><p>checkout the project from <a href="https://github.com/Dokthar/jmonkeyengine/tree/bullet_SoftBody">GitHub</a>.</p></li><li><p>go into the file gradle.propeties and set the line : buildNativeProjecte = true .</p></li><li><p>run the command : ./gradlew build</p></li><li><p>then build the sdk : ant -f ./sdk/ build-zip (or build the sdk installer)</p></li><li><p>create a new project and make sure you use the following libraries : jme3-bullet-native and jme3-bullet (instead of jme3-jBullet)</p></li></ol></div></div></div>
  9. <div class="sect1"><h2 id="simple-example">Simple Example</h2><div class="sectionbody"><div class="listingblock"><div class="content"><pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="type">void</span> simpleInitApp() {
  10. softBodyAppState = <span class="keyword">new</span> BulletSoftBodyAppState();
  11. getStateManager().attach(softBodyAppState);
  12. SoftBodyWorldInfo sbwi = softBodyAppState.getPhysicsSoftSpace().getWorldInfo();
  13. sbwi.setGravity(Vector3f.UNIT_Y.mult(-<span class="float">0.981f</span>));
  14. Geometry bunny = <span class="keyword">new</span> Geometry(<span class="string"><span class="delimiter">&quot;</span><span class="content">b</span><span class="delimiter">&quot;</span></span>, StandfordBunny.getMesh().deepClone());
  15. Material matN = <span class="keyword">new</span> Material(assetManager, <span class="string"><span class="delimiter">&quot;</span><span class="content">Common/MatDefs/Misc/ShowNormals.j3md</span><span class="delimiter">&quot;</span></span>);
  16. bunny.setMaterial(matN);
  17. rootNode.attachChild(bunny);
  18. bunny.addControl(<span class="keyword">new</span> SoftBodyControl(<span class="predefined-constant">false</span>));
  19. PhysicsSoftBody soft = bunny.getControl(SoftBodyControl.class);
  20. soft.generateClusters(<span class="integer">8</span>);
  21. soft.config().setDynamicFrictionCoef(<span class="float">0.8f</span>);
  22. soft.config().setPoseMatchingCoef(<span class="float">0.2f</span>);
  23. soft.config().setCollisionsFlags(PhysicsSoftBody.Config.CL_SS + PhysicsSoftBody.Config.CL_RS);
  24. soft.setPose(<span class="predefined-constant">false</span>, <span class="predefined-constant">true</span>);
  25. soft.setTotalMass(<span class="integer">100</span>, <span class="predefined-constant">true</span>);
  26. soft.randomizeConstraints();
  27. softBodyAppState.getPhysicsSoftSpace().add(soft);
  28. <span class="predefined-type">Box</span> floorMesh = <span class="keyword">new</span> <span class="predefined-type">Box</span>(<span class="float">100f</span>, <span class="float">0.5f</span>, <span class="float">100f</span>);
  29. Geometry floor = <span class="keyword">new</span> Geometry(<span class="string"><span class="delimiter">&quot;</span><span class="content">floor</span><span class="delimiter">&quot;</span></span>, floorMesh);
  30. floor.move(<span class="integer">0</span>, -<span class="float">5f</span>, <span class="integer">0</span>);
  31. floor.addControl(<span class="keyword">new</span> RigidBodyControl(<span class="integer">0</span>));
  32. softBodyAppState.getPhysicsSpace().add(floor);
  33. }</code></pre></div></div></div></div>
  34. <div class="sect2"><h3 id="documentation">Documentation</h3><div class="paragraph"><p>soft mesh / surface</p></div>
  35. <div class="paragraph"><p>Cluster ?</p></div>
  36. <div class="paragraph"><p>(generate) bending constraint ?</p></div>
  37. <div class="paragraph"><p>config collision flag ?</p></div>
  38. <div class="sect2"><h3 id="ropes">Ropes</h3><div class="paragraph"><p>A rope can be created by creating a new SoftBody on a Mesh with Mesh.Mode.Lines.
  39. More informations on creating <a href="../../jme3/advanced/custom_meshes.html">custom meshes</a>.</p></div>
  40. <div class="sect3"><h4 id="example">Example</h4><div class="listingblock"><div class="content"><pre class="CodeRay highlight"><code data-lang="java">Mesh ropeMesh = <span class="keyword">new</span> Mesh();
  41. Vector3f<span class="type">[]</span> vertices = {
  42. <span class="keyword">new</span> Vector3f(<span class="float">0.00f</span>, <span class="integer">0</span>, <span class="integer">0</span>),
  43. <span class="keyword">new</span> Vector3f(<span class="float">0.50f</span>, <span class="integer">0</span>, <span class="integer">0</span>),
  44. <span class="keyword">new</span> Vector3f(<span class="float">1.00f</span>, <span class="integer">0</span>, <span class="integer">0</span>),
  45. <span class="keyword">new</span> Vector3f(<span class="float">1.50f</span>, <span class="integer">0</span>, <span class="integer">0</span>),
  46. <span class="keyword">new</span> Vector3f(<span class="float">2.00f</span>, <span class="integer">0</span>, <span class="integer">0</span>),
  47. <span class="keyword">new</span> Vector3f(<span class="float">2.50f</span>, <span class="integer">0</span>, <span class="integer">0</span>),
  48. <span class="keyword">new</span> Vector3f(<span class="float">3.00f</span>, <span class="integer">0</span>, <span class="integer">0</span>),
  49. <span class="keyword">new</span> Vector3f(<span class="float">3.50f</span>, <span class="integer">0</span>, <span class="integer">0</span>),
  50. <span class="keyword">new</span> Vector3f(<span class="float">4.00f</span>, <span class="integer">0</span>, <span class="integer">0</span>)};
  51. <span class="type">int</span><span class="type">[]</span> indices = {
  52. <span class="integer">0</span>, <span class="integer">1</span>,
  53. <span class="integer">1</span>, <span class="integer">2</span>,
  54. <span class="integer">2</span>, <span class="integer">3</span>,
  55. <span class="integer">3</span>, <span class="integer">4</span>,
  56. <span class="integer">4</span>, <span class="integer">5</span>,
  57. <span class="integer">5</span>, <span class="integer">6</span>,
  58. <span class="integer">6</span>, <span class="integer">7</span>,
  59. <span class="integer">7</span>, <span class="integer">8</span>};
  60. ropeMesh.setBuffer(VertexBuffer.Type.Position, <span class="integer">3</span>, BufferUtils.createFloatBuffer(vertices));
  61. ropeMesh.setBuffer(VertexBuffer.Type.Index, <span class="integer">2</span>, BufferUtils.createIntBuffer(indices));
  62. ropeMesh.setMode(Mesh.Mode.Lines);
  63. ropeMesh.updateBound();</code></pre></div></div>
  64. <div class="paragraph"><p>Once you have a Line Mesh, you can do as follow :</p></div>
  65. <div class="listingblock"><div class="content"><pre class="CodeRay highlight"><code data-lang="java">Geometry t = <span class="keyword">new</span> Geometry(<span class="string"><span class="delimiter">&quot;</span><span class="content">softRope</span><span class="delimiter">&quot;</span></span>, ropeMesh);
  66. t.move(<span class="integer">0</span>, <span class="integer">5</span>, <span class="integer">0</span>);
  67. t.addControl(<span class="keyword">new</span> SoftBodyControl(<span class="predefined-constant">false</span>));</code></pre></div></div></div>
  68. <div class="sect3"><h4 id="anchors">Anchors</h4><div class="paragraph"><p>An Anchors act like a weld between a SoftBody and a RigidBody.
  69. Adding a anchors to a soft body require to specify the SoftBody&#8217;s node and the RigidBody to weld with.</p></div>
  70. <div class="listingblock"><div class="content"><pre class="CodeRay highlight"><code data-lang="java">soft.appendAnchor(nodeId, rigid);</code></pre></div></div></div></div>
  71. <div class="sect2"><h3 id="note">Note</h3><div class="paragraph"><p>An anchor bind a SoftBody&#8217;s node (or Vertex) to a RigidBody, the node will be attached to a RigidBody even if there are space in between.</p></div>
  72. <div class="admonitionblock warning"><table><tr><td class="icon"><i class="fa icon-warning" title="Warning"></i></td><td class="content"><div class="literalblock"><div class="content"><pre>Anchors are not yet Serialized</pre></div></div></td></tr></table></div>
  73. <div class="sect3"><h4 id="example-2">Example</h4><div class="listingblock"><div class="content"><pre class="CodeRay highlight"><code data-lang="java">Geometry t = <span class="keyword">new</span> Geometry(<span class="string"><span class="delimiter">&quot;</span><span class="content">softRope</span><span class="delimiter">&quot;</span></span>, ropeMesh);
  74. <span class="predefined-type">Box</span> box = <span class="keyword">new</span> <span class="predefined-type">Box</span>(<span class="float">1f</span>, <span class="float">1f</span>, <span class="float">1f</span>);
  75. Geometry b = <span class="keyword">new</span> Geometry(<span class="string"><span class="delimiter">&quot;</span><span class="content">rigidBox</span><span class="delimiter">&quot;</span></span>, box);
  76. t.move(<span class="integer">0</span>, <span class="integer">5</span>, <span class="integer">0</span>);
  77. b.move(<span class="float">3f</span>, <span class="integer">5</span>, <span class="integer">0</span>);
  78. t.addControl(<span class="keyword">new</span> SoftBodyControl(<span class="predefined-constant">false</span>));
  79. soft = t.getControl(SoftBodyControl.class);
  80. soft.setMass(<span class="integer">0</span>, <span class="integer">0</span>); <span class="comment">// make the first ndoe static</span>
  81. b.addControl(<span class="keyword">new</span> RigidBodyControl(<span class="integer">1</span>));
  82. rigid = b.getControl(RigidBodyControl.class);
  83. softBodyAppState.getPhysicsSpace().add(rigid);
  84. softBodyAppState.getPhysicsSoftSpace().add(soft);
  85. soft.appendAnchor(<span class="integer">8</span>, rigid); <span class="comment">//where 8 is the last node of the rope</span></code></pre></div></div>
  86. <div class="paragraph"><p>Anchors can be removed as below. Note that you have to keep the node and RigidBody bind with.</p></div>
  87. <div class="listingblock"><div class="content"><pre class="CodeRay highlight"><code data-lang="java">soft.removeAnchor(<span class="integer">8</span>,rigid);</code></pre></div></div></div>
  88. <div class="sect3"><h4 id="joints">Joints</h4><div class="paragraph"><p>Joints require SoftBodies with Clusters ( see generateClusters(int k) ).</p></div>
  89. <div class="admonitionblock warning"><table><tr><td class="icon"><i class="fa icon-warning" title="Warning"></i></td><td class="content"><div class="literalblock"><div class="content"><pre>joint don't use values pivotA &amp; pivotB (not yet)</pre></div></div></td></tr></table></div></div></div>
  90. <div class="sect2"><h3 id="linearjoint">LinearJoint</h3><div class="listingblock"><div class="content"><pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> SoftLinearJoint(Vector3f position, PhysicsSoftBody nodeA, PhysicsRigidBody nodeB, Vector3f pivotA, Vector3f pivotB);
  91. <span class="directive">public</span> SoftLinearJoint(Vector3f position, PhysicsSoftBody nodeA, PhysicsSoftBody nodeB, Vector3f pivotA, Vector3f pivotB);</code></pre></div></div></div>
  92. <div class="sect2"><h3 id="angularjoint">AngularJoint</h3><div class="listingblock"><div class="content"><pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> SoftAngularJoint(Vector3f axis, PhysicsSoftBody nodeA, PhysicsRigidBody nodeB, Vector3f pivotA, Vector3f pivotB);
  93. <span class="directive">public</span> SoftAngularJoint(Vector3f axis, PhysicsSoftBody nodeA, PhysicsSoftBody nodeB, Vector3f pivotA, Vector3f pivotB);</code></pre></div></div>
  94. <div class="sect3"><h4 id="examples">Examples</h4></div></div>
  95. <div class="sect2"><h3 id="linearjoint-2">LinearJoint</h3><div class="listingblock"><div class="content"><pre class="CodeRay highlight"><code data-lang="java"><span class="predefined-type">Box</span> box = <span class="keyword">new</span> <span class="predefined-type">Box</span>(<span class="float">3f</span>, <span class="float">1f</span>, <span class="float">3f</span>);
  96. Geometry b = <span class="keyword">new</span> Geometry(<span class="string"><span class="delimiter">&quot;</span><span class="content">rigidBox</span><span class="delimiter">&quot;</span></span>, box);
  97. b.move(<span class="integer">0</span>, <span class="float">5f</span>, <span class="integer">0</span>);
  98. b.addControl(<span class="keyword">new</span> RigidBodyControl(<span class="integer">1</span>));
  99. rigid = b.getControl(RigidBodyControl.class);
  100. Torus torus = <span class="keyword">new</span> Torus(<span class="integer">20</span>, <span class="integer">10</span>, <span class="float">1f</span>, <span class="float">1.5f</span>);
  101. Geometry t = <span class="keyword">new</span> Geometry(<span class="string"><span class="delimiter">&quot;</span><span class="content">softTorus</span><span class="delimiter">&quot;</span></span>, torus);
  102. t.addControl(<span class="keyword">new</span> SoftBodyControl(<span class="predefined-constant">true</span>, <span class="predefined-constant">false</span>));
  103. soft = t.getControl(SoftBodyControl.class);
  104. soft.generateBendingConstraints(<span class="integer">4</span>, soft.material());
  105. soft.generateClusters(<span class="integer">4</span>);
  106. softBodyAppState.getPhysicsSpace().add(rigid);
  107. softBodyAppState.getPhysicsSoftSpace().add(soft);
  108. joint = <span class="keyword">new</span> SoftLinearJoint(Vector3f.UNIT_X, soft, rigid, <span class="keyword">new</span> Vector3f(<span class="float">0f</span>,<span class="integer">2</span>,<span class="float">0f</span>), <span class="keyword">new</span> Vector3f(<span class="float">0f</span>,-<span class="integer">2</span>,<span class="float">0f</span>));
  109. softBodyAppState.getPhysicsSoftSpace().add(joint);</code></pre></div></div></div>
  110. <div class="sect2"><h3 id="angularjoint-2">AngularJoint</h3><div class="listingblock"><div class="content"><pre class="CodeRay highlight"><code data-lang="java"><span class="predefined-type">Box</span> box = <span class="keyword">new</span> <span class="predefined-type">Box</span>(<span class="float">1f</span>, <span class="float">1f</span>, <span class="float">1f</span>);
  111. Geometry b = <span class="keyword">new</span> Geometry(<span class="string"><span class="delimiter">&quot;</span><span class="content">rigidBox</span><span class="delimiter">&quot;</span></span>, box);
  112. b.move(<span class="integer">0</span>, <span class="float">5f</span>, <span class="integer">0</span>);
  113. b.addControl(<span class="keyword">new</span> RigidBodyControl(<span class="integer">1</span>));
  114. rigid = b.getControl(RigidBodyControl.class);
  115. Torus torus = <span class="keyword">new</span> Torus(<span class="integer">20</span>, <span class="integer">10</span>, <span class="float">1f</span>, <span class="float">1.5f</span>);
  116. Geometry t = <span class="keyword">new</span> Geometry(<span class="string"><span class="delimiter">&quot;</span><span class="content">softTorus</span><span class="delimiter">&quot;</span></span>, torus);
  117. t.addControl(<span class="keyword">new</span> SoftBodyControl(<span class="predefined-constant">true</span>, <span class="predefined-constant">false</span>));
  118. soft = t.getControl(SoftBodyControl.class);
  119. soft.generateBendingConstraints(<span class="integer">4</span>, soft.material());
  120. soft.generateClusters(<span class="integer">4</span>);
  121. softBodyAppState.getPhysicsSpace().add(rigid);
  122. softBodyAppState.getPhysicsSoftSpace().add(soft);
  123. joint = <span class="keyword">new</span> SoftAngularJoint(Vector3f.UNIT_X, soft, rigid, <span class="keyword">new</span> Vector3f(<span class="integer">0</span>,<span class="integer">0</span>,<span class="integer">2</span>), <span class="keyword">new</span> Vector3f(<span class="integer">0</span>, <span class="integer">0</span>, <span class="integer">2</span>));
  124. softBodyAppState.getPhysicsSoftSpace().add(joint);</code></pre></div></div></div></div></div><div id="footer"><div id="footer-text">Version <br>Last updated 2019-12-20 23:30:51 +00:00</div></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/2/docsearch.min.js"></script><script>docsearch({
  125. apiKey: 'a736b6d93de805e26ec2f49b55013fbd',
  126. indexName: 'jmonkeyengine',
  127. inputSelector: '#doc-search',
  128. debug: false // Set debug to true if you want to inspect the dropdown
  129. });</script></body></html>