Lulucat

Hvordan Kimi K3 bygde en digital fyllepennstrek

Gaoge ZhangGaoge Zhang

Vi ville ha Freeforms retningsbestemte fyllepenn i Lulucat Notes. Spesifikasjonen var et skjermbilde av håndskrift. Etter to modeller, ett spørsmål som skilte mellom dem og en ellipsepennspiss skriver vannpennen slik den skal. Forskningen, koden og valideringen ble gjort av Kimi K3 på Fireworks.

Oppdatert

Håndskrevet engelsk kursiv som leses «fountain pen» over en linje med kinesisk kalligrafi, tegnet med en fyllepenn med ellipsespiss på kremfarget papir: tykke loddrette streker, tynne vannrette streker.

Gjengitt av Lulucat Notes Metal-pipelinen dette innlegget handler om.

Lulucat Notes har en vanlig penn og en merkepenn. Det neste verktøyet på veikartet var en vannpenn — den retningsbestemte fyllepennen du kjenner fra Apple Notes og Freeform, der loddrette strøk blir tykke og vannrette strøk blir tynne. Spesifikasjonen for dette verktøyet var ikke et dokument. Den var et skjermbilde: tre linjer med håndskrift, ordene «pencilkit», «无边记» og «这种有方向的水笔能力» — denne retningsbestemte vannpenneevnen.

I likhet med Metal-pipelinen før det ble arbeidet gjort av Kimi K3, Moonshots åpne modell som kjører på Fireworks: målingene, modelleringen, koden og valideringen. Mennesket leverte skjermbildet, svarte på ett spørsmål og vurderte følelsen på en ekte iPad.

Spesifikasjonen er et skjermbilde

Et statisk bilde kan ikke fortelle deg hvorfor en strek er tynn. Det kan bare fortelle deg hvor tynn den er, og hvor. Derfor var det første steget å måle. Vi skannet skjermbildet rad for rad og kolonne for kolonne, fulgte driften i midtlinjen til hver strek for å finne retningen, og konverterte deretter skannebredden til sann bredde ved hjelp av sinus til denne vinkelen:

StrekRetningSann bredde
Oppstrek på «l», «pencilkit»≈ 78°27.3 px
Stamme på «k», «pencilkit»≈ 90°28 px
Venstrefallende sveip i 力≈ 66°25.7 px
Kursive forbindelser≈ 8°11 px
Kinesiske vannrette streker (横)≈ 0°6–11 px

Forholdet mellom tykk og tynn er ≈ 2.5. Når vi tilpasser til punktet ved 66°, får vi — nesten lineært i , med toppunkt på den loddrette aksen. I praksis en kursiv pennspiss: en vannrett spalte som vannrett skrift aldri åpner.

Versjon én: bredde fra retning

Den første modellen var den åpenbare. Beregn en retning for hvert inngangspunkt, map retningen til bredde gjennom den tilpassede kurven, og bak resultatet inn i punktets radius ved fanging. Retningen ble estimert kausalt — et eksponentielt avtakende veid gjennomsnitt over de siste få punktene på buen, beregnet i rommet for doble vinkler slik at en vending i bevegelsen ikke opphever estimatet. Bare tidligere punkter brukes, så den levende streken og den lagrede streken stemmer byte for byte.

Byggeren besto enhetstesten sin: syntetiske vannrette, loddrette, 45°- og vendingsbaner bakte alle inn de teoretiske breddene — 0.99, 2.52, 2.00 og 0.99 punkter. Rendering trengte ikke ny kode i det hele tatt: en strek med innbakt radius er bare en kjede av runde stempler, og point-sprite-pipelinen vår tegnet dem allerede.

På iPad-en brukte mennesket rundt ti sekunder på å avvise den: «Dette er en kunstpenn, ikke vannpennen.»

To forklaringer passer til ett bilde

Hvorfor føltes det feil? Det fantes to mulige forklaringer, og skjermbildet kunne ikke skille dem:

  • Retningslås. Pennspissgeometrien tvinger vannrette streker til å være tynne og loddrette streker til å være tykke, uansett hva hånden gjør. Det var det versjon én implementerte.
  • Trykk og fart. Pennen er trykkstyrt, og mønsteret i prøven er bare håndskriftdynamikk: nedstrøk blir naturlig nok presset, mens forbindelser naturlig nok blir raske og lette.

Begge forklaringene gir et skjermbilde med tynne vannrette og tykke loddrette streker. Forskjellen er hva som skjer når du trykker hardt på en vannrett strek. Versjon én holder den tynn. En trykkpenn gjør den tykk. Derfor stilte vi mennesket ett spørsmål: Skal en vannrett strek som trykkes hardt, bli tykkere?

«Nei. Vannrette streker forblir tynne.»

Retningslåsen var bekreftet. Men noe annet var fortsatt galt, for versjon én var også retningslåst.

Svaret lå i strekendene

Det neste sporet lå øverst på oppstrekene. Da vi zoomet inn på «l»- og «k»-stammene i prøven, så vi to ting: En rett strek holder samme bredde fra start til slutt, og strekendene er flate diagonale kutt — formen til en meiselpennspiss som løftes fra papiret. Ikke runde prikker. Ikke trykkavsmalninger.

Et nærbilde av to håndskrevne oppstreksstammer fra prøven. Begge ender øverst i et flatt diagonalt kutt, med jevn tykkelse langs stammen.

Det var dette «kunstpennfølelsen» faktisk betydde. Versjon én modellerte utseendet til prøven — bredde som en funksjon av estimert retning — men ikke pennen. En retningsestimator er en sensor: Den dirrer på støyende inndata, henger etter i hjørner og avrunder hver strekende til en sirkel. En ekte pennspiss har ingen av disse problemene, fordi den beregner ingenting. Bredden er geometri.

Versjon to: en ellipsepennspiss

Den endelige modellen har ingen retningsestimator. Pennspissen er en orientert ellipse: langaksen er vannrett, kortaksen er fast. Stempler av denne ellipsen plasseres tett langs strekens bane, og alt annet følger av geometrien:

  • En vannrett strek beveger seg langs den åpne kanten, så den blir alltid bred — en konstant tynn linje ved ethvert trykk. Akkurat den bekreftede spesifikasjonen.

  • En loddrett strek krysser hele langaksen: , den tykke enden.

  • En diagonal strek får ellipsens kordevidde vinkelrett på bevegelsesretningen,

  • Strekendene blir elliptiske kutt — de flate, pennspissformede endene fra prøven, uten ekstra arbeid.

  • Trykk skalerer bare langaksen, , så trykk gir deg mer blekkvolum i nedstrøk og kan aldri gjøre en vannrett strek tykkere.

Fra målingene av prøven beholdt vi pt og pt, det samme 2.5-forholdet. Stemplene står 0.5 punkter fra hverandre langs buen. Med en kort radius på 0.55 punkter blir den verste kantrippelen omtrent en tiendedels piksel.

Rendering trengte én ny fragmentshader og ingenting mer. Vertexformatet — posisjon, diameter, farge — bar allerede på alt: diameteren er langaksen, og kortaksen er en uniform per pass. Shaderen evaluerer en ellipse-SDF med den samme halvpiksel-dekningsrampen som de runde stemplene våre. Det er det som gjør den piksel-sammenlignbar med Core Graphics-referanseimplementasjonen (fillEllipse per stempel). Valideringen gikk gjennom den vanlige porten: et syntetisk korpus med to fyllepennstreker ble rendret på begge måter og sammenlignet piksel for piksel — null strukturelle forskjeller, og en vannrett strek som ble kontrollert med stikkprøve målte 12 px i begge rendererne.

To gjengivelser av det samme håndskrevne ordet «fountain» side om side: til venstre tegnet med runde stempler med retningsskalert diameter, som viser avrundede ender; til høyre med ellipsestempler, som viser flate pennespisskuttede ender og jevnere bredde.

Versjon én til venstre, versjon to til høyre. Samme håndskrevne inndata, samme pipeline. Endene forteller hele historien.

På iPad-en besto den nye pennen umiddelbart: «好,很好» — bra. Veldig bra.

Å ta vare på feilskuddet

Versjon én havnet ikke i søpla. Den er en interessant pensel — bare ikke en vannpenn. Derfor ble den levert som første oppføring i en ny meny for eksperimentelle pensler, under navnet mennesket ga den: 漏水的圆珠笔, den lekkende kulepennen. Verktøylinjen fikk en kolbeknapp som åpner en tekstliste med eksperimenter. Å legge til det neste koster én linje i et register. En forkastet modell er ikke bortkastet arbeid når den kan leveres som et tydelig merket eksperiment.

En kveld med løkker

Hele forløpet — måle, modellere, bygge, prøve på enheten, spørre, modellere på nytt, bygge på nytt, validere — tok én kveld. Kimi K3 på Fireworks drev hele den tekniske siden av løkken: utforme måleskannene, foreslå spørsmålet som kunne skille mellom dem i stedet for å gjette en gang til, slette sin egen retningsestimator da bevisene snudde, og utvide pixel-diff-harnessen før appen ble rørt. Fireworks’ inferensfart holdt løkken interaktiv — lange Metal- og Swift-differ, pikselanalyseskript og korpusverktøy kom alle raskt nok til at den gjenværende flaskehalsen var menneskelig dømmekraft.

Samarbeidsmønsteret var det samme som i innlegget om Metal-pipelinen, og det holdt også her: modellen er rask og presis; mennesket eier smak og ende-til-ende-verifisering. Én setning med følelsesbasert tilbakemelding — «kunstpenn, ikke vannpenn» — var nok til at modellen fant den nøyaktige modelleringsfeilen og erstattet den med et enklere design.

Den riktige modellen viste seg å være mindre enn den gale. Versjon to ble levert med færre bevegelige deler enn versjon én — ingen estimator, intet utjevningsvindu, ingen tilpasset eksponent. Pennspissen beregner ikke bredden. Pennspissen er bredden.