Changeset 0490abe in Klonkt


Ignore:
Timestamp:
08/20/2026 11:32:11 AM (3 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
6fdceed
Parents:
3ccca13
Message:

Reader: inertia scales with the gesture — more on a nudge, less on a flick

Lenis reads lerp, touchInertiaExponent and syncTouchLerp at event time
(checked in the vendor file), so they can be set per gesture. A small
gesture now gets the softer brake and the higher exponent, a fast one
the firmer brake and a lower exponent.

The inversion is deliberate: with distance = |velocity| exponent, a
high exponent carries a hard flick far but shrinks a gentle one — which
is exactly backwards from what a nudge should feel like. Six numbers up
top do the tuning; the thresholds next to them define small and fast.

Co-Authored-By: Claude Fable 5 <noreply@…>

Location:
src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/assets/js/mod/read.js

    r3ccca13 r0490abe  
    350350    // Controleer een optienaam in src/assets/vendor/lenis.mjs voor je hem zet.
    351351    //
    352     // Robin wilde langer en sneller uitrollen zonder remgevoel, dus de exponent
    353     // gaat omhoog (een stevige flick draagt daarmee ruim vier tot zes keer zo
    354     // ver) en de lerp gaat juist boven de standaard: hij legt die afstand vlot
    355     // af in plaats van er stroperig naartoe te kruipen.
     352    // DIT ZIJN NU STARTWAARDEN, geen vaste stand meer: stemTraagheidAf()
     353    // verderop verzet ze bij elk gebaar, klein gebaar meer naijlen dan groot
     354    // (Robin, 21-8). Wat hier staat geldt dus alleen tot de eerste veeg.
    356355    ...(OP_TOUCH.matches ? { syncTouchLerp: 0.09, touchInertiaExponent: 2.2 } : {}),
    357356    autoRaf: true,
     
    491490}
    492491
    493 function opWiel(e) { if (Math.abs(e.deltaY) > 1) nieuwGebaar(e.deltaY > 0); }
     492/**
     493 * TRAAGHEID NAAR DE MAAT VAN HET GEBAAR (Robin, 21-8: "bij een korte scroll wat
     494 * meer inertia, bij een snelle juist wat minder").
     495 *
     496 * Dit kan omdat Lenis deze drie opties op het moment van de GEBEURTENIS leest,
     497 * niet bij het opstarten (gecontroleerd in vendor/lenis.mjs):
     498 *   options.lerp                 bij een wiel -- lager = langer naijlen
     499 *   options.touchInertiaExponent bij touchend -- afstand = |snelheid| ** exponent
     500 *   options.syncTouchLerp        bij touchend -- hoe hard hij daarna remt
     501 * Ze zijn dus per gebaar te verzetten, en dat is precies wat hier gebeurt.
     502 *
     503 * De omkering zit in de exponent. Bij een snelheid boven de 1 draagt een HOGERE
     504 * exponent veel verder: met 2.2 vliegt een harde veeg er ruim vanuit, terwijl
     505 * een zachte veeg er juist door verschrompelt. Vandaar dat een klein gebaar nu
     506 * de hoge exponent en de zachte rem krijgt, en een groot gebaar de lage
     507 * exponent en een stevigere rem.
     508 *
     509 * Draaien doe je aan deze zes getallen; de grenzen eronder zeggen wat "klein"
     510 * en "groot" is.
     511 */
     512const WIEL_KLEIN = 40, WIEL_GROOT = 240;   // |deltaY| van een wielstap
     513const RAAK_KLEIN = 4, RAAK_GROOT = 26;     // |snelheid| van Lenis bij een veeg
     514const WIEL_LERP_KLEIN = 0.12, WIEL_LERP_GROOT = 0.30;
     515const RAAK_LERP_KLEIN = 0.06, RAAK_LERP_GROOT = 0.13;
     516const RAAK_EXP_KLEIN = 2.4, RAAK_EXP_GROOT = 1.4;
     517
     518const meng = (a, b, t) => a + (b - a) * Math.min(1, Math.max(0, t));
     519
     520function stemTraagheidAf(sterkte, klein, groot, opTouch) {
     521  if (!lenis) return;
     522  const t = (sterkte - klein) / (groot - klein);
     523  if (opTouch) {
     524    lenis.options.syncTouchLerp = meng(RAAK_LERP_KLEIN, RAAK_LERP_GROOT, t);
     525    lenis.options.touchInertiaExponent = meng(RAAK_EXP_KLEIN, RAAK_EXP_GROOT, t);
     526  } else {
     527    lenis.options.lerp = meng(WIEL_LERP_KLEIN, WIEL_LERP_GROOT, t);
     528  }
     529}
     530
     531function opWiel(e) {
     532  if (Math.abs(e.deltaY) <= 1) return;
     533  stemTraagheidAf(Math.abs(e.deltaY), WIEL_KLEIN, WIEL_GROOT, false);
     534  nieuwGebaar(e.deltaY > 0);
     535}
    494536let raakY = 0;
    495537function opRaakStart(e) { if (e.touches && e.touches[0]) raakY = e.touches[0].clientY; }
     
    500542  // duim die stilstaat.
    501543  if (Math.abs(y - raakY) > 3) { nieuwGebaar(y < raakY); raakY = y; }
     544  // De snelheid van NU is die van het laatste stukje veeg, en dat is de
     545  // snelheid waarmee de vinger straks loslaat. Lenis leest de exponent pas bij
     546  // touchend, dus wat we hier zetten geldt voor precies deze flick.
     547  if (lenis) stemTraagheidAf(Math.abs(lenis.velocity), RAAK_KLEIN, RAAK_GROOT, true);
    502548}
    503549function opToets(e) {
  • src/views/shell.ejs

    r3ccca13 r0490abe  
    505505  // Eén nummer voor de hele map. Te vaak bumpen kost één download; te weinig
    506506  // bumpen kost een bugfix die nooit aankomt.
    507   var MOD_V = 49;
     507  var MOD_V = 50;
    508508
    509509  // name -> 1 (aan het laden) of de module-namespace (geladen). Een module
Note: See TracChangeset for help on using the changeset viewer.