Lulucat

Kako je Kimi K3 izgradio digitalni potez nalivpera

Gaoge ZhangGaoge Zhang

U Lulucat Notes htjeli smo usmjereno nalivpero iz Freeforma. Specifikacija je bila snimka zaslona rukopisa. Nakon dva modela, jednog pitanja koje ih razlikuje i eliptičnog vrha, vodeno pero piše kako treba. Kimi K3 obavio je istraživanje, napisao kod i proveo validaciju na Fireworksu.

Ažurirano

Rukom pisani engleski kurziv s riječima „fountain pen” iznad retka kineske kaligrafije, nacrtan nalivperom s eliptičnim vrhom na krem-papiru: debeo u okomitim potezima, tanak u vodoravnima.

Renderirano Metalovim cjevovodom Lulucat Notesa o kojem govori ovaj tekst.

Lulucat Notes ima običnu olovku i marker za isticanje. Sljedeći alat na planu bio je vodeno pero — usmjereno nalivpero koje poznajete iz Apple Notesa i Freeforma, pri kojem okomiti potezi ispadaju debeli, a vodoravni tanki. Specifikacija tog alata nije bila dokument. Bila je snimka zaslona: tri retka rukopisa, riječi „pencilkit”, „无边记” i „这种有方向的水笔能力” — ta sposobnost usmjerenog vodenog pera.

Kao i kod ranijeg Metalova cjevovoda, posao je obavio Kimi K3, Moonshotov otvoreni model koji radi na Fireworksu: mjerenje, modeliranje, kod i validaciju. Osoba je dostavila snimku zaslona, odgovorila na jedno pitanje i procijenila dojam na pravom iPadu.

Specifikacija je snimka zaslona

Statična slika ne može vam reći zašto je potez tanak. Može samo pokazati koliko je tanak i gdje. Zato je prvi korak bilo mjerenje. Skenirali smo snimku zaslona redak po redak i stupac po stupac, prateći pomak središnje linije svakog poteza da bismo dobili njegov smjer, a zatim širinu skeniranja pretvorili u stvarnu širinu pomoću sinusa tog kuta:

PotezSmjerStvarna širina
Uzlazni potez slova „l”, „pencilkit”≈ 78°27.3 px
Stup slova „k”, „pencilkit”≈ 90°28 px
Zamah znaka 力 koji pada ulijevo≈ 66°25.7 px
Kurzivni spojni potezi≈ 8°11 px
Kineske vodoravne crte (横)≈ 0°6–11 px

Omjer debelog i tankog iznosi ≈ 2.5. Uklapanje u točku od 66° daje — gotovo linearnu ovisnost o , s vrhuncem na okomitoj osi. U biti, to je koso pero: vodoravni prorez koji vodoravno pisanje nikad ne otvori.

Verzija jedna: širina iz smjera

Prvi je model bio očit. Za svaku ulaznu točku izračunaj smjer, preslikaj ga u širinu pomoću prilagođene krivulje i u trenutku hvatanja upiši rezultat u polumjer točke. Smjer se procjenjivao uzročno — kao eksponencijalno opadajući ponderirani prosjek posljednjih nekoliko točaka luka, izračunat u prostoru dvostrukog kuta kako promjena smjera kretanja ne bi poništila procjenu. Koriste se samo prethodne točke, pa se potez uživo i potvrđeni potez podudaraju bajt po bajt.

Graditelj je prošao provjeru jedinica: sintetičke vodoravne, okomite, 45° i obrnute putanje dale su teorijske širine — 0.99, 2.52, 2.00 i 0.99 točaka. Renderiranje nije zahtijevalo nikakav novi kod: potez s unaprijed upisanim polumjerom samo je niz okruglih otisaka, a naš point-sprite cjevovod već ih je znao crtati.

Na iPadu osobi je trebalo otprilike deset sekundi da ga odbaci: „ovo je umjetnička olovka, a ne vodeno pero”.

Jedna slika, dva moguća objašnjenja

Zašto se doimao pogrešnim? Postojala su dva moguća objašnjenja, a snimka zaslona nije ih mogla razdvojiti:

  • Zaključavanje smjera. Geometrija vrha prisiljava vodoravne poteze da budu tanki, a okomite debeli, bez obzira na to što ruka radi. To je implementirala verzija jedna.
  • Pritisak i brzina. Pero je upravljano pritiskom, a uzorak je samo dinamika rukopisa: potezi prema dolje prirodno su jače pritisnuti, a spojni potezi prirodno brzi i lagani.

Oba objašnjenja daju snimku s tankim vodoravnim i debelim okomitim potezima. Razlika se vidi u tome što se dogodi kad snažno pritisnete vodoravni potez. Verzija jedna ostavlja ga tankim. Pero osjetljivo na pritisak učinilo bi ga debelim. Zato smo osobi postavili jedno pitanje: treba li se vodoravni potez na koji se jako pritisne podebljati?

„Ne. Vodoravni ostaju tanki.”

Zaključavanje smjera bilo je potvrđeno. Ali nešto drugo nije valjalo, jer je i verzija jedna bila zaključana na smjer.

Odgovor je bio na krajevima poteza

Sljedeći se trag nalazio na vrhu uzlaznih poteza. Povećanje stupova slova „l” i „k” u uzorku pokazalo je dvije stvari: ravan potez zadržava jednu širinu od početka do kraja, a njegovi su krajevi ravni kosi rezovi — oblik dlijetastog vrha dok se podiže. Nisu to okrugle točke. Nisu to suženja od pritiska.

Krupni izrez dvaju rukom pisanih uzlaznih poteza iz uzorka; svaki završava pri vrhu ravnim kosim rezom, a debljina mu je jednolika cijelom dužinom.

To je ono što je „dojam umjetničke olovke” zapravo značio. Verzija jedna modelirala je izgled uzorka — širinu kao funkciju procijenjenog smjera — ali ne i pero. Procjenitelj smjera je senzor: podrhtava na šumnom ulazu, kasni oko kutova i svaki kraj poteza zaobljuje u krug. Pravi vrh nema nijedan od tih problema jer ništa ne računa. Širina je geometrija.

Verzija dva: eliptični vrh

Konačni model uopće nema procjenitelj smjera. Vrh je usmjerena elipsa: duga je os vodoravna, a kratka je os fiksna. Otisci te elipse gusto se postavljaju duž putanje poteza, a sve ostalo proizlazi iz geometrije:

  • Vodoravni potez ide uz otvoreni rub, pa mu je širina uvijek — stalna tanka crta, pri bilo kojem pritisku. Točno prema potvrđenoj specifikaciji.

  • Okomiti potez prelazi cijelu dugu os: , debeli kraj.

  • Kosi potez uzima širinu tetive elipse okomito na smjer kretanja,

  • Krajevi poteza eliptični su rezovi — ravni krajevi u obliku vrha kakvi se vide u uzorku, bez dodatnog rada.

  • Pritisak mijenja samo dugu os, , pa dodaje volumen tinte potezima prema dolje i nikada ne može podebljati vodoravni potez.

Iz mjerenja uzorka zadržali smo pt i pt, isti omjer od 2.5. Otisci su duž luka razmaknuti 0.5 točaka; s kratkim polumjerom od 0.55 točaka, valovitost ruba u najgorem slučaju iznosi približno desetinu piksela.

Renderiranje je zahtijevalo jedan novi fragment shader i ništa više. Format vrha — položaj, promjer, boja — već je sadržavao sve: promjer je duga os, a kratka os je uniform po prolazu. Shader izračunava SDF elipse istom rampom pokrivanja od pola piksela kao i naši okrugli otisci, pa je usporediv na razini piksela s referentnom implementacijom Core Graphicsa (fillEllipse po otisku). Validacija je prošla uobičajeni postupak: sintetički korpus s dva poteza nalivperom renderiran je na oba načina i uspoređen piksel po piksel — nula strukturnih razlika, a vodoravni potez provjeren nasumičnim odabirom izmjerio je 12 px u oba renderera.

Dva prikaza iste rukom pisane riječi „fountain” jedan uz drugi: lijevi je nacrtan okruglim otiscima s promjerom skaliranim prema smjeru i pokazuje zaobljene krajeve, a desni eliptičnim otiscima s ravnim krajevima odrezanima vrhom i stabilnijom širinom.

Verzija jedna lijevo, verzija dva desno. Isti rukopisni unos, isti cjevovod. Krajevi pričaju priču.

Na iPadu je novo pero odmah prošlo: „好,很好” — Dobro. Vrlo dobro.

Zadržati promašaj

Verzija jedna nije završila u smeću. To je zanimljiva četkica — samo nije vodeno pero. Zato je isporučena kao prva stavka novog izbornika eksperimentalnih četkica, pod imenom koje joj je dala osoba: 漏水的圆珠笔, kuglična olovka koja curi. Alatna traka dobila je gumb u obliku tikvice koji otvara tekstni popis eksperimenata; dodavanje sljedećeg košta jedan redak u registru. Odbačeni model nije uzaludan rad ako se može isporučiti kao jasno označen eksperiment.

Jedna večer iteracija

Cijeli luk — izmjeri, modeliraj, izgradi, isprobaj na uređaju, postavi pitanje, ponovno modeliraj, ponovno izgradi, validiraj — trajao je jednu večer. Kimi K3 na Fireworksu vodio je cijeli tehnički dio petlje: osmislio je mjerna skeniranja, predložio pitanje koje razlikuje objašnjenja umjesto da ponovno nagađa, obrisao vlastiti procjenitelj smjera kad su se dokazi promijenili i proširio pixel-diff harness prije nego što je dirao aplikaciju. Brzina zaključivanja na Fireworksu održala je petlju interaktivnom — dugački Metalovi i Swiftovi diffovi, skripte za analizu piksela i alati za korpus stizali su dovoljno brzo da je preostalo usko grlo bio ljudski sud.

Obrazac suradnje bio je isti kao u tekstu o Metalovu cjevovodu i ponovno se pokazao dobrim: model je brz i precizan; osoba je odgovorna za ukus i provjeru od početka do kraja. Jedna rečenica povratne informacije o dojmu — „umjetnička olovka, ne vodeno pero” — bila je dovoljna da model pronađe točnu pogrešku u modeliranju i zamijeni je jednostavnijim dizajnom.

Pravi se model pokazao manjim od pogrešnog. Verzija dva isporučena je s manje pokretnih dijelova nego verzija jedna — bez procjenitelja, bez prozora zaglađivanja i bez prilagođenog eksponenta. Vrh ne računa širinu. Vrh jest širina.