# How to create a rubber sheet with ball bearings causing indentations

I am new to Blender and I have a very specific image I wish to create to illustrate a new theory of physics.

Specifically:

1) I would like a rubber sheet, where the rubber sheet is held rigid (cannot move) at all edges (perfect would be a circular rubber sheet). Lets say it should 25 x 25 units if square, or 25 units diameter if it is a circle.

2) At every unit intersection (eg 0/0, 0/1, 0/2, 1/0, 1/1, etc) attach a 0.25 unit diameter helium filled ping-pong ball below the rubber sheet, which will cause the rubber sheet to gently stretch upward, like a shallow umbrella.

3) At 3 arbitrary locations (two a couple of units apart and one far away from the other two) attach very heavy 0.25 unit diameter ball-bearings on top of the sheet, which cause the rubber sheet to bend down sharply, but only for a narrow distance. My goal is for the upward curve to be totally overridden between the two close balls, but for the upward curve to rise a above the three balls between the distant ball and the pair of balls.

Can you give me a rough description of how to do this and I will figure out the details. No animation is necessary - just a static image after the balls have distorted the rubber sheet.

Any help would be greatly appreciated. In the meantime I will continue learning blender basics.

[UPDATE]

In response to requests for a draft image, here is what I mean. [You can see by my drawing skills why I need blender :-)]

I have drawn the image looking up from below. You are looking through a transparent rubber sheet with 3 heavy balls "above" pulling it down and many helium balls below gently pushing it upward. The surface is generally raised, like a shallow umbrella, but 3 spots have very heavy ball bearings pulling the rubber umbrella down. The empty circles are helium filled balls under the rubber sheet. The filled circles are the heavy balls which began above the sheet. I have figured out I need to use a cloth sheet made of rubber. I tried putting the rubber sheet and one heavy ball above it in a blender image, but when I ran it, both fell straight down. So, I need to figure out how to anchor the edges of the rubber sheet so it doesn't fall. Then I need to figure out how to add balls that float (have negative gravity?) below the sheet.

Thanks for any help! I am slowly learning blender. Very cool tool!

• Could you please add some reference image of how should this look? It's a little bit hard to actually imagine it without making it. – cgslav Apr 16 '18 at 6:03
• It sounds to me likee this could be done with a cloth simulation. But it would be easier to understand if you add a rough sketch as part of the question. – user1853 Apr 16 '18 at 10:44
• to anchor the cloth, use vertex groups (on the edges of the cloth) and use them as pins. watch youtube.com/watch?v=sqfGdDoGRlo – user1853 Apr 16 '18 at 21:17
• is this for an illustration, animation, 3d printing or what is the final goal? – user1853 Apr 16 '18 at 21:18
• @ScottMilner The theory is Quantum-Geometry Dynamics and a good summary is at quantumgeometrydynamics.com/blog/wp-content/uploads/2016/08/… In the theory, there are space particles with weak negative gravity in a regular grid, and matter/energy particles with strong positive gravity spaced far apart. All particles affect all other particles instantly, so the effect is space is generally upward curved pushing particles apart but locally strongly downward curved near positive particles. Does that answer the question? – MarkBC Apr 18 '18 at 0:23

Though I'm not completely sure I understand exactly what you're trying to illustrate, I believe I've found a solution with Animation Nodes. While Animation Nodes has a bit of a learning curve, it can help you produce very precise, procedural results. I think this will be a better solution than simulation. First, download and install the add-on in the link above.

Once the add-on is installed, create a new Animation Nodes tree in the Node Editor: In Animation nodes, you can add nodes two ways. The first is with Shift + A, which brings up the normal menu. If you are unfamiliar with the nodes, they can be hard to find, so you can search for nodes with Ctrl + A.

First, we need to make a plane to represent space. Add a Grid Mesh node. the $X$ and $Y$ divisions represent the number of vertices, not faces, so we'll need to add $1$ to the dimensions that we want. Let's do $25$ by $25$ units, and $101$ by $101$ divisions. We'll add an Integer node so we can set both Divisions at the same time: In order to view the mesh we are creating, add a Combine Mesh Data node and a Mesh Object Output node: Next, let's add the bearings. In the 3D View, add $3$ Empties. I chose the Single Arrow display type and set the Radius to $5$. In the N panel, lock the Z-axis location. Select the $3$ Empties and press Ctrl + G to group them. Name the group Bearings: Add an Objects from Group node and select the Bearings group. Now, add an Object Controller Falloff node. Set the mix type to Add. Since the bearing's radius is $0.125$, set that as the Offset value. Experiment with the Width value to find something that depicts what you want. I chose $1$. Now, the most important part is the Interpolation. Since gravity has an inverse square falloff, my guess would be that you want the Quadratic option. You can visualize interpolations with the Interpolation Viewer node. You can also create a custom interpolation with the Curve Interpolation node: To apply the falloff, add an Offset Vector node. Enable the list input, and plug in the Vertices list and the Falloff. Set the Z-value of the Offset to however deep you want the ball bearings to go. I chose $5$: Result: Now, let's add the upward curvature. We'll do that with two Directional Falloff and Interpolate Falloff nodes, a Mix Falloffs node, and another Offset Vector node, configured accordingly: Now we have 3 "ball bearings" with a gentle upward curvature. You'll notice I made the upward curvature Quadratic, but that can, of course, be configured differently. This is the bare minimum, but I want to go a little bit further. Let's draw a grid over the top, so that it renders cleaner. We can do this by creating Splines (curves) that follow certain edges. First, lets create a script to select edges. Add an Expression node, and plug in the Edge Indices list from the Grid Mesh node, the Integer node that sets the number of Divisions, and another Integer node. Name them according to the picture below. Use the gear icon to set the output type to Generic List. Paste in the following code:

[x[i*(n-1):(i+1)*(n-1)] for i in range(2*n) if ((i<n) and i%o==0) or i==n or ((i>n) and i%o==1)] This code will isolate every o runs of edges in the grid, so this currently gets every $10$ edges of this $100$ by $100$ grid. To turn these into splines, we need to loop through every run and join them together. Add a Loop Input node and give it a Generic List iterator, a Vector List parameter, and a Spline List output. Add a Convert node to change the Generic input to a Edge Indices List. Then add a Splines from Edges node and a Connect Splines node: Add an Invoke Subprogam node and a Curve Object Output node, configuring settings as shown, and you should have a wireframe.  To make it look a little nicer, crank up the Divisions and adjust the Bevel Depth: ^^^ $501$ divisions, gridline every $10$, Bevel Depth of $0.4$

NodeTree: Gif: Rendered Result (two sets of overlay lines, thick lines every unit, and slim lines every $\frac{1}{4}$ unit): With transparency: Download the .blend (requires Animation Nodes): (Plane divisions turned down to $400$ to fit on Blend-Exchange)

• Beautiful answer Scott. I'm partial to AN but don't have the skills to achieve your answer. But given the question, it may be the best solution and one that I hope speaks the language MarkBC wants. – Bfoot Apr 19 '18 at 1:45
• @Bfoot Thanks! Is there a part of the answer that goes too fast to follow? – Scott Milner Apr 19 '18 at 1:48
• I think your answer is spot on. It's direct and quite clear without any missing 'black boxes'. It does require a decent knowledge of geometry, math and some programming which I may assume MarkBC has more than me. Then it will be only a matter of having fun with learning Animation Nodes. – Bfoot Apr 19 '18 at 2:12

While Soft Body and Cloth will simply react to Rigid Body objects, the opposite is not true - it's quite difficult to get Rigid Body objects to correctly interact with Soft Body/Cloth. There are workarounds (such as that described here (https://blender.stackexchange.com/a/96789/29586)) but getting the interaction to be convincing is difficult and involves a lot of trial and error.

Instead, we can simply animate the falling heavy balls and allow them to displace the fabric. Additionally, rather than using 'floating spheres' for the opposing forces with pinned edges we can use the Soft Body goal over the whole plane to oppose the heavy weights (and disabled gravity) - as the fabric is pressed down, each vertex will attempt to return to its original location, effectively pushing back up again until it reaches its 'rest' position.

So, starting with a subdivided plane, add a Soft Body modifier. Adjust the Goal Strength to adjust how much the fabric should resist deformation - 0.0 = no resistance (no "upthrust"), 1.0 = do not move at all.

Create 3 spheres and add Collision physics to each. Adjust the Inner collision setting if required - but keep it to not more than the radius of the sphere (this sets the collision 'zone' and keeping it less than the radius will prevent overlap of the zones within the mesh; reducing the tendancy for the vertices to 'push through' the mesh). Enable Edge collision in the Soft Body Edges properties - this will slow down the simulation considerably but will reduce the chance of vertices passing through the meshes. For even better collision, enable Face collision - if you have enough time to wait for the simulation to complete!

Animate them moving down through the fabric. This should produce a result similar to the following : Note the Soft Body settings I've used at the right-hand-side of the image. In addition, I decreased the Soft Body Solver Error Limit from 0.1 to 0.01.