Kimi K3 ने डिजिटल फाउंटेन पेन का स्ट्रोक कैसे बनाया
हम Lulucat Notes में Freeform वाला दिशानुसार बदलने वाला फाउंटेन पेन चाहते थे। स्पेसिफिकेशन हस्तलिखित लेखन का एक स्क्रीनशॉट था। दो मॉडल, एक निर्णायक सवाल और एक अंडाकार निब के बाद वॉटर पेन वैसे लिखता है जैसे उसे लिखना चाहिए। Fireworks पर शोध, कोड और वैलिडेशन Kimi K3 ने किया।

इस लेख में वर्णित Lulucat Notes की Metal पाइपलाइन से रेंडर किया गया।
Lulucat Notes में एक साधारण पेन और हाइलाइटर है। रोडमैप का अगला औज़ार वॉटर पेन था — Apple Notes और Freeform में मिलने वाला दिशानुसार बदलने वाला फाउंटेन पेन, जिसमें ऊर्ध्वाधर स्ट्रोक मोटे और क्षैतिज स्ट्रोक पतले निकलते हैं। इस औज़ार का स्पेसिफिकेशन कोई दस्तावेज़ नहीं था। वह हस्तलिखित लेखन की तीन पंक्तियों वाला स्क्रीनशॉट था: शब्द “pencilkit”, “无边记” और “这种有方向的水笔能力” — यह दिशा-आधारित वॉटर-पेन क्षमता।
पहले की Metal पाइपलाइन की तरह यह काम भी Kimi K3 ने किया, जो Fireworks पर चलने वाला Moonshot का ओपन मॉडल है: माप, मॉडलिंग, कोड और वैलिडेशन। इंसान ने स्क्रीनशॉट दिया, एक सवाल का जवाब दिया और असली iPad पर उसके अनुभव को परखा।
स्पेसिफिकेशन एक स्क्रीनशॉट है
एक स्थिर छवि यह नहीं बता सकती कि कोई स्ट्रोक पतला क्यों है। वह सिर्फ यह बता सकती है कि वह कितना पतला है और कहाँ है। इसलिए पहला कदम मापना था। हमने स्क्रीनशॉट को पंक्ति-दर-पंक्ति और स्तंभ-दर-स्तंभ स्कैन किया, हर स्ट्रोक की मध्यरेखा के खिसकाव को दर्ज करके उसकी दिशा निकाली, फिर उस कोण के साइन से स्कैन की गई चौड़ाई को वास्तविक चौड़ाई में बदला:
| स्ट्रोक | दिशा | वास्तविक चौड़ाई |
|---|---|---|
| “l” का ऊर्ध्वगामी भाग, “pencilkit” | ≈ 78° | 27.3 px |
| “k” का दंड, “pencilkit” | ≈ 90° | 28 px |
| 力 का बाईं ओर उतरता झटका | ≈ 66° | 25.7 px |
| कर्सिव के जोड़ने वाले स्ट्रोक | ≈ 8° | 11 px |
| चीनी क्षैतिज स्ट्रोक (横) | ≈ 0° | 6–11 px |
मोटे और पतले स्ट्रोक का अनुपात ≈ 2.5 है। 66° वाले बिंदु पर
पहला संस्करण: दिशा से चौड़ाई
पहला मॉडल स्वाभाविक विकल्प था। वह हर इनपुट बिंदु की दिशा निकालता, फिट की गई वक्र से दिशा को चौड़ाई में बदलता और कैप्चर के समय परिणाम को बिंदु की त्रिज्या में दर्ज करता था। दिशा का अनुमान कारणात्मक ढंग से लगाया गया — चाप के पिछले कुछ बिंदुओं का घटते हुए भार वाला घातांकीय औसत, जिसे द्वि-कोण स्थान में निकाला गया ताकि गति की दिशा उलटने पर अनुमान रद्द न हो। केवल पिछले बिंदु इस्तेमाल होते हैं, इसलिए लाइव स्ट्रोक और कमिट किया हुआ स्ट्रोक बाइट-दर-बाइट एक जैसे रहते हैं।
बिल्डर अपनी यूनिट जाँच में पास हुआ: कृत्रिम क्षैतिज, ऊर्ध्वाधर, 45° और दिशा-पलट वाले मार्गों ने सैद्धांतिक चौड़ाइयाँ — 0.99, 2.52, 2.00 और 0.99 पॉइंट — दर्ज कीं। रेंडरिंग के लिए कोई नया कोड नहीं चाहिए था: पहले से त्रिज्या वाला स्ट्रोक गोल स्टैम्प की एक कड़ी भर है, और हमारी point-sprite पाइपलाइन उन्हें पहले से बना रही थी।
iPad पर इंसान को इसे ख़ारिज करने में लगभग दस सेकंड लगे: “यह कला-पेन है, वॉटर पेन नहीं।”
एक तस्वीर में दो संभावित व्याख्याएँ
यह गलत क्यों लगा? दो संभावित व्याख्याएँ थीं और स्क्रीनशॉट उन्हें अलग नहीं कर सकता था:
- दिशा-लॉक। निब की ज्यामिति, हाथ चाहे कुछ भी करे, क्षैतिज स्ट्रोक पतले और ऊर्ध्वाधर स्ट्रोक मोटे रखती है। यही पहले संस्करण ने लागू किया था।
- दबाव और गति। पेन दबाव से चलता है और नमूने का पैटर्न केवल लिखावट की गतिशीलता है: नीचे जाने वाले स्ट्रोक पर स्वाभाविक रूप से ज़्यादा दबाव पड़ता है, जबकि जोड़ने वाले स्ट्रोक स्वाभाविक रूप से तेज़ और हल्के होते हैं।
दोनों व्याख्याएँ पतले क्षैतिज और मोटे ऊर्ध्वाधर स्ट्रोक वाला स्क्रीनशॉट बनाती हैं। फ़र्क़ तब दिखता है जब क्षैतिज स्ट्रोक पर ज़ोर से दबाया जाता है। पहला संस्करण उसे पतला ही रखता है। दबाव-संवेदनशील पेन उसे मोटा कर देता है। इसलिए हमने इंसान से एक सवाल पूछा: क्या ज़ोर से दबाया गया क्षैतिज स्ट्रोक मोटा होना चाहिए?
“नहीं। क्षैतिज स्ट्रोक पतले ही रहते हैं।”
दिशा-लॉक की पुष्टि हो गई। लेकिन कुछ और भी गलत था, क्योंकि पहला संस्करण भी दिशा-लॉक वाला था।
जवाब स्ट्रोक के सिरों में था
अगला संकेत ऊर्ध्वगामी भागों के ऊपर मिला। नमूने में “l” और “k” के दंडों को बड़ा करके देखने पर दो बातें दिखीं: एक सीधा स्ट्रोक शुरू से अंत तक एक ही चौड़ाई रखता है, और उसके सिरे सपाट तिरछे कट होते हैं — निब के छूटते समय बनने वाला छेनी-जैसा आकार। गोल बिंदु नहीं। दबाव से होने वाली पतलाहट नहीं।

“कला-पेन का एहसास” वास्तव में यही था। पहले संस्करण ने नमूने के दिखावे को मॉडल किया — अनुमानित दिशा के फ़ंक्शन के रूप में चौड़ाई — लेकिन पेन को नहीं। दिशा-अनुमानक एक सेंसर है: शोर वाले इनपुट पर काँपता है, कोनों के आसपास पीछे रह जाता है और हर स्ट्रोक के सिरे को गोल कर देता है। असली निब में इनमें से कोई समस्या नहीं होती, क्योंकि वह कुछ गणना नहीं करती। चौड़ाई ज्यामिति है।
दूसरा संस्करण: अंडाकार निब
अंतिम मॉडल में कोई दिशा-अनुमानक है ही नहीं। निब एक दिशा में रखी गई अंडाकार आकृति है: लंबी धुरी क्षैतिज और छोटी धुरी स्थिर है। इस अंडाकार आकृति के स्टैम्प स्ट्रोक के पथ पर घने रूप से रखे जाते हैं और बाकी सब ज्यामिति से निकलता है:
-
क्षैतिज स्ट्रोक खुले किनारे के साथ चलता है, इसलिए उसकी चौड़ाई हमेशा
रहती है — किसी भी दबाव पर एक समान पतली रेखा। बिल्कुल यही पुष्ट स्पेसिफिकेशन है। -
ऊर्ध्वाधर स्ट्रोक पूरी लंबी धुरी को पार करता है:
, यानी मोटा सिरा। -
तिरछा स्ट्रोक गति की दिशा के लंबवत अंडाकार आकृति की जीवा की चौड़ाई लेता है,
-
स्ट्रोक के सिरे अंडाकार कट होते हैं — नमूने में दिखने वाले निब-आकार के सपाट सिरे, बिना किसी अतिरिक्त काम के।
-
दबाव केवल लंबी धुरी को स्केल करता है,
, इसलिए नीचे जाने वाले स्ट्रोक में स्याही की मात्रा बढ़ती है और क्षैतिज स्ट्रोक कभी मोटा नहीं हो सकता।
नमूने के मापों से हमने
रेंडरिंग के लिए केवल एक नया fragment shader चाहिए था, और कुछ नहीं। Vertex format — position, diameter, color — में पहले से सब कुछ था: diameter लंबी धुरी है और short axis per-pass uniform है। Shader हमारे गोल स्टैम्प जैसी ही half-pixel coverage ramp से ellipse SDF का मूल्यांकन करता है, इसलिए Core Graphics के संदर्भ कार्यान्वयन (fillEllipse प्रति स्टैम्प) से पिक्सेल-दर-पिक्सेल तुलना की जा सकती है। वैलिडेशन सामान्य जाँच से गुज़रा: दो फाउंटेन-पेन स्ट्रोक वाला एक कृत्रिम corpus दोनों तरीकों से रेंडर किया गया और पिक्सेल-दर-पिक्सेल तुलना की गई — संरचनात्मक अंतर शून्य थे, और नमूने के लिए जाँचा गया एक क्षैतिज स्ट्रोक दोनों रेंडरर में 12 px का निकला।

पहला संस्करण बाईं ओर और दूसरा दाईं ओर है। वही हस्तलिखित इनपुट, वही पाइपलाइन। सिरे पूरी कहानी बताते हैं।
iPad पर नई पेन तुरंत पास हो गई: “好,很好” — अच्छी। बहुत अच्छी।
असफल कोशिश को बचाए रखना
पहला संस्करण कूड़ेदान में नहीं गया। वह एक दिलचस्प ब्रश है — बस वॉटर पेन नहीं है। इसलिए उसे नए प्रयोगात्मक ब्रश-मेन्यू की पहली एंट्री के रूप में, इंसान द्वारा दिए गए नाम से, भेजा गया: 漏水的圆珠笔, यानी रिसाव वाला बॉलपेन। टूलबार में फ्लास्क के आकार का बटन जोड़ा गया, जो प्रयोगों की टेक्स्ट सूची खोलता है; अगला प्रयोग जोड़ने में रजिस्ट्री की एक पंक्ति लगती है। ठुकराया गया मॉडल बेकार गया काम नहीं है, अगर उसे साफ़ लेबल वाले प्रयोग के रूप में भेजा जा सके।
एक शाम का चक्र
पूरा चक्र — मापना, मॉडल बनाना, बनाना, डिवाइस पर आज़माना, सवाल पूछना, फिर मॉडल बनाना, फिर बनाना और वैलिडेट करना — एक शाम में पूरा हुआ। Fireworks पर Kimi K3 ने चक्र का पूरा तकनीकी हिस्सा संभाला: माप के स्कैन तैयार करना, दूसरी बार अनुमान लगाने के बजाय वह सवाल सुझाना जो परिकल्पनाओं को अलग करे, सबूत बदलने पर अपना दिशा-अनुमानक हटा देना और ऐप को छूने से पहले pixel-diff harness को बढ़ाना। Fireworks की अनुमान-गति ने चक्र को इंटरैक्टिव रखा — लंबे Metal और Swift diffs, पिक्सेल-विश्लेषण स्क्रिप्ट और corpus tooling इतनी जल्दी पहुँचे कि बचा हुआ अवरोध मानवीय निर्णय ही रहा।
सहयोग का तरीका वही था जो Metal पाइपलाइन वाली पोस्ट में था और फिर काम आया: मॉडल तेज़ और सटीक है; इंसान स्वाद और शुरू से अंत तक की जाँच की ज़िम्मेदारी रखता है। एहसास पर आधारित एक वाक्य — “कला-पेन, वॉटर पेन नहीं” — मॉडल के लिए मॉडलिंग की सटीक गलती खोजकर उसे सरल डिज़ाइन से बदलने के लिए काफ़ी था।
सही मॉडल गलत मॉडल से छोटा निकला। दूसरा संस्करण पहले संस्करण की तुलना में कम चलने वाले हिस्सों के साथ भेजा गया — कोई अनुमानक नहीं, कोई स्मूदिंग विंडो नहीं और कोई फिट किया हुआ घातांक नहीं। निब चौड़ाई की गणना नहीं करती। निब ही चौड़ाई है।