Bagaimana Kimi K3 Membangun Goresan Pena Stilograf Digital
Kami ingin menghadirkan pena stilograf berarah dari Freeform ke Lulucat Notes. Spesifikasinya adalah sebuah tangkapan layar tulisan tangan. Setelah dua model, satu pertanyaan pembeda, dan sebuah mata pena elips, pena air itu menulis sebagaimana mestinya. Riset, kode, dan validasi dikerjakan oleh Kimi K3 di Fireworks.

Dirender oleh pipeline Metal Lulucat Notes yang menjadi topik tulisan ini.
Lulucat Notes memiliki pena biasa dan stabilo. Alat berikutnya dalam roadmap adalah pena air — pena stilograf berarah yang Anda kenal dari Apple Notes dan Freeform, yang menghasilkan goresan vertikal tebal dan goresan horizontal tipis. Spesifikasi alat ini bukan sebuah dokumen. Spesifikasinya adalah tangkapan layar: tiga baris tulisan tangan, dengan kata-kata “pencilkit”, “无边记”, dan “这种有方向的水笔能力” — kemampuan pena air berarah ini.
Seperti pipeline Metal sebelumnya, pekerjaan ini dilakukan oleh Kimi K3, model terbuka milik Moonshot yang berjalan di Fireworks: pengukuran, pemodelan, kode, dan validasi. Manusia menyediakan tangkapan layar, menjawab satu pertanyaan, lalu menilai rasanya pada iPad sungguhan.
Spesifikasinya adalah tangkapan layar
Gambar statis tidak dapat memberi tahu mengapa sebuah goresan tipis. Gambar itu hanya dapat menunjukkan setipis apa goresan tersebut dan di mana letaknya. Jadi langkah pertama adalah pengukuran. Kami memindai tangkapan layar baris demi baris dan kolom demi kolom, melacak pergeseran garis tengah setiap goresan untuk mendapatkan arahnya, lalu mengubah lebar hasil pemindaian menjadi lebar sebenarnya menggunakan sinus sudut tersebut:
| Goresan | Arah | Lebar sebenarnya |
|---|---|---|
| Ascender “l”, “pencilkit” | ≈ 78° | 27.3 px |
| Batang “k”, “pencilkit” | ≈ 90° | 28 px |
| Sapuan 力 yang jatuh ke kiri | ≈ 66° | 25.7 px |
| Penghubung tulisan kursif | ≈ 8° | 11 px |
| Garis horizontal Tionghoa (横) | ≈ 0° | 6–11 px |
Rasio tebal terhadap tipis ≈ 2.5. Mencocokkan
Versi satu: lebar dari arah
Model pertama adalah pilihan yang paling jelas. Hitung arah untuk setiap titik masukan, petakan arah ke lebar melalui kurva hasil pencocokan, lalu tanamkan hasilnya ke radius titik saat capture. Arah diestimasi secara kausal — berupa rata-rata berbobot dengan peluruhan eksponensial atas beberapa titik terakhir pada busur, dihitung dalam ruang sudut ganda agar pembalikan arah gerak tidak membatalkan estimasi. Hanya titik masa lalu yang digunakan, sehingga goresan live dan goresan yang sudah di-commit cocok byte demi byte.
Builder lulus pemeriksaan unit: jalur sintetis horizontal, vertikal, 45°, dan pembalikan semuanya menanamkan lebar teoretis — 0.99, 2.52, 2.00, dan 0.99 poin. Rendering sama sekali tidak membutuhkan kode baru: goresan dengan radius yang sudah ditanamkan hanyalah rangkaian cap bundar, dan pipeline point-sprite kami sudah dapat menggambarnya.
Di iPad, manusia hanya membutuhkan sekitar sepuluh detik untuk menolaknya: “Ini pena seni, bukan pena air.”
Dua cerita cocok dengan satu gambar
Mengapa rasanya salah? Ada dua penjelasan kandidat, dan tangkapan layar itu tidak dapat membedakan keduanya:
- Kunci arah. Geometri mata pena memaksa garis horizontal tetap tipis dan garis vertikal tetap tebal, apa pun yang dilakukan tangan. Itulah yang diterapkan versi satu.
- Tekanan dan kecepatan. Pena ini digerakkan oleh tekanan, dan pola pada sampel hanyalah dinamika tulisan tangan: downstroke secara alami ditekan, sedangkan penghubung secara alami cepat dan ringan.
Keduanya menghasilkan tangkapan layar dengan horizontal tipis dan vertikal tebal. Perbedaannya terlihat ketika Anda menekan kuat sebuah goresan horizontal. Versi satu akan tetap tipis. Pena yang digerakkan tekanan akan menjadi tebal. Jadi kami mengajukan satu pertanyaan kepada manusia: apakah goresan horizontal yang ditekan kuat seharusnya menjadi lebih tebal?
“Tidak. Goresan horizontal tetap tipis.”
Kunci arah terkonfirmasi. Namun masih ada yang salah, karena versi satu juga terkunci pada arah.
Jawabannya ada di ujung goresan
Petunjuk berikutnya ada di bagian atas ascender. Saat kami memperbesar batang “l” dan “k” pada sampel, terlihat dua hal: goresan lurus mempertahankan satu lebar dari awal sampai akhir, dan ujung goresannya adalah potongan diagonal yang rata — bentuk mata pena pahat yang terangkat dari kertas. Bukan titik bundar. Bukan penyempitan akibat tekanan.

Itulah arti sebenarnya dari “rasa pena seni”. Versi satu memodelkan tampilan sampel — lebar sebagai fungsi arah yang diestimasi — tetapi bukan pena itu sendiri. Pengestimasi arah adalah sensor: ia bergetar pada input yang berisik, tertinggal di sekitar sudut, dan membulatkan setiap ujung goresan menjadi lingkaran. Mata pena sungguhan tidak mengalami masalah-masalah ini, karena mata pena tidak menghitung apa pun. Lebarnya adalah geometri.
Versi dua: mata pena elips
Model final sama sekali tidak memiliki pengestimasi arah. Mata penanya berupa elips berorientasi: sumbu panjang horizontal, sumbu pendek tetap. Cap elips ini ditempatkan rapat di sepanjang jalur goresan, dan semua hal lainnya muncul dari geometri:
-
Goresan horizontal bergerak sepanjang tepi yang terbuka, sehingga selalu menghasilkan lebar
— garis tipis konstan, pada tekanan berapa pun. Tepat seperti spesifikasi yang telah dikonfirmasi. -
Goresan vertikal melintasi seluruh sumbu panjang:
, ujung yang tebal. -
Goresan diagonal mengambil lebar tali busur elips yang tegak lurus terhadap arah gerak,
-
Ujung goresan adalah potongan elips — ujung rata berbentuk mata pena seperti pada sampel, tanpa perlu usaha tambahan.
-
Tekanan hanya menskalakan sumbu panjang,
, sehingga tekanan menambah volume tinta pada sapuan ke bawah dan tidak akan pernah dapat menebalkan goresan horizontal.
Dari pengukuran sampel, kami mempertahankan
Rendering hanya membutuhkan satu fragment shader baru dan tidak ada yang lain. Format vertex — posisi, diameter, warna — sudah membawa semuanya: diameter adalah sumbu panjang, sedangkan sumbu pendek adalah uniform per-pass. Shader mengevaluasi SDF elips dengan ramp cakupan setengah piksel yang sama seperti cap bundar kami. Inilah yang membuatnya dapat dibandingkan pada tingkat piksel dengan implementasi referensi Core Graphics (fillEllipse per cap). Validasi melewati gerbang biasa: sebuah korpus sintetis dengan dua goresan pena stilograf dirender dengan kedua cara dan dibandingkan piksel demi piksel — nol perbedaan struktural, dan goresan horizontal yang diperiksa secara spot-check berukuran 12 px pada kedua renderer.

Versi satu di kiri, versi dua di kanan. Input tulisan tangan sama, pipeline sama. Ujungnya menceritakan semuanya.
Di iPad, pena baru langsung lulus: “好,很好” — bagus. Sangat bagus.
Mempertahankan yang meleset
Versi satu tidak dibuang. Ia adalah kuas yang menarik — hanya saja bukan pena air. Jadi versi itu dikirim sebagai entri pertama dalam menu kuas eksperimental baru, dengan nama yang diberikan manusia: 漏水的圆珠笔, pulpen bola yang bocor. Toolbar mendapatkan tombol berbentuk labu yang memunculkan daftar teks eksperimen; menambahkan eksperimen berikutnya cukup membutuhkan satu baris dalam registry. Model yang ditolak bukan pekerjaan sia-sia jika dapat dikirim sebagai eksperimen dengan label yang jelas.
Satu malam penuh iterasi
Seluruh rangkaian — mengukur, memodelkan, membangun, menguji di perangkat, bertanya, memodelkan ulang, membangun ulang, memvalidasi — selesai dalam satu malam. Kimi K3 di Fireworks menjalankan seluruh sisi teknis dari rangkaian itu: merancang pemindaian pengukuran, mengusulkan pertanyaan pembeda alih-alih menebak untuk kedua kalinya, menghapus pengestimasi arahnya sendiri ketika bukti berubah, dan memperluas harness pixel-diff sebelum menyentuh aplikasi. Kecepatan inferensi Fireworks membuat rangkaian ini tetap interaktif — diff Metal dan Swift yang panjang, skrip analisis piksel, serta tooling korpus semuanya tiba cukup cepat sehingga satu-satunya hambatan yang tersisa adalah penilaian manusia.
Pola kolaborasinya sama seperti yang ditunjukkan dalam tulisan tentang pipeline Metal, dan kali ini pun berlaku: modelnya cepat dan presisi; manusialah yang memiliki selera dan verifikasi end-to-end. Satu kalimat umpan balik berdasarkan rasa — “pena seni, bukan pena air” — sudah cukup bagi model untuk menemukan kesalahan pemodelan yang tepat dan menggantinya dengan rancangan yang lebih sederhana.
Model yang benar ternyata lebih kecil daripada model yang salah. Versi dua dikirim dengan lebih sedikit bagian bergerak daripada versi satu — tanpa pengestimasi, tanpa jendela penghalusan, tanpa eksponen hasil pencocokan. Mata pena tidak menghitung lebar. Mata pena adalah lebar.