Kako je Kimi K3 izgradio digitalni potez nalivpera
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.

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:
| Potez | Smjer | Stvarna š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
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.

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
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.

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.