Lulucat

Bagaimana Kimi K3 Membina Sapuan Pen Dakwat Digital

Gaoge ZhangGaoge Zhang

Kami mahu pen dakwat berarah Freeform dalam Lulucat Notes. Spesifikasinya ialah satu tangkap layar tulisan tangan. Dua model, satu soalan pembeza dan satu mata pen elips kemudian, pen air menulis seperti yang sepatutnya. Penyelidikan, kod dan pengesahan dilakukan oleh Kimi K3 di Fireworks.

Dikemas kini

Tulisan kursif Inggeris tulisan tangan yang berbunyi "fountain pen" di atas sebaris kaligrafi Cina, dirender dengan pen dakwat bermata elips di atas kertas krim: tebal pada sapuan menegak, nipis pada sapuan mendatar.

Dirender oleh pipeline Metal Lulucat Notes yang menjadi tajuk tulisan ini.

Lulucat Notes mempunyai pen biasa dan pen penyerlah. Alat seterusnya dalam peta jalan ialah pen air — pen dakwat berarah yang anda kenali daripada Apple Notes dan Freeform, yang menghasilkan sapuan menegak tebal dan sapuan mendatar nipis. Spesifikasi untuk alat ini bukan sebuah dokumen. Ia ialah satu tangkap layar: tiga baris tulisan tangan, dengan perkataan “pencilkit”, “无边记” dan “这种有方向的水笔能力” — keupayaan pen air berarah ini.

Seperti pipeline Metal sebelumnya, kerja ini dilakukan oleh Kimi K3, model terbuka Moonshot yang berjalan di Fireworks: pengukuran, pemodelan, kod dan pengesahan. Manusia membekalkan tangkap layar, menjawab satu soalan dan menilai rasanya pada iPad sebenar.

Spesifikasi itu ialah satu tangkap layar

Imej statik tidak dapat memberitahu anda mengapa satu sapuan itu nipis. Ia hanya dapat memberitahu betapa nipisnya dan di mana. Jadi langkah pertama ialah pengukuran. Kami mengimbas tangkap layar baris demi baris dan lajur demi lajur, menjejaki hanyutan garis tengah setiap sapuan untuk mendapatkan arahnya, kemudian menukar lebar imbasan kepada lebar sebenar menggunakan sinus sudut itu:

SapuanArahLebar sebenar
Anggota naik “l”, “pencilkit”≈ 78°27.3 px
Batang “k”, “pencilkit”≈ 90°28 px
Sapuan 力 yang jatuh ke kiri≈ 66°25.7 px
Penyambung kursif≈ 8°11 px
Mendatar Cina (横)≈ 0°6–11 px

Nisbah tebal kepada nipis ialah ≈ 2.5. Memadankan dengan titik 66° memberikan — hampir linear terhadap , dengan kemuncak pada paksi menegak. Secara berkesan, ini ialah mata pen italik: celah mendatar yang tidak pernah terbuka ketika menulis secara mendatar.

Versi satu: lebar daripada arah

Model pertama ialah pilihan yang jelas. Kira arah bagi setiap titik input, petakan arah kepada lebar melalui lengkung yang dipadankan, dan sematkan hasilnya ke dalam jejari titik semasa tangkapan. Arah dianggarkan secara kausal — purata wajaran yang susut secara eksponen merentas beberapa titik terakhir pada lengkung, dikira dalam ruang sudut berganda supaya pembalikan pergerakan tidak membatalkan anggaran. Hanya titik lampau digunakan, jadi sapuan live dan sapuan yang telah dilakukan sepadan byte demi byte.

Builder melepasi unit check-nya: laluan sintetik mendatar, menegak, 45° dan pembalikan semuanya menyematkan lebar teori — 0.99, 2.52, 2.00 dan 0.99 mata. Pemaparan tidak memerlukan kod baharu langsung: sapuan dengan jejari yang telah disematkan hanyalah rantaian cop bulat, dan pipeline point-sprite kami sudah pun melukisnya.

Di iPad, manusia mengambil kira-kira sepuluh saat untuk menolaknya: “Ini pen seni, bukan pen air.”

Dua penjelasan untuk satu gambar

Mengapa rasanya salah? Ada dua penjelasan calon, dan tangkap layar itu tidak dapat membezakannya:

  • Kunci arah. Geometri mata pen memaksa garisan mendatar kekal nipis dan garisan menegak kekal tebal, walau apa pun yang dilakukan oleh tangan. Itulah yang dilaksanakan oleh versi satu.
  • Tekanan dan kelajuan. Pen ini dipacu tekanan, dan corak sampel hanyalah dinamik tulisan tangan: sapuan ke bawah secara semula jadi ditekan, manakala penyambung secara semula jadi pantas dan ringan.

Kedua-duanya menghasilkan tangkap layar dengan mendatar nipis dan menegak tebal. Bezanya ialah apa yang berlaku apabila anda menekan kuat pada sapuan mendatar. Versi satu mengekalkannya nipis. Pen tekanan menjadikannya tebal. Jadi kami bertanya satu soalan kepada manusia: patutkah sapuan mendatar yang ditekan kuat menjadi lebih tebal?

“Tidak. Mendatar kekal nipis.”

Kunci arah disahkan. Tetapi masih ada yang tidak kena, kerana versi satu juga terkunci arah.

Jawapannya ada pada hujung sapuan

Petunjuk seterusnya berada di bahagian atas anggota naik. Apabila kami mengezum batang “l” dan “k” dalam sampel, dua perkara kelihatan: sapuan lurus mengekalkan satu lebar dari mula hingga tamat, dan hujung sapuan ialah potongan pepenjuru rata — bentuk mata pen pahat yang terangkat. Bukan titik bulat. Bukan tirusan tekanan.

Keratan dekat dua batang anggota naik tulisan tangan daripada sampel; setiap satunya berakhir di bahagian atas dengan potongan pepenjuru rata, dengan ketebalan seragam sepanjang batang.

Itulah maksud sebenar “rasa pen seni”. Versi satu memodelkan rupa sampel — lebar sebagai fungsi arah yang dianggarkan — tetapi bukan pen itu sendiri. Penganggar arah ialah sensor: ia bergetar pada input bising, ketinggalan di selekoh dan membundarkan setiap hujung sapuan menjadi bulatan. Mata pen sebenar tidak menghadapi masalah ini kerana ia tidak mengira apa-apa. Lebarnya ialah geometri.

Versi dua: mata pen elips

Model akhir langsung tiada penganggar arah. Mata pen itu ialah elips berorientasi: paksi panjang mendatar, paksi pendek tetap. Cop elips ini diletakkan rapat di sepanjang laluan sapuan, dan segala yang lain terhasil daripada geometri:

  • Sapuan mendatar bergerak sepanjang tepi terbuka, jadi ia sentiasa keluar selebar — garisan nipis malar, pada apa-apa tekanan sekalipun. Tepat seperti spesifikasi yang disahkan.

  • Sapuan menegak melintasi seluruh paksi panjang: , hujung yang tebal.

  • Sapuan pepenjuru mengambil lebar kord elips yang berserenjang dengan arah pergerakan,

  • Hujung sapuan ialah potongan elips — hujung rata berbentuk mata pen daripada sampel, tanpa kerja tambahan.

  • Tekanan hanya menskalakan paksi panjang, , jadi tekanan menambah isi padu dakwat pada sapuan ke bawah dan tidak akan dapat menebalkan sapuan mendatar.

Daripada ukuran sampel, kami mengekalkan pt dan pt, dengan nisbah 2.5 yang sama. Cop diletakkan 0.5 mata berjauhan sepanjang lengkung; dengan jejari pendek 0.55 mata, riak tepi dalam kes terburuk kira-kira satu persepuluh piksel.

Pemaparan hanya memerlukan satu fragment shader baharu dan tiada yang lain. Format vertex — kedudukan, diameter, warna — sudah membawa segala-galanya: diameter ialah paksi panjang, manakala paksi pendek ialah uniform per-pass. Shader menilai SDF elips dengan ramp liputan separuh piksel yang sama seperti cop bulat kami. Itulah yang menjadikannya boleh dibandingkan pada tahap piksel dengan pelaksanaan rujukan Core Graphics (fillEllipse setiap cop). Pengesahan melalui gate biasa: satu korpus sintetik dengan dua sapuan pen dakwat dirender dalam kedua-dua cara dan dibandingkan piksel demi piksel — sifar perbezaan struktur, dan satu sapuan mendatar yang diperiksa secara spot-check berukuran 12 px pada kedua-dua renderer.

Dua pemaparan perkataan tulisan tangan yang sama, "fountain", bersebelahan: sebelah kiri dilukis dengan cop bulat berdiameter yang diskalakan mengikut arah sehingga hujungnya membulat; sebelah kanan dengan cop elips yang menunjukkan hujung potongan mata pen rata dan lebar yang lebih stabil.

Versi satu di kiri, versi dua di kanan. Input tulisan tangan yang sama, pipeline yang sama. Hujungnya menceritakan segalanya.

Di iPad, pen baharu lulus serta-merta: “好,很好” — baik. Sangat baik.

Mengekalkan yang tersasar

Versi satu tidak dibuang. Ia ialah berus yang menarik — cuma bukan pen air. Jadi ia dihantar sebagai entri pertama dalam menu berus eksperimen baharu, dengan nama yang diberikan manusia kepadanya: 漏水的圆珠笔, pen mata bola yang bocor. Bar alat mendapat butang berbentuk kelalang yang membuka senarai teks eksperimen; menambah eksperimen seterusnya hanya memerlukan satu baris dalam registry. Model yang ditolak bukan kerja yang terbazir jika ia boleh dihantar sebagai eksperimen yang dilabel dengan jelas.

Satu petang dengan gelung

Keseluruhan rangkaian — mengukur, memodelkan, membina, menguji pada peranti, bertanya, memodelkan semula, membina semula, mengesahkan — selesai dalam satu petang. Kimi K3 di Fireworks menjalankan seluruh sisi teknikal gelung itu: mereka bentuk imbasan pengukuran, mencadangkan soalan pembeza dan bukannya meneka kali kedua, memadam penganggar arahnya sendiri apabila bukti berubah, dan mengembangkan pixel-diff harness sebelum menyentuh aplikasi. Kelajuan inferens Fireworks mengekalkan gelung itu interaktif — diff Metal dan Swift yang panjang, skrip analisis piksel serta alat korpus semuanya tiba cukup pantas sehingga baki bottleneck ialah pertimbangan manusia.

Corak kerjasama itu sama seperti dalam tulisan tentang pipeline Metal, dan ia tetap berkesan: model itu pantas dan tepat; manusia memiliki cita rasa dan pengesahan hujung-ke-hujung. Satu ayat maklum balas berdasarkan rasa — “pen seni, bukan pen air” — sudah cukup untuk model menemui ralat pemodelan yang tepat dan menggantikannya dengan reka bentuk yang lebih ringkas.

Model yang betul ternyata lebih kecil daripada model yang salah. Versi dua dihantar dengan lebih sedikit bahagian bergerak daripada versi satu — tiada penganggar, tiada tetingkap pelicinan, tiada eksponen yang dipadankan. Mata pen tidak mengira lebar. Mata pen ialah lebar.