Giter VIP home page Giter VIP logo

position-based-dynamics's Introduction

Position-Based-Dynamics

Position based dynamics is a method used to simulate physical phenomena like cloth, deformation, fluids, fractures, rigidness and much more. Most of the core math comes from this C++/OpenGL project over at GitHub.

The key process in PBD is to simulate the object as a set of points and constraints. Forces are applied to the points to move them and then the constraints make sure the points wont move in a way that violates the simulation.

I have included the code for cloth, deformable, fluid and rigid constraints but the GitHub project also contains some rope/chain constraints as well as a large variety of ball joint and hinges constraints.

All the code runs on the CPU so performance will be poor especially for the more demanding constraints like fluids. This project is more a example of how the math and code works rather than anything practical and the graphics are just line renderings or spheres.

PBD is also the method used for Nivida's Flex but that runs on the GPU.

Below is the PBD cloth scene. The points in the green bounds are static so the cloth will hang from those points.

PBDCloth

Below is a PBD rigid body. Each point moves independently but the shape matching constraint will make sure the objects shape is still retained.

PBDRigid

Below is a PBD deformable object. Its is made of tetrahedrons and bends. The points in the green bounds are static like in the cloth scene.

PBDDeformable

Below is PBD fluid. The spheres represent the fluids particles and they will flow together like in a fluid. You can see them forming a wave. Given enough particles it will look like water but its quite demanding to do on a single thread on the CPU so you will have to make do with a limited amount of particles.

PBDFluid

List of physics projects

Position-Based-Dynamics
PBD-Fluid-in-Unity
GPU-GEMS-NBody-Simulation
GPU-GEMS-2D-Fluid-Simulation
GPU-GEMS-3D-Fluid-Simulation
CyclonePhysicsEngine
2D-Deformable-body-in-Unity

position-based-dynamics's People

Contributors

scrawk avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

position-based-dynamics's Issues

Question About The Distance Constraint

It seems that the distance constraint function is different from the one from C++ version.
In your code:

double invMass = 1.0 / mass;
double sum = mass * 2.0;
corr = CompressionStiffness * n * (d - RestLength) * sum;
Body.Predicted[i0] += invMass * corr * di;

But in the C++ version:

Real wSum = invMass0 + invMass1;
corr = compressionStiffness * n * (d - restLength) / wSum;
corr0 =  invMass0 * corr;

The results are different even though I assume mass0 equals to mass1.
Is it a bug or something else?

And I also wonder what's the theory of your bending constraint? The C++'s bending constraint is different too.

Finally, thanks for your contribution in PBD's unity version which helps me a lot!

question about the ShapeMatchingConstraint3d

double wsum = 0.0;
int numParticles = Body.NumParticles;

for (int i = 0; i < numParticles; i++)
{
     RestCm += Body.Positions[i] * mass;
     wsum += mass;
}

RestCm /= wsum;

Is the result of RestCm equal to the sum of body positions?

int numParticles = Body.NumParticles;
double wsum = mass * numParticles;
for (int i = 0; i < numParticles; i++)
{
     RestCm += Body.Positions[i];
}

Question about collision

Do we have self collision for cloth included in this project? if so please do tell me which script is it in? thanks in advance.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.