@triforge/fluid-core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/FLIPSimulator.d.ts +98 -0
- package/dist/FLIPSimulator.d.ts.map +1 -0
- package/dist/FLIPSimulator.js +404 -0
- package/dist/FLIPSimulator.js.map +1 -0
- package/dist/FluidEmitter.d.ts +35 -0
- package/dist/FluidEmitter.d.ts.map +1 -0
- package/dist/FluidEmitter.js +35 -0
- package/dist/FluidEmitter.js.map +1 -0
- package/dist/MACGrid.d.ts +58 -0
- package/dist/MACGrid.d.ts.map +1 -0
- package/dist/MACGrid.js +154 -0
- package/dist/MACGrid.js.map +1 -0
- package/dist/MarchingCubes.d.ts +40 -0
- package/dist/MarchingCubes.d.ts.map +1 -0
- package/dist/MarchingCubes.js +416 -0
- package/dist/MarchingCubes.js.map +1 -0
- package/dist/SPHSimulator.d.ts +139 -0
- package/dist/SPHSimulator.d.ts.map +1 -0
- package/dist/SPHSimulator.js +393 -0
- package/dist/SPHSimulator.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1742 -0
- package/dist/index.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { BufferGeometry } from 'three';
|
|
2
|
+
export interface SPHSimulatorOptions {
|
|
3
|
+
/** Number of fluid particles. Default 500. */
|
|
4
|
+
particleCount?: number;
|
|
5
|
+
/** Smoothing radius (h) — neighbourhood size. Blender: Fluid > Resolution. Default 0.3. */
|
|
6
|
+
smoothingRadius?: number;
|
|
7
|
+
/** Target rest density (ρ₀). Default 1000. */
|
|
8
|
+
restDensity?: number;
|
|
9
|
+
/** Pressure stiffness constant k. Higher = stiffer fluid. Default 200. */
|
|
10
|
+
pressureK?: number;
|
|
11
|
+
/** Viscosity coefficient μ. Blender: Fluid > Viscosity. Default 0.1. */
|
|
12
|
+
viscosity?: number;
|
|
13
|
+
/**
|
|
14
|
+
* Viscosity model.
|
|
15
|
+
* - `'standard'` — Müller 2003 viscosity Laplacian kernel (default)
|
|
16
|
+
* - `'xsph'` — XSPH correction (Schechter & Bridson 2012): blends each
|
|
17
|
+
* particle's velocity toward its neighbours. More stable,
|
|
18
|
+
* less physically accurate. Good for thick fluids.
|
|
19
|
+
* - `'stiff'` — Position-based viscosity: applies an extra velocity
|
|
20
|
+
* correction proportional to velocity divergence. Very stiff,
|
|
21
|
+
* best for near-incompressible high-viscosity fluids.
|
|
22
|
+
* Blender: Fluid > Viscosity Preset (thin/medium/thick water / honey / oil).
|
|
23
|
+
*/
|
|
24
|
+
viscosityType?: 'standard' | 'xsph' | 'stiff';
|
|
25
|
+
/** Gravity [x,y,z]. Default [0,-9.8,0]. */
|
|
26
|
+
gravity?: [number, number, number];
|
|
27
|
+
/** Simulation substeps per frame. Default 4. */
|
|
28
|
+
substeps?: number;
|
|
29
|
+
/** Surface tension coefficient. Default 0.0728 (water). */
|
|
30
|
+
surfaceTension?: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* SPHSimulator — Smoothed Particle Hydrodynamics fluid simulation.
|
|
34
|
+
* Blender: Fluid modifier (FLIP/SPH domain).
|
|
35
|
+
*
|
|
36
|
+
* Implements the Müller et al. 2003 SPH formulation:
|
|
37
|
+
* - Poly6 kernel for density
|
|
38
|
+
* - Spiky kernel gradient for pressure
|
|
39
|
+
* - Viscosity kernel Laplacian for viscosity
|
|
40
|
+
*
|
|
41
|
+
* Workflow:
|
|
42
|
+
* 1. Construct with particle count + physics parameters
|
|
43
|
+
* 2. Call `setPositions(array)` to place particles in a volume
|
|
44
|
+
* 3. Call `step(dt)` each frame (dt ≈ 1/60)
|
|
45
|
+
* 4. Call `getGeometry()` to read back a THREE.BufferGeometry for rendering
|
|
46
|
+
*
|
|
47
|
+
* All physics parameters live in `parameters` for GSAP/st-keyframe:
|
|
48
|
+
* gsap.to(sim.parameters, { viscosity: 0.5, duration: 1 })
|
|
49
|
+
*/
|
|
50
|
+
export declare class SPHSimulator {
|
|
51
|
+
/** All scalar simulation parameters — GSAP/st-keyframe compatible. */
|
|
52
|
+
parameters: {
|
|
53
|
+
smoothingRadius: number;
|
|
54
|
+
restDensity: number;
|
|
55
|
+
pressureK: number;
|
|
56
|
+
viscosity: number;
|
|
57
|
+
/** XSPH blend factor [0–1]. Only used when viscosityType='xsph'. Default 0.5. */
|
|
58
|
+
xsphFactor: number;
|
|
59
|
+
/** Stiff viscosity strength. Only used when viscosityType='stiff'. Default 0.5. */
|
|
60
|
+
stiffFactor: number;
|
|
61
|
+
gravityX: number;
|
|
62
|
+
gravityY: number;
|
|
63
|
+
gravityZ: number;
|
|
64
|
+
substeps: number;
|
|
65
|
+
surfaceTension: number;
|
|
66
|
+
};
|
|
67
|
+
/** Active viscosity model. Can be changed at runtime. */
|
|
68
|
+
viscosityType: 'standard' | 'xsph' | 'stiff';
|
|
69
|
+
readonly particleCount: number;
|
|
70
|
+
private _px;
|
|
71
|
+
private _py;
|
|
72
|
+
private _pz;
|
|
73
|
+
private _vx;
|
|
74
|
+
private _vy;
|
|
75
|
+
private _vz;
|
|
76
|
+
private _density;
|
|
77
|
+
private _pressure;
|
|
78
|
+
private _grid;
|
|
79
|
+
/** Simulation clock. */
|
|
80
|
+
time: number;
|
|
81
|
+
private _domainMin;
|
|
82
|
+
private _domainMax;
|
|
83
|
+
constructor(opts?: SPHSimulatorOptions);
|
|
84
|
+
private _initGrid;
|
|
85
|
+
/**
|
|
86
|
+
* Set particle positions from a flat array [x0,y0,z0, x1,y1,z1, ...].
|
|
87
|
+
*/
|
|
88
|
+
setPositions(arr: ArrayLike<number>): void;
|
|
89
|
+
/**
|
|
90
|
+
* Set simulation domain (AABB boundary collider).
|
|
91
|
+
* Particles bounce off the domain walls.
|
|
92
|
+
*/
|
|
93
|
+
setDomain(min: [number, number, number], max: [number, number, number]): void;
|
|
94
|
+
/**
|
|
95
|
+
* Advance the simulation by dt seconds.
|
|
96
|
+
* Recommended: pass clock.getDelta() clamped to 0.05 s.
|
|
97
|
+
*/
|
|
98
|
+
step(dt: number): void;
|
|
99
|
+
/**
|
|
100
|
+
* Build and return a BufferGeometry with a 'position' attribute.
|
|
101
|
+
* Suitable for THREE.Points rendering.
|
|
102
|
+
*/
|
|
103
|
+
getGeometry(): BufferGeometry;
|
|
104
|
+
/**
|
|
105
|
+
* Copy current particle positions into an existing BufferGeometry.
|
|
106
|
+
* More efficient than getGeometry() in the render loop.
|
|
107
|
+
*/
|
|
108
|
+
updateGeometry(geo: BufferGeometry): void;
|
|
109
|
+
/** Per-particle density (read-only, updated after each step). */
|
|
110
|
+
getDensity(i: number): number;
|
|
111
|
+
/** Per-particle pressure (read-only). */
|
|
112
|
+
getPressure(i: number): number;
|
|
113
|
+
private _substep;
|
|
114
|
+
private _buildSpatialGrid;
|
|
115
|
+
private _cellKey;
|
|
116
|
+
private _neighbours;
|
|
117
|
+
private _poly6;
|
|
118
|
+
private _spikyGrad;
|
|
119
|
+
private _viscLaplacian;
|
|
120
|
+
private _computeDensityPressure;
|
|
121
|
+
private _integrate;
|
|
122
|
+
/**
|
|
123
|
+
* XSPH viscosity (Schechter & Bridson 2012).
|
|
124
|
+
* Blends each particle's velocity toward a weighted average of its neighbours.
|
|
125
|
+
* More stable than Müller viscosity, good for thick/honey-like fluids.
|
|
126
|
+
* Controlled by parameters.xsphFactor [0–1].
|
|
127
|
+
*/
|
|
128
|
+
private _applyXSPH;
|
|
129
|
+
/**
|
|
130
|
+
* Stiff viscosity (position-based / divergence damping).
|
|
131
|
+
* Applies a velocity correction proportional to the local velocity divergence,
|
|
132
|
+
* strongly suppressing compressible motion.
|
|
133
|
+
* Best for near-incompressible high-viscosity simulations.
|
|
134
|
+
* Controlled by parameters.stiffFactor.
|
|
135
|
+
*/
|
|
136
|
+
private _applyStiffViscosity;
|
|
137
|
+
private _enforceDomain;
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=SPHSimulator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SPHSimulator.d.ts","sourceRoot":"","sources":["../src/SPHSimulator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
import { BufferGeometry, BufferAttribute } from 'three';
|
|
2
|
+
/**
|
|
3
|
+
* SPHSimulator — Smoothed Particle Hydrodynamics fluid simulation.
|
|
4
|
+
* Blender: Fluid modifier (FLIP/SPH domain).
|
|
5
|
+
*
|
|
6
|
+
* Implements the Müller et al. 2003 SPH formulation:
|
|
7
|
+
* - Poly6 kernel for density
|
|
8
|
+
* - Spiky kernel gradient for pressure
|
|
9
|
+
* - Viscosity kernel Laplacian for viscosity
|
|
10
|
+
*
|
|
11
|
+
* Workflow:
|
|
12
|
+
* 1. Construct with particle count + physics parameters
|
|
13
|
+
* 2. Call `setPositions(array)` to place particles in a volume
|
|
14
|
+
* 3. Call `step(dt)` each frame (dt ≈ 1/60)
|
|
15
|
+
* 4. Call `getGeometry()` to read back a THREE.BufferGeometry for rendering
|
|
16
|
+
*
|
|
17
|
+
* All physics parameters live in `parameters` for GSAP/st-keyframe:
|
|
18
|
+
* gsap.to(sim.parameters, { viscosity: 0.5, duration: 1 })
|
|
19
|
+
*/
|
|
20
|
+
export class SPHSimulator {
|
|
21
|
+
constructor(opts = {}) {
|
|
22
|
+
// Spatial grid for O(n) neighbour search
|
|
23
|
+
this._grid = new Map();
|
|
24
|
+
/** Simulation clock. */
|
|
25
|
+
this.time = 0;
|
|
26
|
+
// Domain bounds (AABB collider)
|
|
27
|
+
this._domainMin = [-2, -2, -2];
|
|
28
|
+
this._domainMax = [2, 2, 2];
|
|
29
|
+
this.particleCount = Math.max(1, Math.round(opts.particleCount ?? 500));
|
|
30
|
+
const h = opts.smoothingRadius ?? 0.3;
|
|
31
|
+
const g = opts.gravity ?? [0, -9.8, 0];
|
|
32
|
+
this.viscosityType = opts.viscosityType ?? 'standard';
|
|
33
|
+
this.parameters = {
|
|
34
|
+
smoothingRadius: h,
|
|
35
|
+
restDensity: opts.restDensity ?? 1000,
|
|
36
|
+
pressureK: opts.pressureK ?? 200,
|
|
37
|
+
viscosity: opts.viscosity ?? 0.1,
|
|
38
|
+
xsphFactor: 0.5,
|
|
39
|
+
stiffFactor: 0.5,
|
|
40
|
+
gravityX: g[0],
|
|
41
|
+
gravityY: g[1],
|
|
42
|
+
gravityZ: g[2],
|
|
43
|
+
substeps: opts.substeps ?? 4,
|
|
44
|
+
surfaceTension: opts.surfaceTension ?? 0.0728,
|
|
45
|
+
};
|
|
46
|
+
this._px = new Float32Array(this.particleCount);
|
|
47
|
+
this._py = new Float32Array(this.particleCount);
|
|
48
|
+
this._pz = new Float32Array(this.particleCount);
|
|
49
|
+
this._vx = new Float32Array(this.particleCount);
|
|
50
|
+
this._vy = new Float32Array(this.particleCount);
|
|
51
|
+
this._vz = new Float32Array(this.particleCount);
|
|
52
|
+
this._density = new Float32Array(this.particleCount);
|
|
53
|
+
this._pressure = new Float32Array(this.particleCount);
|
|
54
|
+
// Default: arrange in a 3D grid block
|
|
55
|
+
this._initGrid();
|
|
56
|
+
}
|
|
57
|
+
// ── Initialisation ────────────────────────────────────────────────────────
|
|
58
|
+
_initGrid() {
|
|
59
|
+
const n = this.particleCount;
|
|
60
|
+
const cbrt = Math.ceil(Math.cbrt(n));
|
|
61
|
+
const spacing = this.parameters.smoothingRadius * 0.9;
|
|
62
|
+
let i = 0;
|
|
63
|
+
outer: for (let z = 0; z < cbrt; z++) {
|
|
64
|
+
for (let y = 0; y < cbrt; y++) {
|
|
65
|
+
for (let x = 0; x < cbrt; x++) {
|
|
66
|
+
if (i >= n)
|
|
67
|
+
break outer;
|
|
68
|
+
this._px[i] = (x - cbrt / 2) * spacing;
|
|
69
|
+
this._py[i] = (y - cbrt / 2) * spacing;
|
|
70
|
+
this._pz[i] = (z - cbrt / 2) * spacing;
|
|
71
|
+
i++;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Set particle positions from a flat array [x0,y0,z0, x1,y1,z1, ...].
|
|
78
|
+
*/
|
|
79
|
+
setPositions(arr) {
|
|
80
|
+
const n = Math.min(this.particleCount, Math.floor(arr.length / 3));
|
|
81
|
+
for (let i = 0; i < n; i++) {
|
|
82
|
+
this._px[i] = arr[i * 3];
|
|
83
|
+
this._py[i] = arr[i * 3 + 1];
|
|
84
|
+
this._pz[i] = arr[i * 3 + 2];
|
|
85
|
+
}
|
|
86
|
+
this._vx.fill(0);
|
|
87
|
+
this._vy.fill(0);
|
|
88
|
+
this._vz.fill(0);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Set simulation domain (AABB boundary collider).
|
|
92
|
+
* Particles bounce off the domain walls.
|
|
93
|
+
*/
|
|
94
|
+
setDomain(min, max) {
|
|
95
|
+
this._domainMin = [...min];
|
|
96
|
+
this._domainMax = [...max];
|
|
97
|
+
}
|
|
98
|
+
// ── Simulation ────────────────────────────────────────────────────────────
|
|
99
|
+
/**
|
|
100
|
+
* Advance the simulation by dt seconds.
|
|
101
|
+
* Recommended: pass clock.getDelta() clamped to 0.05 s.
|
|
102
|
+
*/
|
|
103
|
+
step(dt) {
|
|
104
|
+
const sub = Math.max(1, Math.round(this.parameters.substeps));
|
|
105
|
+
const subDt = dt / sub;
|
|
106
|
+
for (let s = 0; s < sub; s++)
|
|
107
|
+
this._substep(subDt);
|
|
108
|
+
this.time += dt;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Build and return a BufferGeometry with a 'position' attribute.
|
|
112
|
+
* Suitable for THREE.Points rendering.
|
|
113
|
+
*/
|
|
114
|
+
getGeometry() {
|
|
115
|
+
const positions = new Float32Array(this.particleCount * 3);
|
|
116
|
+
for (let i = 0; i < this.particleCount; i++) {
|
|
117
|
+
positions[i * 3] = this._px[i];
|
|
118
|
+
positions[i * 3 + 1] = this._py[i];
|
|
119
|
+
positions[i * 3 + 2] = this._pz[i];
|
|
120
|
+
}
|
|
121
|
+
const geo = new BufferGeometry();
|
|
122
|
+
geo.setAttribute('position', new BufferAttribute(positions, 3));
|
|
123
|
+
return geo;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Copy current particle positions into an existing BufferGeometry.
|
|
127
|
+
* More efficient than getGeometry() in the render loop.
|
|
128
|
+
*/
|
|
129
|
+
updateGeometry(geo) {
|
|
130
|
+
const attr = geo.getAttribute('position');
|
|
131
|
+
const n = Math.min(attr.count, this.particleCount);
|
|
132
|
+
for (let i = 0; i < n; i++) {
|
|
133
|
+
attr.setXYZ(i, this._px[i], this._py[i], this._pz[i]);
|
|
134
|
+
}
|
|
135
|
+
attr.needsUpdate = true;
|
|
136
|
+
}
|
|
137
|
+
/** Per-particle density (read-only, updated after each step). */
|
|
138
|
+
getDensity(i) { return this._density[i]; }
|
|
139
|
+
/** Per-particle pressure (read-only). */
|
|
140
|
+
getPressure(i) { return this._pressure[i]; }
|
|
141
|
+
// ── Internals ─────────────────────────────────────────────────────────────
|
|
142
|
+
_substep(dt) {
|
|
143
|
+
this._buildSpatialGrid();
|
|
144
|
+
this._computeDensityPressure();
|
|
145
|
+
this._integrate(dt);
|
|
146
|
+
if (this.viscosityType === 'xsph')
|
|
147
|
+
this._applyXSPH();
|
|
148
|
+
if (this.viscosityType === 'stiff')
|
|
149
|
+
this._applyStiffViscosity(dt);
|
|
150
|
+
this._enforceDomain();
|
|
151
|
+
}
|
|
152
|
+
// Uniform spatial grid: maps cell key → particle indices
|
|
153
|
+
_buildSpatialGrid() {
|
|
154
|
+
const h = this.parameters.smoothingRadius;
|
|
155
|
+
this._grid.clear();
|
|
156
|
+
for (let i = 0; i < this.particleCount; i++) {
|
|
157
|
+
const key = this._cellKey(Math.floor(this._px[i] / h), Math.floor(this._py[i] / h), Math.floor(this._pz[i] / h));
|
|
158
|
+
let cell = this._grid.get(key);
|
|
159
|
+
if (!cell) {
|
|
160
|
+
cell = [];
|
|
161
|
+
this._grid.set(key, cell);
|
|
162
|
+
}
|
|
163
|
+
cell.push(i);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
_cellKey(cx, cy, cz) {
|
|
167
|
+
// Simple hash: large primes, bit-truncated to 32-bit int range
|
|
168
|
+
return ((cx * 92837111) ^ (cy * 689287499) ^ (cz * 283923481)) | 0;
|
|
169
|
+
}
|
|
170
|
+
_neighbours(i, callback) {
|
|
171
|
+
const h = this.parameters.smoothingRadius;
|
|
172
|
+
const h2 = h * h;
|
|
173
|
+
const cx = Math.floor(this._px[i] / h);
|
|
174
|
+
const cy = Math.floor(this._py[i] / h);
|
|
175
|
+
const cz = Math.floor(this._pz[i] / h);
|
|
176
|
+
for (let dz = -1; dz <= 1; dz++) {
|
|
177
|
+
for (let dy = -1; dy <= 1; dy++) {
|
|
178
|
+
for (let dx = -1; dx <= 1; dx++) {
|
|
179
|
+
const cell = this._grid.get(this._cellKey(cx + dx, cy + dy, cz + dz));
|
|
180
|
+
if (!cell)
|
|
181
|
+
continue;
|
|
182
|
+
for (const j of cell) {
|
|
183
|
+
if (j === i)
|
|
184
|
+
continue;
|
|
185
|
+
const rx = this._px[j] - this._px[i];
|
|
186
|
+
const ry = this._py[j] - this._py[i];
|
|
187
|
+
const rz = this._pz[j] - this._pz[i];
|
|
188
|
+
const r2 = rx * rx + ry * ry + rz * rz;
|
|
189
|
+
if (r2 < h2)
|
|
190
|
+
callback(j, r2);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// Müller 2003 Poly6 kernel
|
|
197
|
+
_poly6(r2) {
|
|
198
|
+
const h = this.parameters.smoothingRadius;
|
|
199
|
+
const h2 = h * h;
|
|
200
|
+
if (r2 > h2)
|
|
201
|
+
return 0;
|
|
202
|
+
const diff = h2 - r2;
|
|
203
|
+
return (315 / (64 * Math.PI * Math.pow(h, 9))) * diff * diff * diff;
|
|
204
|
+
}
|
|
205
|
+
// Spiky kernel gradient magnitude ∂W/∂r (scalar, apply direction separately)
|
|
206
|
+
_spikyGrad(r) {
|
|
207
|
+
const h = this.parameters.smoothingRadius;
|
|
208
|
+
if (r > h || r < 1e-6)
|
|
209
|
+
return 0;
|
|
210
|
+
const diff = h - r;
|
|
211
|
+
return -(45 / (Math.PI * Math.pow(h, 6))) * diff * diff;
|
|
212
|
+
}
|
|
213
|
+
// Viscosity kernel Laplacian
|
|
214
|
+
_viscLaplacian(r) {
|
|
215
|
+
const h = this.parameters.smoothingRadius;
|
|
216
|
+
if (r > h)
|
|
217
|
+
return 0;
|
|
218
|
+
return (45 / (Math.PI * Math.pow(h, 6))) * (h - r);
|
|
219
|
+
}
|
|
220
|
+
_computeDensityPressure() {
|
|
221
|
+
const { restDensity, pressureK } = this.parameters;
|
|
222
|
+
const particleMass = restDensity * Math.pow(this.parameters.smoothingRadius, 3) * 0.02;
|
|
223
|
+
for (let i = 0; i < this.particleCount; i++) {
|
|
224
|
+
let rho = this._poly6(0) * particleMass; // self contribution
|
|
225
|
+
this._neighbours(i, (_j, r2) => {
|
|
226
|
+
rho += particleMass * this._poly6(r2);
|
|
227
|
+
});
|
|
228
|
+
this._density[i] = Math.max(rho, restDensity * 0.001);
|
|
229
|
+
// Tait equation of state (water)
|
|
230
|
+
this._pressure[i] = Math.max(0, pressureK * (this._density[i] / restDensity - 1));
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
_integrate(dt) {
|
|
234
|
+
const { gravityX, gravityY, gravityZ, viscosity } = this.parameters;
|
|
235
|
+
const particleMass = this.parameters.restDensity *
|
|
236
|
+
Math.pow(this.parameters.smoothingRadius, 3) * 0.02;
|
|
237
|
+
for (let i = 0; i < this.particleCount; i++) {
|
|
238
|
+
let fx = 0, fy = 0, fz = 0;
|
|
239
|
+
const pi = this._pressure[i];
|
|
240
|
+
const rhoi = this._density[i];
|
|
241
|
+
this._neighbours(i, (j, r2) => {
|
|
242
|
+
const rx = this._px[j] - this._px[i];
|
|
243
|
+
const ry = this._py[j] - this._py[i];
|
|
244
|
+
const rz = this._pz[j] - this._pz[i];
|
|
245
|
+
const r = Math.sqrt(r2);
|
|
246
|
+
if (r < 1e-6)
|
|
247
|
+
return;
|
|
248
|
+
const nx = rx / r, ny = ry / r, nz = rz / r;
|
|
249
|
+
const rhoj = this._density[j];
|
|
250
|
+
const pj = this._pressure[j];
|
|
251
|
+
const m = particleMass;
|
|
252
|
+
// Pressure force (symmetric formulation)
|
|
253
|
+
const spg = this._spikyGrad(r);
|
|
254
|
+
const pf = -m * (pi + pj) / (2 * rhoj) * spg;
|
|
255
|
+
fx += pf * nx;
|
|
256
|
+
fy += pf * ny;
|
|
257
|
+
fz += pf * nz;
|
|
258
|
+
// Standard viscosity (Müller 2003) — skipped for xsph/stiff modes
|
|
259
|
+
if (this.viscosityType === 'standard') {
|
|
260
|
+
const visc = viscosity * m / rhoj * this._viscLaplacian(r);
|
|
261
|
+
fx += visc * (this._vx[j] - this._vx[i]);
|
|
262
|
+
fy += visc * (this._vy[j] - this._vy[i]);
|
|
263
|
+
fz += visc * (this._vz[j] - this._vz[i]);
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
// Gravity
|
|
267
|
+
fx += gravityX * rhoi;
|
|
268
|
+
fy += gravityY * rhoi;
|
|
269
|
+
fz += gravityZ * rhoi;
|
|
270
|
+
// Euler integration
|
|
271
|
+
const invRho = 1 / rhoi;
|
|
272
|
+
this._vx[i] += (fx * invRho) * dt;
|
|
273
|
+
this._vy[i] += (fy * invRho) * dt;
|
|
274
|
+
this._vz[i] += (fz * invRho) * dt;
|
|
275
|
+
this._px[i] += this._vx[i] * dt;
|
|
276
|
+
this._py[i] += this._vy[i] * dt;
|
|
277
|
+
this._pz[i] += this._vz[i] * dt;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* XSPH viscosity (Schechter & Bridson 2012).
|
|
282
|
+
* Blends each particle's velocity toward a weighted average of its neighbours.
|
|
283
|
+
* More stable than Müller viscosity, good for thick/honey-like fluids.
|
|
284
|
+
* Controlled by parameters.xsphFactor [0–1].
|
|
285
|
+
*/
|
|
286
|
+
_applyXSPH() {
|
|
287
|
+
const h = this.parameters.smoothingRadius;
|
|
288
|
+
const h2 = h * h;
|
|
289
|
+
const factor = this.parameters.xsphFactor;
|
|
290
|
+
const particleMass = this.parameters.restDensity * Math.pow(h, 3) * 0.02;
|
|
291
|
+
// Temporary correction arrays
|
|
292
|
+
const cx = new Float32Array(this.particleCount);
|
|
293
|
+
const cy = new Float32Array(this.particleCount);
|
|
294
|
+
const cz = new Float32Array(this.particleCount);
|
|
295
|
+
for (let i = 0; i < this.particleCount; i++) {
|
|
296
|
+
this._neighbours(i, (j, r2) => {
|
|
297
|
+
const w = this._poly6(r2);
|
|
298
|
+
const avgRho = (this._density[i] + this._density[j]) * 0.5;
|
|
299
|
+
const wm = w * particleMass / avgRho;
|
|
300
|
+
cx[i] += wm * (this._vx[j] - this._vx[i]);
|
|
301
|
+
cy[i] += wm * (this._vy[j] - this._vy[i]);
|
|
302
|
+
cz[i] += wm * (this._vz[j] - this._vz[i]);
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
for (let i = 0; i < this.particleCount; i++) {
|
|
306
|
+
this._vx[i] += factor * cx[i];
|
|
307
|
+
this._vy[i] += factor * cy[i];
|
|
308
|
+
this._vz[i] += factor * cz[i];
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Stiff viscosity (position-based / divergence damping).
|
|
313
|
+
* Applies a velocity correction proportional to the local velocity divergence,
|
|
314
|
+
* strongly suppressing compressible motion.
|
|
315
|
+
* Best for near-incompressible high-viscosity simulations.
|
|
316
|
+
* Controlled by parameters.stiffFactor.
|
|
317
|
+
*/
|
|
318
|
+
_applyStiffViscosity(dt) {
|
|
319
|
+
const h = this.parameters.smoothingRadius;
|
|
320
|
+
const stiff = this.parameters.stiffFactor;
|
|
321
|
+
const particleMass = this.parameters.restDensity * Math.pow(h, 3) * 0.02;
|
|
322
|
+
const cx = new Float32Array(this.particleCount);
|
|
323
|
+
const cy = new Float32Array(this.particleCount);
|
|
324
|
+
const cz = new Float32Array(this.particleCount);
|
|
325
|
+
for (let i = 0; i < this.particleCount; i++) {
|
|
326
|
+
let divV = 0;
|
|
327
|
+
this._neighbours(i, (j, r2) => {
|
|
328
|
+
const r = Math.sqrt(r2);
|
|
329
|
+
if (r < 1e-6)
|
|
330
|
+
return;
|
|
331
|
+
const rx = this._px[j] - this._px[i];
|
|
332
|
+
const ry = this._py[j] - this._py[i];
|
|
333
|
+
const rz = this._pz[j] - this._pz[i];
|
|
334
|
+
const dvx = this._vx[j] - this._vx[i];
|
|
335
|
+
const dvy = this._vy[j] - this._vy[i];
|
|
336
|
+
const dvz = this._vz[j] - this._vz[i];
|
|
337
|
+
// Divergence contribution: (v_ij · r_ij) / |r_ij|²
|
|
338
|
+
const dot = dvx * rx + dvy * ry + dvz * rz;
|
|
339
|
+
const spg = this._spikyGrad(r);
|
|
340
|
+
const coef = particleMass / this._density[j] * spg / r;
|
|
341
|
+
divV += dot / r2 * coef * (-1);
|
|
342
|
+
// Velocity correction: push toward incompressibility
|
|
343
|
+
cx[i] += coef * dot / r2 * rx;
|
|
344
|
+
cy[i] += coef * dot / r2 * ry;
|
|
345
|
+
cz[i] += coef * dot / r2 * rz;
|
|
346
|
+
});
|
|
347
|
+
void divV;
|
|
348
|
+
}
|
|
349
|
+
for (let i = 0; i < this.particleCount; i++) {
|
|
350
|
+
this._vx[i] -= stiff * dt * cx[i];
|
|
351
|
+
this._vy[i] -= stiff * dt * cy[i];
|
|
352
|
+
this._vz[i] -= stiff * dt * cz[i];
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
_enforceDomain() {
|
|
356
|
+
const restitution = 0.3;
|
|
357
|
+
const [minX, minY, minZ] = this._domainMin;
|
|
358
|
+
const [maxX, maxY, maxZ] = this._domainMax;
|
|
359
|
+
for (let i = 0; i < this.particleCount; i++) {
|
|
360
|
+
if (this._px[i] < minX) {
|
|
361
|
+
this._px[i] = minX;
|
|
362
|
+
if (this._vx[i] < 0)
|
|
363
|
+
this._vx[i] *= -restitution;
|
|
364
|
+
}
|
|
365
|
+
if (this._px[i] > maxX) {
|
|
366
|
+
this._px[i] = maxX;
|
|
367
|
+
if (this._vx[i] > 0)
|
|
368
|
+
this._vx[i] *= -restitution;
|
|
369
|
+
}
|
|
370
|
+
if (this._py[i] < minY) {
|
|
371
|
+
this._py[i] = minY;
|
|
372
|
+
if (this._vy[i] < 0)
|
|
373
|
+
this._vy[i] *= -restitution;
|
|
374
|
+
}
|
|
375
|
+
if (this._py[i] > maxY) {
|
|
376
|
+
this._py[i] = maxY;
|
|
377
|
+
if (this._vy[i] > 0)
|
|
378
|
+
this._vy[i] *= -restitution;
|
|
379
|
+
}
|
|
380
|
+
if (this._pz[i] < minZ) {
|
|
381
|
+
this._pz[i] = minZ;
|
|
382
|
+
if (this._vz[i] < 0)
|
|
383
|
+
this._vz[i] *= -restitution;
|
|
384
|
+
}
|
|
385
|
+
if (this._pz[i] > maxZ) {
|
|
386
|
+
this._pz[i] = maxZ;
|
|
387
|
+
if (this._vz[i] > 0)
|
|
388
|
+
this._vz[i] *= -restitution;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
//# sourceMappingURL=SPHSimulator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SPHSimulator.js","sourceRoot":"","sources":["../src/SPHSimulator.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { FLIPSimulator } from './FLIPSimulator.js';
|
|
2
|
+
export { MACGrid } from './MACGrid.js';
|
|
3
|
+
export { SPHSimulator } from './SPHSimulator.js';
|
|
4
|
+
export { FluidEmitter } from './FluidEmitter.js';
|
|
5
|
+
export { MarchingCubes } from './MarchingCubes.js';
|
|
6
|
+
export type { FLIPSimulatorOptions } from './FLIPSimulator.js';
|
|
7
|
+
export type { SPHSimulatorOptions } from './SPHSimulator.js';
|
|
8
|
+
export type { FluidEmitterOptions } from './FluidEmitter.js';
|
|
9
|
+
export type { MarchingCubesOptions } from './MarchingCubes.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAO,oBAAoB,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,MAAa,cAAc,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAQ,mBAAmB,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAQ,mBAAmB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAO,oBAAoB,CAAA;AAEnD,YAAY,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAC9D,YAAY,EAAE,mBAAmB,EAAE,MAAO,mBAAmB,CAAA;AAC7D,YAAY,EAAE,mBAAmB,EAAE,MAAO,mBAAmB,CAAA;AAC7D,YAAY,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA"}
|