Cómo construyó Kimi K3 un trazo digital de pluma fuente
Queríamos la pluma fuente direccional de Freeform en Lulucat Notes. La especificación era una captura de pantalla de escritura a mano. Después de dos modelos, una pregunta que separó las hipótesis y un plumín elíptico, la pluma de agua escribe como debe. Kimi K3 hizo la investigación, el código y la validación en Fireworks.

Renderizado con el pipeline de Metal de Lulucat Notes del que trata esta publicación.
Lulucat Notes tiene una pluma sencilla y un resaltador. La siguiente herramienta de la hoja de ruta era una pluma de agua: la pluma fuente direccional que conoces de Apple Notes y Freeform, donde los trazos verticales salen gruesos y los horizontales, delgados. La especificación no era un documento, sino una captura de pantalla: tres líneas de escritura a mano con las palabras «pencilkit», «无边记» y «这种有方向的水笔能力» — esta capacidad direccional de pluma de agua.
Al igual que el pipeline de Metal anterior, el trabajo lo realizó Kimi K3, el modelo abierto de Moonshot que corre en Fireworks: la medición, el modelado, el código y la validación. La persona proporcionó la captura de pantalla, respondió una pregunta y evaluó la sensación en un iPad real.
La especificación es una captura de pantalla
Una imagen estática no puede explicar por qué un trazo es delgado. Solo puede mostrar qué tan delgado es y dónde. Por eso el primer paso fue medir. Escaneamos la captura fila por fila y columna por columna, siguiendo el desplazamiento de la línea central de cada trazo para obtener su dirección; luego convertimos el ancho escaneado en el ancho verdadero usando el seno de ese ángulo:
| Trazo | Dirección | Ancho verdadero |
|---|---|---|
| Ascendente de la «l» en «pencilkit» | ≈ 78° | 27.3 px |
| Asta de la «k» en «pencilkit» | ≈ 90° | 28 px |
| Barrido descendente hacia la izquierda de 力 | ≈ 66° | 25.7 px |
| Conectores de la cursiva | ≈ 8° | 11 px |
| Horizontales chinas (横) | ≈ 0° | 6–11 px |
La relación entre lo grueso y lo fino es ≈ 2.5. Ajustar
Versión uno: ancho a partir de la dirección
El primer modelo era el más obvio. Calculaba una dirección para cada punto de entrada, convertía la dirección en ancho mediante la curva ajustada y guardaba el resultado en el radio del punto al momento de capturarlo. La dirección se estimaba de manera causal: un promedio ponderado con decaimiento exponencial sobre los últimos puntos del arco, calculado en el espacio del ángulo doble para que invertir el sentido del recorrido no cancelara la estimación. Solo se utilizan puntos anteriores, de modo que el trazo en vivo y el trazo confirmado coinciden byte por byte.
El constructor pasó su prueba de unidades: los recorridos sintéticos horizontal, vertical, a 45° y de reversa produjeron los anchos teóricos — 0.99, 2.52, 2.00 y 0.99 puntos. El renderizado no requirió código nuevo: un trazo con el radio precalculado es simplemente una cadena de sellos redondos, y nuestro pipeline de point-sprite ya los dibujaba.
En el iPad, a la persona le tomó unos diez segundos descartarlo: «esto es una pluma artística, no la pluma de agua».
Dos historias caben en una imagen
¿Por qué se sentía incorrecto? Había dos explicaciones candidatas y la captura de pantalla no podía diferenciarlas:
- Bloqueo direccional. La geometría del plumín obliga a que los trazos horizontales sean delgados y los verticales gruesos, sin importar qué haga la mano. Eso fue lo que implementó la versión uno.
- Presión y velocidad. La pluma funciona con presión, y el patrón de la muestra es solo dinámica de la escritura a mano: los trazos descendentes reciben presión de manera natural, mientras que los conectores son naturalmente rápidos y ligeros.
Ambas explicaciones producen una captura con horizontales delgados y verticales gruesos. La diferencia está en lo que pasa cuando presionas fuerte un trazo horizontal. La versión uno lo mantiene delgado. Una pluma sensible a la presión lo vuelve grueso. Así que le hicimos una pregunta a la persona: ¿un trazo horizontal presionado con fuerza debería hacerse más grueso?
«No. Los horizontales se mantienen delgados».
Bloqueo direccional confirmado. Pero algo más fallaba, porque la versión uno también estaba bloqueada por dirección.
La respuesta estaba en los extremos del trazo
La siguiente pista apareció en la parte superior de los ascendentes. Al hacer zoom en las astas de la «l» y la «k» de la muestra se observaron dos cosas: un trazo recto mantiene el mismo ancho de principio a fin, y los extremos son cortes diagonales planos, con la forma de un plumín de cincel al levantarse. No son puntos redondos. No son estrechamientos causados por la presión.

Eso era lo que realmente quería decir «sensación de pluma artística». La versión uno modeló el aspecto de la muestra — el ancho como función de la dirección estimada—, pero no la pluma. Un estimador de dirección es un sensor: tiembla con una entrada ruidosa, se atrasa en las esquinas y convierte cada extremo de trazo en un círculo. Un plumín real no tiene ninguno de esos problemas porque no calcula nada. El ancho es geometría.
Versión dos: un plumín elíptico
El modelo final no tiene ningún estimador de dirección. El plumín es una elipse orientada: el eje largo es horizontal y el corto permanece fijo. Los sellos de esta elipse se colocan muy juntos a lo largo del recorrido del trazo, y todo lo demás sale de la geometría:
-
Un trazo horizontal recorre el borde abierto, así que siempre queda con un ancho de
: una línea delgada constante, sin importar la presión. Exactamente la especificación confirmada. -
Un trazo vertical atraviesa todo el eje largo:
, el extremo grueso. -
Un trazo diagonal toma el ancho de la cuerda de la elipse perpendicular al recorrido,
-
Los extremos del trazo son cortes elípticos: los extremos planos con forma de plumín de la muestra, sin agregar trabajo.
-
La presión escala únicamente el eje largo,
, así que aporta volumen de tinta en los trazos descendentes y jamás puede engrosar un horizontal.
Con las mediciones de la muestra conservamos
El renderizado necesitó un fragment shader nuevo y nada más. El formato de vértice — posición, diámetro y color — ya transportaba todo: el diámetro es el eje largo, y el eje corto es un uniform por pasada. El shader evalúa una SDF de elipse con la misma rampa de cobertura de medio píxel que nuestros sellos redondos; así se puede comparar píxel por píxel con la implementación de referencia de Core Graphics (fillEllipse por sello). La validación pasó por el control habitual: un corpus sintético con dos trazos de pluma fuente, renderizados de ambas maneras y comparados píxel por píxel — cero diferencias estructurales, y un trazo horizontal verificado al azar midió 12 px en los dos renderizadores.

La versión uno a la izquierda, la versión dos a la derecha. La misma entrada manuscrita, el mismo pipeline. Los extremos cuentan la historia.
En el iPad, la nueva pluma pasó de inmediato: «好,很好» — Bien. Muy bien.
Conservar el intento fallido
La versión uno no terminó en la basura. Es un pincel interesante por derecho propio; simplemente no es una pluma de agua. Así que se envió como la primera entrada de un nuevo menú de pinceles experimentales, con el nombre que le dio la persona: 漏水的圆珠笔, el bolígrafo que gotea. La barra de herramientas recibió un botón con forma de matraz que abre una lista de texto de los experimentos; agregar el siguiente cuesta una línea en un registro. Un modelo rechazado no es trabajo perdido si puede enviarse como un experimento claramente etiquetado.
Una noche de ciclos
El ciclo completo — medir, modelar, construir, probar en el dispositivo, preguntar, volver a modelar, volver a construir y validar — tomó una noche. Kimi K3 en Fireworks llevó toda la parte técnica del ciclo: idear los escaneos de medición, proponer la pregunta que separaba las hipótesis en vez de adivinar por segunda vez, borrar su propio estimador de dirección cuando la evidencia cambió y ampliar el arnés de diferencias de píxeles antes de tocar la app. La velocidad de inferencia de Fireworks mantuvo el ciclo interactivo: los diffs extensos de Metal y Swift, los scripts de análisis de píxeles y las herramientas para corpus llegaban suficientemente rápido como para que el cuello de botella restante fuera el criterio humano.
El patrón de colaboración fue el mismo del artículo sobre el pipeline de Metal, y volvió a funcionar: el modelo es rápido y preciso; la persona conserva el criterio estético y la verificación de extremo a extremo. Una sola frase de retroalimentación sobre la sensación — «pluma artística, no pluma de agua» — bastó para que el modelo encontrara el error exacto de modelado y lo reemplazara por un diseño más simple.
El modelo correcto terminó siendo más pequeño que el equivocado. La versión dos se envió con menos piezas móviles que la versión uno: sin estimador, sin ventana de suavizado y sin exponente ajustado. El plumín no calcula el ancho. El plumín es el ancho.