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
Files changed (1) hide show
  1. js/app.js +22 -6
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 * 2.0 * (1.0 - ${inputs.bounceAmount} * 0.9));
341
 
342
  // Secondary high-frequency mode (surface wobble/jiggle)
343
  // Higher frequency (2.5x) and faster decay
344
- float mode2 = cos(time * bounceFrequency * 2.5) * exp(-time * 4.0 * (1.0 - ${inputs.bounceAmount} * 0.9));
345
 
346
  // Blend the modes (80% bulk, 20% wobble)
347
- float oscillation = 0.8 * mode1 + 0.2 * mode2;
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)