---
kind: concept
slug: material-point-method
title: Material point method
summary: >-
  A hybrid particle-grid method for simulating deformable materials: particles carry mass and deformation, a background grid solves the momentum update each sub-step. Used to make static 3D Gaussian objects move under forces, with an elastic material model. Only one card covers it so far; it fits Young's modulus from a generated video and costs about a minute per second of video on one V100.
tags: [physics-simulation, material-estimation, 3d-gaussians]
papers: ["2404.13026"]
related: [gaussian-splatting, differentiable-simulation, diffusion-models]
status: draft
updated_at: 2026-10-19
---

## Overview

The material point method (MPM) simulates a deformable body with two sets of
carriers. Particles hold mass, volume, position, velocity, a deformation
gradient and a velocity gradient. A background grid is used only to solve the
momentum update. Each sub-step scatters particle mass and momentum to the grid,
turns grid momentum into grid velocity, gathers that velocity back to the
particles, and then updates each particle's deformation and position [arxiv:2404.13026
§4.1].

The material enters through the stress. The paper uses a fixed corotated
hyperelastic model, and its Lamé parameters come from Young's modulus $E$ and
Poisson's ratio $\nu$ [arxiv:2404.13026 §4.1]. In the paper the particles are
the Gaussians of a 3D Gaussian Splatting reconstruction [arxiv:2404.13026 §5.2].
The only shared invariant across the uses found so far is that the object is
elastic and that collisions are excluded [arxiv:2404.13026 §6].

## Variants

Only one card covers this concept. The variants below are the ones that paper
describes, plus one it compares against and that is not carded here.

### Elastic MPM with a fitted Young's modulus field

Young's modulus is a per-particle field, represented by a triplane with a
three-layer MLP. An initial velocity field is represented the same way, with
its own triplane [arxiv:2404.13026 §4.2] [arxiv:2404.13026 §5.2]. The reference
is a clip generated from one still image of the object. The fit runs in two
stages: first the velocity on the first three frames with random, frozen
stiffness, then the stiffness with the velocity frozen [arxiv:2404.13026 §4.2].
The loss compares rendered frames with the reference, combining L1 and D-SSIM
terms, plus a total-variation penalty on the triplanes [arxiv:2404.13026 §4.2].
Card: [PhysDreamer](/papers/2404.13026).

### Driving-particle subsampling for Gaussian scenes

A full scene has 0.5 to 1.5 million Gaussians, of which 50 to 300 thousand
belong to the foreground object [arxiv:2404.13026 §5.2]. The paper runs the
physics only on K-Means driving particles, 10 to 50 times fewer than the
Gaussians, each Gaussian having 8 nearest driving particles [arxiv:2404.13026
§4.3]. For each Gaussian, a rigid transform fitted to those neighbours moves its
position and rotation [arxiv:2404.13026 §4.3] [arxiv:2404.13026 alg. 1]. This is
an accelerated form of the same MPM core, not a different material model.

### Hand-set material MPM on Gaussians

PhysGaussian runs MPM on 3D Gaussians, but its material values are set by hand.
The PhysDreamer paper uses this as its main baseline [arxiv:2404.13026 §5.1].
Its content is not used on this page. Read it at
[arXiv:2311.12198](https://arxiv.org/abs/2311.12198).

## When to use which

The comparisons below are author-reported. They rest on 2AFC judgements of
perceived realism, not on measured material properties [arxiv:2404.13026 §5.1].

| Situation | Use | Why |
|---|---|---|
| A reference video of the object moving, no measured material data | Elastic MPM with a fitted $E$ field | Preferred over PhysGaussian on motion realism in 80.8% of 2AFC judgements, and over DreamGaussian4D in 63.5% [arxiv:2404.13026 tab. 1] [arxiv:2404.13026 §5.3] |
| Material values known or set by hand, no reference motion | Hand-set MPM | No fitting step is needed. The paper's criticism of this route is that its values must be set by hand [arxiv:2404.13026 §5.1] |
| Two or more views of the object are available | Add a second view to the fit | Two-view supervision is preferred in 81.0% (visual quality) and 86.0% (motion realism) of user samples. These numbers appear only in the text [arxiv:2404.13026 §5.4] |
| Large scene or many frames | Subsampling, and budget for the cost | Even with subsampling the method takes about one minute on a V100 per second of video, and the paper calls it computationally demanding [arxiv:2404.13026 §6] |
| Collisions, or non-elastic materials | Out of scope for this method | The paper restricts its scope to elastic objects without collisions [arxiv:2404.13026 §6] |
| Object not yet cut from its background | Segment first | The paper segments the background and keeps only foreground particles [arxiv:2404.13026 §5.2] |

## Implementation sketch

The core is one sub-step. Only the fixed corotated stress and the material
fit are specific to the paper [arxiv:2404.13026 §4.1] [arxiv:2404.13026 §4.2].
Helper names are placeholders.

```pseudocode
# One MPM sub-step for an elastic material  [arxiv:2404.13026 §4.1]
def mpm_substep(x, v, F, C, mass, volume, E, nu, dt):
    # Lame parameters from Young's modulus and Poisson's ratio  [§4.1]
    mu = E / (2 * (1 + nu))
    lam = E * nu / ((1 + nu) * (1 - 2 * nu))
    # Stress from the fixed corotated model applied to F  [§4.1]
    stress = fixed_corotated_stress(F, mu, lam)
    # Particle to grid: mass and momentum, with the stress term  [§4.1]
    grid_m, grid_p = scatter_to_grid(x, v, C, mass, volume, stress, dt)
    # Grid velocity from momentum; stationary cells keep zero velocity  [§5.2]
    grid_v = grid_p / grid_m
    grid_v = apply_boundary_mask(grid_v)
    # Grid to particle: new velocity and velocity gradient  [§4.1]
    v, C = gather_from_grid(grid_v, x)
    # Deformation gradient from the velocity gradient, then move  [§4.1]
    F = (identity + dt * C) @ F
    x = x + dt * v
    return x, v, F, C
```

The paper's fit wraps this sub-step. Rendered frames are compared with a
reference clip, and the gradient flows back through the simulation
[arxiv:2404.13026 §4.2].

```pseudocode
# Fit a stiffness field and an initial velocity field  [arxiv:2404.13026 §4.2]
def fit_material(particles, reference_frames):
    # Stage 1: stiffness random and frozen; fit velocity on 3 frames  [§4.2]
    stiffness = random_stiffness(particles)
    velocity = init_velocity_field()
    for step in range(stage1_steps):  # step count not stated  [§4.2]
        frames = simulate(particles, velocity, stiffness, num_frames=3)
        loss = render_loss(frames, reference_frames[:3])
        velocity = optimizer_step(velocity, loss)
    # Stage 2: velocity frozen; fit stiffness  [§4.2]
    for step in range(stage2_steps):  # step count not stated  [§4.2]
        frames = simulate(particles, velocity, stiffness)
        loss = render_loss(frames, reference_frames) + tv_penalty(stiffness)
        stiffness = optimizer_step(stiffness, loss)
    return stiffness, velocity
```

Sub-step size and count are not fixed in one place. See Contradictions.

## Contradictions

- **Sub-step size.** Section 4.2 gives a sub-step size of about $1 \times 10^{-4}$
  for most experiments [arxiv:2404.13026 §4.2]. Section 5.2 gives 768 sub-steps
  per frame, each $4.34 \times 10^{-5}$ s [arxiv:2404.13026 §5.2]. The paper
  does not say which applies to the reported runs. Check the value against the
  released code before you rely on either number.

## Papers

- [PhysDreamer: Physics-Based Interaction with 3D Objects via Video Generation](/papers/2404.13026): elastic MPM on 3D Gaussians, with a Young's modulus field fitted from a generated video and driving-particle subsampling.
