Com Kimi K3 va desenvolupar tot sol un traç de ploma estilogràfica digital
Volíem la ploma estilogràfica direccional del Freeform a Lulucat Notes. L'especificació era una captura de pantalla d'escriptura a mà. Després de dos models, una pregunta discriminant i una punta el·líptica, la ploma d'aigua escriu com cal. Kimi K3 va fer la recerca, el codi i la validació a Fireworks.

Renderitzat per la pipeline Metal de Lulucat Notes de què parla aquest article.
Lulucat Notes té un bolígraf senzill i un marcador. La següent eina de la fulla de ruta era una ploma d’aigua — la ploma estilogràfica direccional que coneixeu d’Apple Notes i Freeform, on els traços verticals surten gruixuts i els horitzontals, prims. L’especificació d’aquesta eina no era cap document. Era una captura de pantalla: tres línies d’escriptura a mà, les paraules «pencilkit», «无边记» i «这种有方向的水笔能力» — aquesta capacitat direccional de ploma d’aigua.
Com ja havia passat amb la pipeline Metal, la feina la va fer Kimi K3, el model obert de Moonshot que s’executa a Fireworks: mesurament, modelatge, codi i validació. La persona va aportar la captura, va respondre una pregunta i va jutjar la sensació en un iPad real.
L’especificació és una captura de pantalla
Una imatge estàtica no pot dir-vos per què un traç és prim. Només pot dir-vos com de prim és i on es troba. Per això, el primer pas va ser mesurar. Vam escanejar la captura fila per fila i columna per columna, seguint la deriva de la línia central de cada traç per obtenir-ne la direcció, i després vam convertir l’amplada escanejada en amplada real amb el sinus d’aquell angle:
| Traç | Direcció | Amplada real |
|---|---|---|
| Ascendent de la «l», «pencilkit» | ≈ 78° | 27.3 px |
| Asta de la «k», «pencilkit» | ≈ 90° | 28 px |
| Escombrada descendent cap a l’esquerra de 力 | ≈ 66° | 25.7 px |
| Enllaços de la cursiva | ≈ 8° | 11 px |
| Horitzontals xinesos (横) | ≈ 0° | 6–11 px |
La relació entre gruixut i prim és ≈ 2.5. Ajustar
Versió u: amplada a partir de la direcció
El primer model era el més evident. Calcular una direcció per a cada punt d’entrada, transformar la direcció en amplada mitjançant la corba ajustada i incorporar el resultat al radi del punt en el moment de capturar-lo. La direcció s’estimava causalment — una mitjana ponderada amb decreixement exponencial dels últims punts de l’arc, calculada en l’espai d’angle doble perquè una inversió del recorregut no anul·lés l’estimació. Només s’utilitzen punts anteriors, de manera que el traç en directe i el traç confirmat coincideixen byte a byte.
El constructor va superar la seva comprovació unitària: els camins sintètics horitzontal, vertical, de 45° i d’inversió van incorporar totes les amplades teòriques — 0.99, 2.52, 2.00 i 0.99 punts. La renderització no necessitava gens de codi nou: un traç amb el radi incorporat només és una cadena de segells rodons, i la nostra pipeline de point-sprite ja els dibuixava.
A l’iPad, la persona va trigar uns deu segons a rebutjar-lo: «això és una ploma d’art, no la ploma d’aigua».
Dues explicacions encaixen en una sola imatge
Per què feia una sensació equivocada? Hi havia dues explicacions candidates, i la captura de pantalla no les podia distingir:
- Bloqueig de direcció. La geometria de la punta obliga els horitzontals a ser prims i els verticals, gruixuts, faci el que faci la mà. Això és el que implementava la versió u.
- Pressió i velocitat. La ploma funciona amb la pressió, i el patró de la mostra és només la dinàmica de l’escriptura a mà: les baixades es fan pressionant de manera natural, i els enllaços són naturalment ràpids i lleugers.
Totes dues explicacions produeixen una captura amb horitzontals prims i verticals gruixuts. La diferència és què passa quan premeu fort sobre un traç horitzontal. La versió u el manté prim. Una ploma sensible a la pressió el fa gruixut. Per això vam fer a la persona una pregunta: un horitzontal sobre el qual es pressiona fort s’hauria de fer més gruixut?
«No. Els horitzontals es mantenen prims.»
Bloqueig de direcció confirmat. Però encara hi havia alguna cosa que no funcionava, perquè la versió u també estava bloquejada per la direcció.
La resposta era als extrems dels traços
La pista següent era a la part superior dels ascendents. En ampliar les astes de la «l» i la «k» de la mostra es veien dues coses: un traç recte conserva una amplada des de l’inici fins al final, i els extrems dels traços són talls diagonals plans — la forma d’una punta de cisell quan s’aixeca. No són punts rodons. No són afinaments per pressió.

Això és el que volia dir realment la «sensació de ploma d’art». La versió u modelava l’aspecte de la mostra — l’amplada com a funció de la direcció estimada — però no la ploma. Un estimador de direcció és un sensor: tremola amb una entrada sorollosa, va tard a les cantonades i converteix cada extrem de traç en un cercle. Una punta real no té cap d’aquests problemes, perquè no calcula res. L’amplada és geometria.
Versió dos: una punta el·líptica
El model final no té cap estimador de direcció. La punta és una el·lipse orientada: l’eix llarg és horitzontal i el curt és fix. Els segells d’aquesta el·lipse es col·loquen densament al llarg del recorregut del traç, i tota la resta surt de la geometria:
-
Un traç horitzontal avança per la vora oberta, de manera que sempre surt amb una amplada de
— una línia prima constant, sigui quina sigui la pressió. És exactament l’especificació confirmada. -
Un traç vertical travessa tot l’eix llarg:
, l’extrem gruixut. -
Un traç diagonal pren l’amplada de la corda de l’el·lipse perpendicular al moviment,
-
Els extrems dels traços són talls el·líptics — els extrems plans amb forma de punta de la mostra, sense cap cost addicional.
-
La pressió només escala l’eix llarg,
, de manera que la pressió aporta volum de tinta als traços descendents i mai no pot fer més gruixut un horitzontal.
A partir de les mesures de la mostra vam conservar
La renderització va necessitar un sol fragment shader nou i res més. El format de vèrtex — posició, diàmetre, color — ja contenia tota la informació: el diàmetre és l’eix llarg i l’eix curt és un uniform per passada. El shader avalua una SDF d’el·lipse amb la mateixa rampa de cobertura de mig píxel que els nostres segells rodons; així es pot comparar a nivell de píxel amb la implementació de referència de Core Graphics (fillEllipse per segell). La validació va passar per la porta habitual: un corpus sintètic amb dos traços de ploma, renderitzats de totes dues maneres i comparats píxel a píxel — zero diferències estructurals, i un traç horitzontal comprovat puntualment mesurava 12 px en tots dos renderitzadors.

La versió u a l’esquerra, la versió dos a la dreta. La mateixa entrada escrita a mà, la mateixa pipeline. Els extrems expliquen la història.
A l’iPad, la ploma nova va passar immediatament: «好,很好» — bé. Molt bé.
Conservar l’error
La versió u no va anar a la paperera. És un pinzell realment interessant — senzillament no és una ploma d’aigua. Per això es va publicar com la primera entrada d’un nou menú de pinzells experimentals, amb el nom que li va donar la persona: 漏水的圆珠笔, el bolígraf que perd tinta. La barra d’eines va obtenir un botó de matràs que obre una llista de text d’experiments; afegir-hi el següent costa una línia en un registry. Un model rebutjat no és feina malgastada si es pot publicar com un experiment clarament etiquetat.
Un vespre de bucles
Tot el recorregut — mesurar, modelar, construir, provar al dispositiu, preguntar, remodelar, reconstruir, validar — va ocupar un vespre. Kimi K3 a Fireworks no es va limitar a escriure codi; va portar tota la part tècnica del bucle: idear els escanejos de mesura, proposar la pregunta discriminant en lloc de tornar a endevinar, eliminar el seu propi estimador de direcció quan les proves van canviar i ampliar el pixel-diff harness abans de tocar l’aplicació. La velocitat d’inferència de Fireworks va mantenir el bucle interactiu — els diffs llargs de Metal i Swift, els scripts d’anàlisi de píxels i les eines de corpus van arribar prou ràpid perquè el coll d’ampolla es mantingués on toca: el judici humà.
El patró de col·laboració era el mateix que havíem descrit a l’article sobre la pipeline Metal, i es va tornar a confirmar: el model és ràpid i precís; la persona conserva el criteri estètic i la verificació d’extrem a extrem. Una sola frase de comentari basat en la sensació — «ploma d’art, no ploma d’aigua» — va bastar perquè el model localitzés l’error exacte de modelatge i el substituís per un disseny més senzill.
El model correcte va resultar ser més petit que l’equivocat. La versió dos es va publicar amb menys peces mòbils que la versió u — sense estimador, sense finestra de suavitzat i sense exponent ajustat. La punta no calcula l’amplada. La punta és l’amplada.