Kyle Pearson commited on
Commit ·
32db4c0
1
Parent(s): 4590090
Add physics simulation GUI controls, implement dynamic blending, restore camera lock toggle, update oscillation formulas with decay/freq multiplies
Browse files
js/app.js
CHANGED
|
@@ -134,9 +134,6 @@ guiOptions.resetPose();
|
|
| 134 |
|
| 135 |
const cameraFolder = gui.addFolder("Camera");
|
| 136 |
const cameraPose = cameraFolder.addFolder("Camera Pose");
|
| 137 |
-
cameraPose.add(guiOptions, "cameraLocked").name("Lock Camera").onChange((v) => {
|
| 138 |
-
if (guiOptions.orbit) orbitControls.enabled = !v;
|
| 139 |
-
});
|
| 140 |
cameraPose.add(camera.position, "x", -10, 10, 0.01).name("X").listen();
|
| 141 |
cameraPose.add(camera.position, "y", -10, 10, 0.01).name("Y").listen();
|
| 142 |
cameraPose.add(camera.position, "z", -10, 10, 0.01).name("Z").listen();
|
|
@@ -241,6 +238,9 @@ secondGui.add(guiOptions, "loadFromTextAction").name("Load URL");
|
|
| 241 |
|
| 242 |
cameraFolder.add(guiOptions, "resetPose").name("Reset pose");
|
| 243 |
cameraFolder.add(guiOptions, "autoRotate").name("Auto rotate").listen();
|
|
|
|
|
|
|
|
|
|
| 244 |
// cameraFolder.add(guiOptions, "orbit").name("Orbit controls").listen().onChange((v) => {
|
| 245 |
// orbitControls.enabled = v;
|
| 246 |
// canvas.focus();
|
|
@@ -273,6 +273,10 @@ const bounceBaseDisplacement = dyno.dynoVec3(new THREE.Vector3(0, 0, 0));
|
|
| 273 |
const dragIntensity = dyno.dynoFloat(5.0);
|
| 274 |
const bounceAmount = dyno.dynoFloat(0.5);
|
| 275 |
const bounceSpeed = dyno.dynoFloat(0.5);
|
|
|
|
|
|
|
|
|
|
|
|
|
| 276 |
|
| 277 |
let isBouncing = false;
|
| 278 |
let isDragging = false;
|
|
@@ -289,6 +293,10 @@ deformFolder.add(dragIntensity, "value", 0, 10.0, 0.1).name("Strength").onChange
|
|
| 289 |
deformFolder.add(dragRadius, "value", 0.25, 1.0, 0.1).name("Radius").onChange(updateFrameSplats);
|
| 290 |
deformFolder.add(bounceAmount, "value", 0, 1.0, 0.1).name("Bounce Strength").onChange(updateFrameSplats);
|
| 291 |
deformFolder.add(bounceSpeed, "value", 0, 1.0, 0.01).name("Bounce Speed").onChange(updateFrameSplats);
|
|
|
|
|
|
|
|
|
|
|
|
|
| 292 |
|
| 293 |
function makeWorldModifier(mesh) {
|
| 294 |
const context = mesh.context;
|
|
@@ -306,6 +314,10 @@ function makeWorldModifier(mesh) {
|
|
| 306 |
dragIntensity: "float",
|
| 307 |
bounceAmount: "float",
|
| 308 |
bounceSpeed: "float",
|
|
|
|
|
|
|
|
|
|
|
|
|
| 309 |
},
|
| 310 |
outTypes: { gsplat: dyno.Gsplat },
|
| 311 |
statements: ({ inputs, outputs }) => dyno.unindentLines(`
|
|
@@ -337,14 +349,14 @@ function makeWorldModifier(mesh) {
|
|
| 337 |
|
| 338 |
// IMPROVEMENT: Multi-frequency Oscillation (Harmonics)
|
| 339 |
// Primary low-frequency mode (bulk motion)
|
| 340 |
-
float mode1 = cos(time * bounceFrequency) * exp(-time *
|
| 341 |
|
| 342 |
// Secondary high-frequency mode (surface wobble/jiggle)
|
| 343 |
// Higher frequency (2.5x) and faster decay
|
| 344 |
-
float mode2 = cos(time * bounceFrequency *
|
| 345 |
|
| 346 |
// Blend the modes (80% bulk, 20% wobble)
|
| 347 |
-
float oscillation =
|
| 348 |
|
| 349 |
originalPos += bounceOffset * oscillation;
|
| 350 |
|
|
@@ -364,6 +376,10 @@ function makeWorldModifier(mesh) {
|
|
| 364 |
dragIntensity,
|
| 365 |
bounceAmount,
|
| 366 |
bounceSpeed,
|
|
|
|
|
|
|
|
|
|
|
|
|
| 367 |
}).gsplat;
|
| 368 |
|
| 369 |
// 3. Apply Clipping (on the deformed splat)
|
|
|
|
| 134 |
|
| 135 |
const cameraFolder = gui.addFolder("Camera");
|
| 136 |
const cameraPose = cameraFolder.addFolder("Camera Pose");
|
|
|
|
|
|
|
|
|
|
| 137 |
cameraPose.add(camera.position, "x", -10, 10, 0.01).name("X").listen();
|
| 138 |
cameraPose.add(camera.position, "y", -10, 10, 0.01).name("Y").listen();
|
| 139 |
cameraPose.add(camera.position, "z", -10, 10, 0.01).name("Z").listen();
|
|
|
|
| 238 |
|
| 239 |
cameraFolder.add(guiOptions, "resetPose").name("Reset pose");
|
| 240 |
cameraFolder.add(guiOptions, "autoRotate").name("Auto rotate").listen();
|
| 241 |
+
cameraFolder.add(guiOptions, "cameraLocked").name("Lock Camera").onChange((v) => {
|
| 242 |
+
if (guiOptions.orbit) orbitControls.enabled = !v;
|
| 243 |
+
});
|
| 244 |
// cameraFolder.add(guiOptions, "orbit").name("Orbit controls").listen().onChange((v) => {
|
| 245 |
// orbitControls.enabled = v;
|
| 246 |
// canvas.focus();
|
|
|
|
| 273 |
const dragIntensity = dyno.dynoFloat(5.0);
|
| 274 |
const bounceAmount = dyno.dynoFloat(0.5);
|
| 275 |
const bounceSpeed = dyno.dynoFloat(0.5);
|
| 276 |
+
const mode1Decay = dyno.dynoFloat(2.0);
|
| 277 |
+
const mode2Decay = dyno.dynoFloat(4.0);
|
| 278 |
+
const mode2FreqMult = dyno.dynoFloat(2.5);
|
| 279 |
+
const modeMix = dyno.dynoFloat(0.8);
|
| 280 |
|
| 281 |
let isBouncing = false;
|
| 282 |
let isDragging = false;
|
|
|
|
| 293 |
deformFolder.add(dragRadius, "value", 0.25, 1.0, 0.1).name("Radius").onChange(updateFrameSplats);
|
| 294 |
deformFolder.add(bounceAmount, "value", 0, 1.0, 0.1).name("Bounce Strength").onChange(updateFrameSplats);
|
| 295 |
deformFolder.add(bounceSpeed, "value", 0, 1.0, 0.01).name("Bounce Speed").onChange(updateFrameSplats);
|
| 296 |
+
deformFolder.add(mode1Decay, "value", 0.1, 10.0, 0.1).name("Primary Decay").onChange(updateFrameSplats);
|
| 297 |
+
deformFolder.add(mode2Decay, "value", 0.1, 10.0, 0.1).name("Secondary Decay").onChange(updateFrameSplats);
|
| 298 |
+
deformFolder.add(mode2FreqMult, "value", 1.0, 10.0, 0.1).name("Secondary Freq").onChange(updateFrameSplats);
|
| 299 |
+
deformFolder.add(modeMix, "value", 0.0, 1.0, 0.01).name("Mode Mix").onChange(updateFrameSplats);
|
| 300 |
|
| 301 |
function makeWorldModifier(mesh) {
|
| 302 |
const context = mesh.context;
|
|
|
|
| 314 |
dragIntensity: "float",
|
| 315 |
bounceAmount: "float",
|
| 316 |
bounceSpeed: "float",
|
| 317 |
+
mode1Decay: "float",
|
| 318 |
+
mode2Decay: "float",
|
| 319 |
+
mode2FreqMult: "float",
|
| 320 |
+
modeMix: "float",
|
| 321 |
},
|
| 322 |
outTypes: { gsplat: dyno.Gsplat },
|
| 323 |
statements: ({ inputs, outputs }) => dyno.unindentLines(`
|
|
|
|
| 349 |
|
| 350 |
// IMPROVEMENT: Multi-frequency Oscillation (Harmonics)
|
| 351 |
// Primary low-frequency mode (bulk motion)
|
| 352 |
+
float mode1 = cos(time * bounceFrequency) * exp(-time * ${inputs.mode1Decay} * (1.0 - ${inputs.bounceAmount} * 0.9));
|
| 353 |
|
| 354 |
// Secondary high-frequency mode (surface wobble/jiggle)
|
| 355 |
// Higher frequency (2.5x) and faster decay
|
| 356 |
+
float mode2 = cos(time * bounceFrequency * ${inputs.mode2FreqMult}) * exp(-time * ${inputs.mode2Decay} * (1.0 - ${inputs.bounceAmount} * 0.9));
|
| 357 |
|
| 358 |
// Blend the modes (80% bulk, 20% wobble)
|
| 359 |
+
float oscillation = ${inputs.modeMix} * mode1 + (1.0 - ${inputs.modeMix}) * mode2;
|
| 360 |
|
| 361 |
originalPos += bounceOffset * oscillation;
|
| 362 |
|
|
|
|
| 376 |
dragIntensity,
|
| 377 |
bounceAmount,
|
| 378 |
bounceSpeed,
|
| 379 |
+
mode1Decay,
|
| 380 |
+
mode2Decay,
|
| 381 |
+
mode2FreqMult,
|
| 382 |
+
modeMix,
|
| 383 |
}).gsplat;
|
| 384 |
|
| 385 |
// 3. Apply Clipping (on the deformed splat)
|