- Doom source code में गलत pi value को शुरुआती बिंदु बनाकर यह देखा गया है कि जब गणितीय constants को जानबूझकर और ज्यादा बिगाड़ा जाता है, तो first-person shooter game की rendering और spatial sense कैसे बदलती है
- गेम graphics सिर्फ pi पर नहीं, बल्कि trigonometry और कई गणितीय तकनीकों पर भी निर्भर करते हैं, इसलिए छोटे गणितीय बदलाव भी दुनिया को देखने और उसमें चलने के तरीके को प्रभावित कर सकते हैं
- Doom एक classic FPS है जिसका source code 1999 में GPL के तहत जारी किया गया था, इसलिए इसे pi, trigonometric functions और constants बदलने वाले प्रयोगों के लिए इस्तेमाल किया जा सका
- यह प्रयोग उस समय के hardware पर Doom को अच्छी तरह चलाने के लिए बनाई गई optimization techniques पर भी नज़र डालता है, और गलत गणित वाले version को खुद compile करने की guide भी देता है
- यह इस बात की पड़ताल करता है कि क्या non-Euclidean geometry गेम के भीतर नए spatial experiences बना सकती है, और गलत pi values इस्तेमाल करने वाले दूसरे games व public source repositories की कड़ियाँ भी देता है
Doom के गणित को जानबूझकर बिगाड़ना
- pi को आम तौर पर एक निश्चित value वाला constant माना जाता है, लेकिन Doom source code में गलत pi value इस्तेमाल की गई है
- graphics rendering सिर्फ pi नहीं, बल्कि trigonometry और कई गणितीय तकनीकों पर निर्भर करती है
- यह प्रयोग देखता है कि Doom source में pi value को और ज्यादा गलत करने पर गेम कैसे बदलता है
- दूसरे trigonometric functions और constants को भी बदलकर यह देखा जाता है कि परिचित virtual world को समझने और उसमें घूमने का एहसास कैसे डगमगाता है
Doom source और प्रयोग का दायरा
- Doom एक प्रसिद्ध classic first-person shooter game है
- Doom source code 1999 में GPL के तहत जारी किया गया था
- प्रयोग में ये शामिल हैं
- pi value को और ज्यादा गलत value में बदलना
- दूसरे trigonometric functions को गलत values में बदलना
- संबंधित mathematical constants को inaccurate बनाना
Non-Euclidean गेम की संभावनाएँ
- गणित बदलने पर खिलाड़ी जिस virtual space की संरचना और movement sense को जानता था, वह भी बदल सकती है
- यह देखा जाता है कि क्या ऐसे बदलाव non-Euclidean geometry पर आधारित दिलचस्प गेम संभावनाओं तक ले जा सकते हैं
Performance optimization और खुद चलाना
- उस समय के hardware पर Doom को अच्छी तरह चलाने के लिए बनाई गई optimization techniques पर भी संक्षेप में बात की गई है
- प्रस्तुति के अंत में गलत गणित वाले Doom version को खुद compile करने की guide दी जाती है
संबंधित सामग्री
- गलत pi values इस्तेमाल करने वाले दूसरे games और public source code repositories के links भी दिए गए हैं
- प्रस्तुति वीडियो media.ccc.de के MCH2022 content के रूप में उपलब्ध है
1 टिप्पणियां
Hacker News की राय
क्लासिक Duke Nukem 3D में भी ऐसा एक उदाहरण था। Richard “Levelord” Gray का बनाया हुआ ‘Lunatic Fringe’ लेवल
https://dukenukem.fandom.com/wiki/Lunatic_Fringe
इस लेवल में बाहरी तरफ एक गोलाकार कॉरिडोर था, जिसकी संरचना ऐसी थी कि वह आपस में क्रॉस किए बिना पूरे दो चक्कर लगाता था, और इसने उस समय के क्रांतिकारी Build engine की room-connection आधारित area-separation क्षमता का उपयोग किया था। वही फीचर ‘room over room’ तकनीक में भी इस्तेमाल हुआ था
मल्टीप्लेयर में यह मजेदार था और optical illusion भी काफी अच्छी तरह बना रहता था। अगर मुझे ठीक याद है, तो केंद्रीय कमरे में 4 दरवाजे थे, लेकिन बाहर का एक चक्कर लगाने पर उनमें से केवल 2 ही सामने आते थे
engine के साथ प्रयोग करते हुए, मैंने कभी इसी तकनीक से “3 घरों और 3 utilities को बिना लाइनों के क्रॉस किए जोड़ने” वाली पहेली हल करने वाला एक toy level भी बनाया था
Duke गैर-यूक्लिडीय geometry जैसी चीज हो सकता है, लेकिन Doom में pi बदलना geometry से खास संबंधित नहीं है और “garbage in, garbage out” जैसा ज्यादा लगता है
overlapping sectors में टूटने वाली चीज असल में लगभग सिर्फ Doom ही था
[1] https://www.lhowon.org/level/marathon/30
अगर आप convex shape के अंदर rasterize कर सकते हैं, तो sector-portal world को भी rasterize कर सकते हैं: किसी खास face को portal के रूप में mark करें, फिर उस face के दिखने की जगह को clipping area या stencil buffer के रूप में set करें, और portal data में मौजूद सही transformation और दूसरी तरफ के sector ID का उपयोग करके पीछे वाले sector को render करें
portal से होकर गुजरने वाली collision handling, portal के पार rendering से कहीं ज्यादा मुश्किल है
Lunatic Fringe, Build में impossible geometry को सीधे दिखाने का उदाहरण है, लेकिन Duke3D maps में intersecting geometry इससे भी बहुत ज्यादा है। Doom में ऐसी structure से BSP tree नहीं बनाया जा सकता, और player या monster भी सिर्फ X/Y coordinates ही track करते हैं, इसलिए स्वाभाविक रूप से यह असंभव है
संयोग से मैं Poul Anderson की classic Operation Chaos पढ़ रहा था
https://en.wikipedia.org/wiki/Operation_Chaos_(novel)
इसकी setting एक parallel world है जहां magic सचमुच मौजूद है और science के साथ तेजी से विकसित हो रहा है। उदाहरण के लिए, Edwin Land polarization का उपयोग करके बिना चांदनी के werewolf को transform करने वाला device invent करता है
मुख्य पात्रों का बच्चा अपहरण होकर नरक में ले जाया जाता है, और उन्हें पता चलता है कि सेना ने 20 साल पहले नरक की जांच करने की कोशिश की थी, लेकिन सभी पागल हो गए थे। विरोधी एक clue छोड़ता है कि नरक की spacetime geometry हमारी geometry से अलग है, इसलिए वे बच्चे के पहुंचने के क्षण पर वापस जाकर उसे ला सकते हैं
वैज्ञानिक सिर्फ उसी clue से समझ जाते हैं कि नरक की geometry non-Euclidean geometry है, और सुरक्षित रूप से अंदर जाने, टिके रहने और वापस आने के मंत्र calculate कर लेते हैं। रास्ता खोजने के लिए वे 19वीं सदी के दो geometers, जिनमें से एक saint है, की मदद के लिए प्रार्थना करते हैं
Poul Anderson की जो रचनाएं मैंने पढ़ी हैं, जैसे बेहतरीन High Crusade, उनमें भी वह scientific veneer की ज्यादा परवाह किए बिना rough तरीके से आगे बढ़ना पसंद करते हैं
non-Euclidean geometry पर आधारित दूसरी रचना के रूप में Christopher Priest की Inverted World मेरी अच्छी यादों में है
John Carmack ने शायद pi का 10वां दशमलव अंक गलत याद कर लिया हो, लेकिन अच्छा होगा कि सभी अपने codebase में 84,600 खोजकर देखें कि कहीं किसी ने एक दिन के seconds की संख्या में typo तो नहीं कर दिया
यह हैरानी की बात है कि काफी आम है, और इससे यह सीख मिलती है कि constants को program में सीधे type करना चाहिए या programming language की standard library में पहले से मौजूद value का इस्तेमाल करना चाहिए
https://github.com/search?type=code&auto_enroll=true&q=84600
https://github.com/mysql/mysql-server/blob/824e2b4064053f7da...
https://github.com/textmate/textmate/blob/346b52b108b387462d...
15 * 60 * 60define किया थाअसल में graphics और movement अजीब होने लगते हैं और आखिरकार game खेलने लायक नहीं रहता। इसे non-Euclidean Doom कहने के बजाय “universal constants से छेड़छाड़ का नतीजा” कहना ज्यादा सही लगता है
असली non-Euclidean Doom ऐसा दिखेगा, ऐसी उम्मीद थी: https://youtu.be/kEB11PQ9Eo8?si=0HNlpGFBii2AIK1n
https://youtu.be/yqUv2JO2BCs?si=AutaqS5unvT7cDjw
Doom video में आगे बढ़ते समय objects का side में फिसलते हुए लगना जैसे अजीब geometry effects देखें, तो इस Doom को non-Euclidean कहना कुछ हद तक ठीक भी लगता है
सामान्य geometry दिखा सकते थे, लेकिन geometry का किसी भी तरह से consistent होना जरूरी नहीं था, और rooms के बीच arbitrary connections भी allowed थे। बाल की खाल निकालने की कोशिश नहीं है, लेकिन यह एक आम गलतफहमी है
असली non-Euclidean चीजों के लिए ZenoRogue का काम recommend करूंगा। जैसे Nil geometry का इस्तेमाल करने वाला एक simple game[1], non-Euclidean world roguelike की एक विशाल boss fight[2], और overall geometry weirdness[3] वगैरह हैं। उनके काम में से कुछ भी देख लें
[1] https://m.youtube.com/watch?v=gejRg_q70EA&pp=ygUJemVub3JvZ3V...
[2] https://m.youtube.com/watch?v=jcnXI8IArRI&pp=ygUJemVub3JvZ3V...
[3] https://m.youtube.com/watch?v=yqUv2JO2BCs&pp=ygUJemVub3JvZ3V...
सोचता हूं, अब काफी समय बीत चुका है, तो इसे फिर से खेलना मजेदार हो सकता है
सामान्य geometry दिखाने में दिक्कत नहीं थी, लेकिन geometry का जरूरी तौर पर sensible होना शर्त नहीं था, और rooms को आपस में मनमाने ढंग से जोड़ा जा सकता था
https://www.youtube.com/watch?v=tl40xidKF-4
Doom simulation नहीं है, इसलिए एक constant बदलना किसी चीज का अच्छा example नहीं बनता
यह बस कुछ routines को खराब करने जैसा है, और इसी वजह से ज्यादातर बदलावों का नतीजा game के unplayable हो जाने में निकलता है
अपने पसंदीदा console emulator का source code लेकर उसमें arbitrary floating-point errors डाल दें या कुछ branch instructions का meaning उलट दें। game जितना पुराना होगा, उसके फिर भी चलते रहने की संभावना उतनी ज्यादा होगी, और उसके खराब hallucination trip जैसा दिखने की संभावना भी उतनी ही बढ़ेगी
मशहूर images और video files के कुछ हिस्सों को corrupt करके कुछ नया बनाने वाले glitch art projects भी थे। दोनों को फिर से ढूंढना चाहता हूं, लेकिन मिल नहीं रहे
Marathon 1 (1994) ने non-Euclidean space को सपोर्ट किया था, लेकिन इसका इस्तेमाल बहुत कम हुआ। पूरे गेम में कई levels हैं जिनमें maps होते हैं, और खेलते-खेलते सिर्फ एक-दो levels में ही असंभव space सामने आता है—गेम यह चेतावनी या जानकारी नहीं देता कि ऐसी चीज संभव है
इसलिए शायद यह गेम में मिले सबसे अच्छे Easter egg locations में से एक रहा होगा
इसका demo video भी मिला: https://www.reddit.com/r/Marathon/comments/vclu55/probably_n...
आखिरी सवाल है: “ऐसा pi का अधिकतम मान कितना है जिसके साथ गेम playable रहे और crash न हो।” pi के 4 होने पर segmentation error आने की वजह शायद यह है कि lookup table access के कुछ हिस्से table के end से आगे चले जाते हैं; अगर ऐसा है, तो playable maximum value संभवतः pi से बस थोड़ा-सा ही बड़ी होगी
काश यह video game mechanics और यह कि Pi बदलने से इस तरह की दिक्कतें क्यों हुईं, इन पर और गहराई से बात करता
जिन ray-traced Doom का संदर्भ दिया गया है, उसमें यह experiment और दिलचस्प होगा या नहीं—यह जानने की उत्सुकता है। rasterization technique में constants hack करने का नतीजा लगभग उम्मीद के मुताबिक ही था। लेकिन ray tracing में शायद और दिलचस्प नतीजे आ सकते हैं