<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Cinevva ब्लॉग</title>
        <link>https://app.cinevva.com</link>
        <description>प्रोडक्ट अपडेट, क्रिएटर नोट्स और प्रयोग।</description>
        <lastBuildDate>Mon, 27 Jul 2026 08:04:56 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright 2024-present Cinevva</copyright>
        <item>
            <title><![CDATA[फैक्ट-चेक नोट: "स्केच से वीडियो और खेलने योग्य 3D तक"]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-03-04-sketch-to-animated-3d-character-factcheck-note</link>
            <guid>https://app.cinevva.com/hi/blog/2026-03-04-sketch-to-animated-3d-character-factcheck-note</guid>
            <pubDate>Mon, 27 Jul 2026 07:59:46 GMT</pubDate>
            <content:encoded><![CDATA[<h1 id="फैक्ट-चेक-नोट-स्केच-से-वीडियो-और-खेलने-योग्य-3d-तक" tabindex="-1">फैक्ट-चेक नोट: &quot;स्केच से वीडियो और खेलने योग्य 3D तक&quot; <a class="header-anchor" href="#फैक्ट-चेक-नोट-स्केच-से-वीडियो-और-खेलने-योग्य-3d-तक" aria-label="Permalink to &quot;फैक्ट-चेक नोट: &quot;स्केच से वीडियो और खेलने योग्य 3D तक&quot;&quot;"></a></h1>
<p><strong>के लिए:</strong> Oleg Sidorkin<br>
<strong>विषय:</strong> <a href="https://app.cinevva.com/blog/2026-03-04-sketch-to-animated-3d-character" target="_blank" rel="noreferrer">app.cinevva.com/blog/2026-03-04-sketch-to-animated-3d-character</a><br>
<strong>किसके आधार पर जाँचा गया:</strong> cinevva-site repo (मार्केटिंग साइट + worker)</p>
<hr>
<h2 id="सत्यापित-✓" tabindex="-1">सत्यापित ✓ <a class="header-anchor" href="#सत्यापित-✓" aria-label="Permalink to &quot;सत्यापित ✓&quot;"></a></h2>
<ul>
<li><strong>Tool नाम</strong> (Image Generator, Video Generator, 3D Model Generator) और <strong>link</strong> <code>/tools/hunyuan3d</code> codebase से मेल खाते हैं।</li>
<li><strong>लेखक</strong> (Oleg Sidorkin, CTO) सही है।</li>
<li><strong>Video workflow:</strong> शुरुआती + अंतिम frame interpolation, 9:16, 3–15 s अवधि, और storyboard mode सभी समर्थित हैं।</li>
<li><strong>3D pipeline:</strong> Hunyuan3D और &quot;3D Model Generator&quot; सही हैं; auto-rigging (Tripo) और &quot;upload GLB → rigged model + animation library&quot; implementation से मेल खाते हैं।</li>
<li><strong>Cinevva Engine</strong> और &quot;2026 की शुरुआत को दर्शाता है&quot; सटीक हैं।</li>
</ul>
<hr>
<h2 id="सुधार-की-ज़रूरत" tabindex="-1">सुधार की ज़रूरत <a class="header-anchor" href="#सुधार-की-ज़रूरत" aria-label="Permalink to &quot;सुधार की ज़रूरत&quot;"></a></h2>
<p><strong>&quot;Seedance 1.5 Pro&quot;</strong> — इस repo में, video को <strong>Kling 3.0 Pro</strong> (fal.ai) के साथ implement किया गया है, Seedance 1.5 Pro के साथ नहीं:</p>
<ul>
<li><code>worker/src/genai/fal-video.ts</code> में <code>fal-ai/kling-video/v3/pro/...</code> का उपयोग होता है</li>
<li><code>worker/src/index.ts</code> cost को <code>model: 'kling-3.0-pro'</code> के रूप में track करता है</li>
<li><code>tools/video.md</code> कहता है: &quot;Generate short AI videos from text or images using <strong>Kling 3.0 Pro</strong>&quot;</li>
</ul>
<p>API/product नाम &quot;seedance&quot; है (जैसे <code>/genai/seedance/generate</code>), लेकिन अंतर्निहित model Kling 3.0 Pro है। Seedance 1.5 Pro एक अलग model है (ByteDance)। सार्वजनिक स्रोत अक्सर Seedance 1.5 Pro को ~10 s तक सीमित बताते हैं; यहाँ Kling के लिए 15 s समर्थित है।</p>
<p><strong>सिफ़ारिश:</strong> लेख में, video model को <strong>&quot;Kling 3.0 Pro&quot;</strong> नाम दें (या जैसे &quot;Video Generator (Kling 3.0 Pro)&quot;) ताकि यह मार्केटिंग साइट और docs से मेल खाए। अगर app backend वाकई Seedance 1.5 Pro का उपयोग करता है, तो app copy और <code>tools/video.md</code> को align करें ताकि वे एक ही model का वर्णन करें।</p>
<hr>
<h2 id="repo-में-सत्यापित-नहीं-किया-जा-सकता" tabindex="-1">repo में सत्यापित नहीं किया जा सकता <a class="header-anchor" href="#repo-में-सत्यापित-नहीं-किया-जा-सकता" aria-label="Permalink to &quot;repo में सत्यापित नहीं किया जा सकता&quot;"></a></h2>
<p>Cubcoats, Kali the Kitty, Mimi Chao, और संबंधित व्यावसायिक दावे बाहरी हैं; जाँचे नहीं गए।</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Spike सोर्स व्यूअर]]></title>
            <link>https://app.cinevva.com/hi/blog/spike-source</link>
            <guid>https://app.cinevva.com/hi/blog/spike-source</guid>
            <pubDate>Mon, 27 Jul 2026 07:59:46 GMT</pubDate>
            <description><![CDATA[open world browser सीरीज़ के किसी भी spike का सोर्स कोड देखें।]]></description>
            <content:encoded><![CDATA[<h1 id="builder-में-खोला-जा-रहा-है" tabindex="-1">builder में खोला जा रहा है… <a class="header-anchor" href="#builder-में-खोला-जा-रहा-है" aria-label="Permalink to &quot;builder में खोला जा रहा है…&quot;"></a></h1>
<p v-if="spikeId">
  आपको Game Creator में <strong>spike {{ spikeId }}</strong> पर ले जाया जा रहा है।
  अगर आप अपने आप redirect नहीं होते, तो <a :href="`/create#spike-${spikeId}`">इसे यहाँ खोलें</a>।
</p>
<p v-else>
  <a href="/create">Game Creator खोलें</a>।
</p>
<p style="margin-top:1rem">
  <a href="/hi/blog/2026-02-25-open-world-browser-series-guide">← सीरीज़ गाइड पर वापस</a>
</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[अभी खेलने के लिए सबसे अच्छे मुफ़्त browser games (कोई डाउनलोड नहीं)]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-06-30-best-free-browser-games-no-download</link>
            <guid>https://app.cinevva.com/hi/blog/2026-06-30-best-free-browser-games-no-download</guid>
            <pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[बिना किसी डाउनलोड या इंस्टॉल के तुरंत खेले जा सकने वाले सबसे अच्छे browser games की एक चुनी हुई लिस्ट। puzzle, roguelike, story और rhythm में टॉप-रेटेड indie games।]]></description>
            <content:encoded><![CDATA[<h1 id="अभी-खेलने-के-लिए-सबसे-अच्छे-मुफ़्त-browser-games-कोई-डाउनलोड-नहीं" tabindex="-1">अभी खेलने के लिए सबसे अच्छे मुफ़्त browser games (कोई डाउनलोड नहीं) <a class="header-anchor" href="#अभी-खेलने-के-लिए-सबसे-अच्छे-मुफ़्त-browser-games-कोई-डाउनलोड-नहीं" aria-label="Permalink to &quot;अभी खेलने के लिए सबसे अच्छे मुफ़्त browser games (कोई डाउनलोड नहीं)&quot;"></a></h1>
<p><em><a href="/hi/about.html">Mariana Muntean</a> द्वारा, Cinevva की CEO</em></p>
<p>ठीक है, तो हमारा बिलकुल भी इरादा नहीं था कि पूरा एक हफ़्ता itch.io पर लगा दें। जो एक झटपट रिसर्च के तौर पर शुरू हुआ था, वो बदल गया... खैर, बारहवें घंटे के आसपास कहीं हमने गिनना बंद कर दिया। पूरा मकसद ऐसे games ढूंढना था जिन्हें आप तुरंत खेल सकें, कोई डाउनलोड नहीं, कोई इंस्टॉलर बैकग्राउंड में घिसटता हुआ नहीं। आप क्लिक करते हैं, आप अंदर हैं। बस।</p>
<p>ये वो हैं जो चुनाव में खरे उतरे।</p>
<h2 id="टॉप-रेटेड-इंटरैक्टिव-अनुभव" tabindex="-1">टॉप-रेटेड इंटरैक्टिव अनुभव <a class="header-anchor" href="#टॉप-रेटेड-इंटरैक्टिव-अनुभव" aria-label="Permalink to &quot;टॉप-रेटेड इंटरैक्टिव अनुभव&quot;"></a></h2>
<div class="showcase-card">
<img src="/img/showcases/anxiety.png" alt="Adventures With Anxiety screenshot" loading="lazy">
<p><strong>Adventures With Anxiety!</strong> — Interactive Story
6,500 से ज़्यादा रेटिंग, औसत 4.9। अजीब है ना कि कोई ऐसी चीज़ जो आपको anxiety का सामना करने पर मजबूर करती है, उसके इतने फैन हैं? सबसे अच्छे तरीके से असहज करती है, वो वाला जो मन में बैठ जाता है। <a href="https://ncase.itch.io/anxiety" target="_blank" rel="noreferrer">यहां खेलें</a></p>
</div>
<div class="showcase-card">
<img src="/img/showcases/wbwwb.png" alt="We Become What We Behold screenshot" loading="lazy">
<p><strong>We Become What We Behold</strong> — Social Commentary
7,600 रेटिंग, 4.8/5 पर। खत्म करने में दस मिनट। इसके बारे में सोचना बंद करने में कई दिन। <a href="https://ncase.itch.io/wbwwb" target="_blank" rel="noreferrer">यहां खेलें</a></p>
</div>
<div class="showcase-card">
<img src="/img/showcases/six-cats-under.png" alt="Six Cats Under screenshot" loading="lazy">
<p><strong>Six Cats Under</strong> — Puzzle Adventure
आरामदेह और चतुर। यहां विज़ुअल्स असली भारी काम संभालते हैं, जो इसके फ़ायदे में जाता है। 6,400+ लोगों से 4.8/5। <a href="https://teambeanloop.itch.io/six-cats-under" target="_blank" rel="noreferrer">यहां खेलें</a></p>
</div>
<div class="showcase-card">
<img src="/img/showcases/friday-night-funkin.gif" alt="Friday Night Funkin screenshot" loading="lazy">
<p><strong>Friday Night Funkin'</strong> — Rhythm Game
यह वाला अब तक हर जगह पहुंच चुका है। 11,700+ रेटिंग, 4.7/5। <a href="https://ninja-muffin24.itch.io/funkin" target="_blank" rel="noreferrer">यहां खेलें</a></p>
</div>
<div class="showcase-card">
<img src="/img/showcases/sort-the-court.png" alt="Sort the Court screenshot" loading="lazy">
<p><strong>Sort the Court!</strong> — Kingdom Sim
आपका बस एक ही काम: हां या ना कहना। सुनने में कुछ खास नहीं लगता। फिर दो घंटे गायब हो जाते हैं जबकि आप अब भी एक नन्हा सा राज्य चला रहे होते हैं। <a href="https://graebor.itch.io/sort-the-court" target="_blank" rel="noreferrer">यहां खेलें</a></p>
</div>
<div class="showcase-card">
<img src="/img/showcases/dragonsweeper.png" alt="Dragonsweeper screenshot" loading="lazy">
<p><strong>Dragonsweeper</strong> — Puzzle Roguelike
Minesweeper लीजिए, उसे RPG सिस्टम्स के साथ मिला दीजिए। 4.9/5, शायद यह असल में पूरी लिस्ट की सबसे अच्छी चीज़ है। <a href="https://danielben.itch.io/dragonsweeper" target="_blank" rel="noreferrer">यहां खेलें</a></p>
</div>
<h2 id="roguelike-और-strategy-browser-में-खेलने-लायक" tabindex="-1">Roguelike और Strategy (browser में खेलने लायक) <a class="header-anchor" href="#roguelike-और-strategy-browser-में-खेलने-लायक" aria-label="Permalink to &quot;Roguelike और Strategy (browser में खेलने लायक)&quot;"></a></h2>
<div class="showcase-card">
<img src="/img/showcases/backpack-hero.png" alt="Backpack Hero screenshot" loading="lazy">
<p><strong>Backpack Hero</strong> — Inventory Roguelike
Browser वर्शन का कोई पैसा नहीं लगता। पेड वर्शन में और चीज़ें जुड़ती हैं, लेकिन मुफ़्त वेब बिल्ड अपने दम पर टिकता है। <a href="https://thejaspel.itch.io/backpack-hero" target="_blank" rel="noreferrer">यहां खेलें</a></p>
</div>
<div class="showcase-card">
<img src="/img/showcases/vampire-survivors.png" alt="Vampire Survivors screenshot" loading="lazy">
<p><strong>Vampire Survivors</strong> — Bullet Heaven
सिर्फ़ डेमो, एक ही स्टेज, सात कैरेक्टर। फिर भी यह समझने के लिए काफ़ी है कि इस चीज़ ने सबका खाली समय क्यों निगल लिया। <a href="https://poncle.itch.io/vampire-survivors" target="_blank" rel="noreferrer">यहां खेलें</a></p>
</div>
<div class="showcase-card">
<img src="/img/showcases/dome-romantik.gif" alt="Dome Romantik screenshot" loading="lazy">
<p><strong>Dome Romantik</strong> — Mining Defense
एक game jam की चीज़ के तौर पर शुरू हुआ। Dome Keeper बन गया। बहुत बड़ा बन गया। ओरिजिनल प्रोटोटाइप अब भी टिका हुआ है। <a href="https://bippinbits.itch.io/dome-romantik" target="_blank" rel="noreferrer">यहां खेलें</a></p>
</div>
<h2 id="खासतौर-पर-ये-ही-क्यों" tabindex="-1">खासतौर पर ये ही क्यों? <a class="header-anchor" href="#खासतौर-पर-ये-ही-क्यों" aria-label="Permalink to &quot;खासतौर पर ये ही क्यों?&quot;"></a></h2>
<p>हर एक लिंक को टेस्ट किया गया। कोई झटपट नज़र नहीं, हम असल में बैठकर इन्हें खेले। ये बिना किसी नाटक के लोड होते हैं। कोई browser की अजीब हरकत नहीं। हज़ारों रेटिंग उन लोगों से आईं जिन्होंने कभी कोई डाउनलोड बटन नहीं छुआ, उन्होंने क्लिक किया और सीधे कूद पड़े। &quot;अरे, दिलचस्प है&quot; से लेकर असल में खेलने तक का वो बिना-रुकावट वाला रास्ता? ज़्यादातर लोग यह कम आंकते हैं कि यह कितना कुछ बदल देता है।</p>
<h2 id="और-वेब-games-देखें" tabindex="-1">और वेब games देखें <a class="header-anchor" href="#और-वेब-games-देखें" aria-label="Permalink to &quot;और वेब games देखें&quot;"></a></h2>
<p>अब भी और चाहिए?</p>
<ul>
<li><a href="https://itch.io/games/top-rated/html5" target="_blank" rel="noreferrer">itch.io पर टॉप रेटेड HTML5 games</a></li>
<li><a href="https://itch.io/games/top-rated/genre-platformer/html5" target="_blank" rel="noreferrer">सबसे अच्छे HTML5 platformers</a></li>
<li><a href="https://itch.io/games/top-rated/html5/year-2024" target="_blank" rel="noreferrer">2024-2025 के games</a></li>
</ul>
<h2 id="जाने-माने-indie-games-डाउनलोड-ज़रूरी" tabindex="-1">जाने-माने indie games (डाउनलोड ज़रूरी) <a class="header-anchor" href="#जाने-माने-indie-games-डाउनलोड-ज़रूरी" aria-label="Permalink to &quot;जाने-माने indie games (डाउनलोड ज़रूरी)&quot;"></a></h2>
<p>कुछ बढ़िया चीज़ें आपके browser में नहीं चलेंगी। ये उस अतिरिक्त कदम के लायक हैं:</p>
<div class="showcase-card">
<img src="/img/showcases/slice-dice.png" alt="Slice & Dice screenshot" loading="lazy">
<p><strong>Slice &amp; Dice</strong> — Dice Roguelike
Windows, Mac, Android पर चलता है। <a href="https://tann.itch.io/slice-dice" target="_blank" rel="noreferrer">इसे itch.io पर लें</a></p>
</div>
<div class="showcase-card">
<img src="/img/showcases/stacklands.png" alt="Stacklands screenshot" loading="lazy">
<p><strong>Stacklands</strong> — Card Village Builder
Windows और Mac। <a href="https://sokpop.itch.io/stacklands" target="_blank" rel="noreferrer">इसे itch.io पर लें</a></p>
</div>
<div class="showcase-card">
<img src="/img/showcases/luck-be-a-landlord.png" alt="Luck be a Landlord screenshot" loading="lazy">
<p><strong>Luck be a Landlord</strong> — Slot Machine Roguelike
सुनने में एक गिमिक लगता है। ऐसा है नहीं। उस स्लॉट मशीन की सतह के नीचे असली strategy छिपी है। <a href="https://trampolinetales.itch.io/luck-be-a-landlord" target="_blank" rel="noreferrer">itch.io</a></p>
</div>
<div class="showcase-card">
<img src="/img/showcases/patricks-parabox.png" alt="Patrick's Parabox screenshot" loading="lazy">
<p><strong>Patrick's Parabox</strong> — Recursive Puzzles
अपने दिमाग को दर्द होने की उम्मीद रखें। फिर भी इसे पसंद करने की उम्मीद रखें। <a href="https://patricktraynor.itch.io/patricks-parabox" target="_blank" rel="noreferrer">itch.io</a></p>
</div>
<div class="showcase-card">
<img src="/img/showcases/dome-keeper.jpg" alt="Dome Keeper screenshot" loading="lazy">
<p><strong>Dome Keeper</strong> — Mining Defense
उसी jam प्रोटोटाइप का पूरा रिलीज़ जिसका हमने ज़िक्र किया था। <a href="https://store.steampowered.com/app/1637320/Dome_Keeper/" target="_blank" rel="noreferrer">इसे Steam पर पाएं</a></p>
</div>
<div class="showcase-card">
<img src="/img/showcases/brotato.jpg" alt="Brotato screenshot" loading="lazy">
<p><strong>Brotato</strong> — Arena Survivor
<a href="https://store.steampowered.com/app/1942280/Brotato/" target="_blank" rel="noreferrer">Steam पर उपलब्ध</a></p>
</div>
<hr>
<p>अगर आप games बना रहे हैं तो यहां सोचने लायक एक बात है: <strong>browser बिल्ड खिलाड़ियों और आपके काम के बीच कुछ नहीं रखते</strong>। कोई डाउनलोड नहीं जो किसी कतार में पड़ा रहे और वे भूल जाएं। कोई इंस्टॉल स्क्रीन नहीं जिसमें क्लिक करते जाना पड़े। एक क्लिक और वे पहले से ही राय बना रहे होते हैं कि आपने क्या बनाया। इस तरह की तुरंत-पहुंच पर उतनी बात नहीं होती जितनी होनी चाहिए, लेकिन यह सब कुछ बदल देती है।</p>
<p>अपने खुद के game के लिए यही चाहते हैं? आप एक game सीधे browser में <a href="/create.html">Cinevva game creator</a> के साथ बना सकते हैं, और जिन्हें हम फ़ीचर करते हैं वे हमारे <a href="/hi/arcade.html">community आर्केड</a> में जगह पाते हैं।</p>
<ul>
<li><a href="/hi/creators.html">game creators के लिए</a></li>
<li><a href="/hi/tutorials/ship-web-game-fast.html">एक वेब game बनाएं जो तेज़ लोड हो</a></li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[2026 में web game engines: PlayCanvas vs Three.js vs Babylon.js vs Unity WebGL]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-06-09-web-game-engines-2026-comparison</link>
            <guid>https://app.cinevva.com/hi/blog/2026-06-09-web-game-engines-2026-comparison</guid>
            <pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[2026 में browser के अंदर 3D game बनाने के मुख्य तरीकों की एक ताज़ा, ईमानदार तुलना: PlayCanvas (v2.19), Three.js, Babylon.js और Unity WebGL। हर एक क्या है, किसके लिए है, WebGL2 vs WebGPU सपोर्ट, लाइसेंसिंग, और चुनाव कैसे करें।]]></description>
            <content:encoded><![CDATA[<h1 id="_2026-में-web-game-engines-playcanvas-vs-three-js-vs-babylon-js-vs-unity-webgl" tabindex="-1">2026 में web game engines: PlayCanvas vs Three.js vs Babylon.js vs Unity WebGL <a class="header-anchor" href="#_2026-में-web-game-engines-playcanvas-vs-three-js-vs-babylon-js-vs-unity-webgl" aria-label="Permalink to &quot;2026 में web game engines: PlayCanvas vs Three.js vs Babylon.js vs Unity WebGL&quot;"></a></h1>
<p><em><a href="/hi/about.html">Oleg Sidorkin</a> द्वारा, Cinevva के CTO और Co-Founder</em></p>
<img src="https://cdn.cinevva.com/blog/web-engines-2026-hero.jpg" alt="A browser window showing a 3D scene transitioning from a white wireframe mesh on the left to a rendered colorful low-poly landscape on the right" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>अगर आप 2026 में एक ऐसा 3D game शिप करना चाहते हैं जो browser में चले, तो आपके पास चार मुख्य विकल्प हैं और कुछ नए विकल्प भी। इन्हें एक साथ &quot;web game engines&quot; कह दिया जाता है, लेकिन ये असल में अलग-अलग tools हैं जो अलग-अलग समस्याएं हल करते हैं। गलत वाला चुनने पर आपके कई महीने बर्बाद हो जाते हैं। यह एक ताज़ा, फैक्ट-चेक की हुई तुलना है, जिसे उन लोगों ने लिखा है जो रोज़ी-रोटी के लिए एक web 3D engine बनाते हैं और अपना खुद का बनाने से पहले इन सबको परख चुके हैं।</p>
<p>हम हर विकल्प को बारी-बारी देखेंगे, वो असल में क्या है, किसके लिए है, और कहां कमज़ोर पड़ता है, फिर आखिर में आपको एक छोटी डिसीज़न गाइड देंगे। जहां हम version नंबर बताते हैं, वे June 2026 तक सही हैं।</p>
<h2 id="झटपट-तुलना" tabindex="-1">झटपट तुलना <a class="header-anchor" href="#झटपट-तुलना" aria-label="Permalink to &quot;झटपट तुलना&quot;"></a></h2>
<table tabindex="0">
<thead>
<tr>
<th></th>
<th>PlayCanvas</th>
<th>Three.js</th>
<th>Babylon.js</th>
<th>Unity WebGL</th>
<th>Cinevva</th>
</tr>
</thead>
<tbody>
<tr>
<td>यह क्या है</td>
<td>पूरा engine + होस्टेड editor</td>
<td>रेंडरिंग लाइब्रेरी</td>
<td>पूरा engine + editor</td>
<td>डेस्कटॉप engine, web export</td>
<td>AI-native world platform</td>
</tr>
<tr>
<td>आर्किटेक्चर</td>
<td>Entity-component (ECS)</td>
<td>Scene graph</td>
<td>Scene graph + components</td>
<td>GameObject/component</td>
<td>Scene graph + AI builder</td>
</tr>
<tr>
<td>स्क्रिप्टिंग</td>
<td>TypeScript / JavaScript</td>
<td>JavaScript (बाकी आप बनाते हैं)</td>
<td>TypeScript / JavaScript</td>
<td>C# (Wasm में compile)</td>
<td>Natural language + code</td>
</tr>
<tr>
<td>Renderer</td>
<td>WebGL2, WebGPU परिपक्व हो रहा</td>
<td>WebGL2, WebGPU बढ़ रहा</td>
<td>WebGL2, WebGPU आगे बढ़ रहा</td>
<td>WebGL2 (export)</td>
<td>सिर्फ WebGPU</td>
</tr>
<tr>
<td>Editor</td>
<td>होस्टेड, कमर्शियल</td>
<td>कोई नहीं</td>
<td>web-आधारित, मुफ़्त</td>
<td>डेस्कटॉप, कमर्शियल</td>
<td>in-world, इमर्सिव</td>
</tr>
<tr>
<td>Physics</td>
<td>Ammo / इंटीग्रेशन</td>
<td>अपना खुद का लाएं</td>
<td>Havok बिल्ट-इन</td>
<td>बिल्ट-इन (PhysX)</td>
<td>कस्टम character solver</td>
</tr>
<tr>
<td>लाइसेंस</td>
<td>Engine MIT, editor प्रोप्राइटरी</td>
<td>MIT</td>
<td>MIT</td>
<td>प्रोप्राइटरी</td>
<td>प्रोप्राइटरी</td>
</tr>
<tr>
<td>किसके लिए सबसे अच्छा</td>
<td>स्टूडियो-स्टाइल browser games</td>
<td>कस्टम 3D, पूरा कंट्रोल</td>
<td>सब कुछ शामिल games</td>
<td>मौजूदा Unity games पोर्ट करना</td>
<td>in-world AI game creation</td>
</tr>
</tbody>
</table>
<p>बाकी की यह पोस्ट इस टेबल को समझाती है।</p>
<h2 id="playcanvas" tabindex="-1">PlayCanvas <a class="header-anchor" href="#playcanvas" aria-label="Permalink to &quot;PlayCanvas&quot;"></a></h2>
<p>PlayCanvas web पर Unity-स्टाइल workflow के सबसे नज़दीक की चीज़ है। यह engine MIT लाइसेंस के तहत open source है और 5 June 2026 तक v2.19.6 पर है। यह एक entity-component system इस्तेमाल करता है, आप game की लॉजिक TypeScript या JavaScript में लिखते हैं, और assets एक server-side pipeline से होकर गुज़रते हैं जो GLB बनाती है। इस पर असली कमर्शियल games चलते हैं, और बड़ी कंपनियां इसे प्रोडक्शन में इस्तेमाल करती हैं, Snap इसका एक सार्वजनिक उदाहरण है।</p>
<p>PlayCanvas के बारे में दो चीज़ें लोग गलत समझते हैं, जिन्हें सुधारना ज़रूरी है। पहली, भले ही engine MIT-लाइसेंस वाला है, लेकिन जिस होस्टेड visual editor को ज़्यादातर टीमें असल में इस्तेमाल करती हैं वो एक कमर्शियल प्रोडक्ट है, open source नहीं। आप इसके बिना भी engine को मुफ़्त में इस्तेमाल कर सकते हैं, लेकिन editor-प्लस-क्लाउड वाला workflow पैसे वाला हिस्सा है। दूसरी, PlayCanvas WebGL2-फर्स्ट है। इसमें एक WebGPU रास्ता है, लेकिन वो रास्ता डिफ़ॉल्ट renderer होने के बजाय अभी परिपक्व ही हो रहा है, इसलिए आज PlayCanvas को इस उम्मीद से मत चुनिए कि उसमें प्रोडक्शन-लेवल WebGPU compute shaders मिलेंगे।</p>
<p>PlayCanvas जहां सचमुच आगे है वो है 3D Gaussian splatting। इसका SuperSplat editor और viewer, जिसे टीम ने open-source किया, web पर splat scenes कैप्चर करने और शिप करने के लिए कहीं भी मौजूद बेहतरीन tooling में से एक है, बड़े कैप्चर के लिए WebGPU-आधारित streaming के साथ। अगर फोटोरियल स्कैन किए हुए environments आपकी चीज़ हैं, तो यहां से शुरू करने की यह एक असली वजह है।</p>
<p><strong>PlayCanvas चुनें अगर</strong> आप browser के लिए एक Unity-जैसा editor और एक मैनेज की हुई asset pipeline चाहते हैं, और आप वैसा game शिप कर रहे हैं जैसा कोई स्टूडियो बनाएगा। <strong>कहीं और देखें अगर</strong> आपको आज WebGPU compute चाहिए, या आप एक होस्टेड कमर्शियल editor से बचना चाहते हैं।</p>
<h2 id="three-js" tabindex="-1">Three.js <a class="header-anchor" href="#three-js" aria-label="Permalink to &quot;Three.js&quot;"></a></h2>
<p>Three.js कोई game engine नहीं है। यह एक रेंडरिंग लाइब्रेरी है, और इस क्षेत्र में काफी बड़े अंतर से सबसे ज़्यादा इस्तेमाल होने वाली लाइब्रेरी है। यह आपको एक scene graph, cameras, lights, materials, geometry, loaders और एक renderer देती है, और फिर रुक जाती है। न कोई editor है, न physics, न entity system, और game को कैसे संरचित करना है इस पर कोई राय नहीं। वो सब आप खुद जोड़ते हैं या ecosystem से उठाते हैं।</p>
<p>यही सौदा पूरी कहानी है। आपको सबसे ज़्यादा कंट्रोल और web 3D का सबसे बड़ा कम्युनिटी मिलता है, इस कीमत पर कि renderer के ऊपर की हर चीज़ आपको बनानी या जोड़नी पड़ती है। इसका WebGPU renderer लगातार बढ़ता रहा है और आज इस्तेमाल लायक है, हालांकि बाकियों की तरह यहां भी WebGL2 रास्ता ही परिपक्व डिफ़ॉल्ट है। Three.js MIT-लाइसेंस वाला है।</p>
<p><strong>Three.js चुनें अगर</strong> आप पूरा कंट्रोल, एक मिनिमल बेस चाहते हैं, और आपके पास इसके ऊपर अपने game systems बनाने की इंजीनियरिंग क्षमता है। <strong>कहीं और देखें अगर</strong> आप चाहते हैं कि editor और game systems आपको बने-बनाए मिल जाएं।</p>
<h2 id="babylon-js" tabindex="-1">Babylon.js <a class="header-anchor" href="#babylon-js" aria-label="Permalink to &quot;Babylon.js&quot;"></a></h2>
<p>Babylon.js एक पूरा engine है, MIT-लाइसेंस वाला और Microsoft की एक टीम के समर्थन से। Three.js के उलट, इसके साथ वो हिस्से आते हैं जिन्हें आपको वरना खुद जोड़ना पड़ता: एक component model, इंटीग्रेटेड Havok physics engine, एक मुफ़्त web-आधारित editor, और एक asset pipeline। इसका WebGPU काम तेज़ी से आगे बढ़ा है और general-purpose engines में से ज़्यादा एडवांस्ड में से एक है, हालांकि यह अभी भी WebGL2 को व्यापक-कम्पैटिबिलिटी रास्ते के रूप में बनाए रखता है।</p>
<p>अगर आपकी सोच यह है कि &quot;मुझे एक पूरा engine चाहिए, उसके साथ physics शामिल हो, और मैं उसके तौर-तरीकों के भीतर काम करके खुश हूं,&quot; तो Babylon एक मज़बूत डिफ़ॉल्ट है और यकीनन इस क्षेत्र का सबसे feature-complete मुफ़्त विकल्प है।</p>
<p><strong>Babylon.js चुनें अगर</strong> आप चाहते हैं कि सब कुछ शामिल मिले, बिल्ट-इन physics हो, और एक मुफ़्त editor हो। <strong>कहीं और देखें अगर</strong> आप एक छोटा dependency फुटप्रिंट चाहते हैं या आप खासतौर पर एक Unity-स्टाइल होस्टेड workflow चाहते हैं।</p>
<h2 id="unity-webgl" tabindex="-1">Unity WebGL <a class="header-anchor" href="#unity-webgl" aria-label="Permalink to &quot;Unity WebGL&quot;"></a></h2>
<p>Unity WebGL कोई web engine नहीं है, यह एक export target है। आप Unity डेस्कटॉप editor में, C# में बनाते हैं, और एक WebGL bundle में compile करते हैं जो WebAssembly के ज़रिए browser में चलता है। इससे यह एक खास हालत के लिए साफ़ जवाब बन जाता है: आपके पास पहले से एक Unity game है और आप उसका एक browser वर्ज़न चाहते हैं।</p>
<p>एक web-फर्स्ट प्रोजेक्ट के लिए इसकी असली कीमत है। runtime और डाउनलोड का वज़न काफी ज़्यादा है, स्टार्टअप एक native web engine से धीमा है, और मोबाइल browser परफॉर्मेंस एक जानी-मानी दिक्कत है। Unity प्रोप्राइटरी है और इसका WebGL आउटपुट WebGL2 को टारगेट करता है।</p>
<p><strong>Unity WebGL चुनें अगर</strong> आपके पास browser में लाने के लिए एक मौजूदा Unity प्रोजेक्ट है, या आपकी टीम पहले से Unity में ही रहती है। <strong>कहीं और देखें अगर</strong> मिड-रेंज फोन पर तुरंत लोड होना एक सख्त ज़रूरत है, या आप बिल्कुल नए सिरे से और web-फर्स्ट शुरू कर रहे हैं।</p>
<h2 id="ai-native-और-in-world-creation-कहां-फिट-बैठती-है" tabindex="-1">AI-native और in-world creation कहां फिट बैठती है <a class="header-anchor" href="#ai-native-और-in-world-creation-कहां-फिट-बैठती-है" aria-label="Permalink to &quot;AI-native और in-world creation कहां फिट बैठती है&quot;"></a></h2>
<p>ऊपर की हर चीज़ एक मान्यता साझा करती है: एक developer एक डेस्क पर, एक editor में game बनाता है, और एक runtime शिप करता है। यह मान्यता ज़्यादातर प्रोजेक्ट्स के लिए सही है, और अगर यह आपके वाले का वर्णन करती है, तो ऊपर के चारों में से चुनिए।</p>
<p>यह जानना ज़रूरी है कि यह मान्यता अब इकलौता विकल्प नहीं रही, क्योंकि एक अलग श्रेणी उभर रही है। हम Cinevva बनाते हैं, जो एक सिर्फ-WebGPU world platform है जहां games को world के अंदर से बनाया जाता है। एक editor खोलने के बजाय, आप एक avatar होते हैं जो उस जगह में खड़ा है, और आप बताते हैं कि आपको क्या चाहिए, और एक AI builder उसे terrain, objects और behavior में बदल देता है जबकि आप वहीं खड़े रहते हैं। Creation और play एक ही सेशन हैं। पर्दे के पीछे इसका मतलब था compute-shader terrain के साथ सिर्फ-WebGPU जाना, एक general physics engine के बजाय एक कस्टम character solver लिखना, और एक animation और retargeting system बनाना, जिसके बारे में हमने <a href="/hi/blog/2026-06-08-why-we-built-our-own-webgpu-engine.html">हमने अपना खुद का WebGPU engine क्यों बनाया</a> में लिखा।</p>
<p>यह PlayCanvas या Babylon की जगह नहीं है। अगर आप एक developer हैं जो एक खास game बना रहा है, तो वही सही tools हैं। Cinevva उस अलग मकसद के लिए है जो उन लोगों को, जो engine developers नहीं हैं, चीज़ों का वर्णन करके खेलने लायक spaces बनाने और साझा करने देता है। हम इसका ज़िक्र यहां इसलिए कर रहे हैं क्योंकि &quot;मुझे कौन सा web game engine इस्तेमाल करना चाहिए&quot; का जवाब अब बढ़ते हुए एक पांचवां जवाब रखता है जो कोई engine है ही नहीं।</p>
<h2 id="पूरा-फीचर-मैट्रिक्स" tabindex="-1">पूरा फीचर मैट्रिक्स <a class="header-anchor" href="#पूरा-फीचर-मैट्रिक्स" aria-label="Permalink to &quot;पूरा फीचर मैट्रिक्स&quot;"></a></h2>
<p>ऊपर की झटपट टेबल सुर्ख़ी है। यह उसका विस्तृत वर्ज़न है, subsystem के हिसाब से बांटा हुआ। इसे कैसे पढ़ें इस पर कुछ ईमानदार नोट। &quot;BYO&quot; का मतलब है अपना खुद का लाएं, यानी engine इसे शिप नहीं करता लेकिन ecosystem या आपका अपना code इसे जोड़ सकता है। यह सबसे ज़्यादा Three.js के लिए मायने रखता है, जो डिज़ाइन से ही एक रेंडरिंग लाइब्रेरी है, इसलिए वहां &quot;BYO&quot; फिलॉसफी की एक खूबी है, कोई कमी नहीं। Unity के लिए &quot;Export-only&quot; का मतलब है कि क्षमता डेस्कटॉप editor में मौजूद है और WebGL build में साथ चली आती है, web-native होने के बजाय। कॉम्पिटिटर वाले खाने mid-2026 तक की out-of-the-box क्षमता और अच्छी तरह दस्तावेज़ी व्यवहार को दर्शाते हैं। Cinevva वाले खाने वो दर्शाते हैं जो हमारे शिप किए हुए build में चलता है, जहां &quot;planned&quot; उसे चिह्नित करता है जो डिज़ाइन किया गया है पर अभी बना नहीं।</p>
<h3 id="rendering" tabindex="-1">Rendering <a class="header-anchor" href="#rendering" aria-label="Permalink to &quot;Rendering&quot;"></a></h3>
<table tabindex="0">
<thead>
<tr>
<th>Feature</th>
<th>Cinevva</th>
<th>PlayCanvas</th>
<th>Three.js</th>
<th>Babylon.js</th>
<th>Unity WebGL</th>
</tr>
</thead>
<tbody>
<tr>
<td>प्राइमरी renderer</td>
<td>सिर्फ WebGPU</td>
<td>WebGL2 (WebGPU beta)</td>
<td>WebGL2 (WebGPU बढ़ रहा)</td>
<td>WebGL2 (WebGPU एडवांस्ड)</td>
<td>WebGL2 (export)</td>
</tr>
<tr>
<td>प्रोडक्शन में compute shaders</td>
<td>हां (कोर निर्भरता)</td>
<td>Beta</td>
<td>WebGPU के ज़रिए</td>
<td>हां (WebGPU)</td>
<td>Export-only, सीमित</td>
</tr>
<tr>
<td>Shader authoring</td>
<td>TSL nodes + compute</td>
<td>Shader chunks / GLSL</td>
<td>GLSL + node (TSL)</td>
<td>Node material / GLSL / WGSL</td>
<td>ShaderLab / HLSL</td>
</tr>
<tr>
<td>Clustered / forward+ lighting</td>
<td>हां (froxel)</td>
<td>हां</td>
<td>BYO</td>
<td>हां</td>
<td>हां</td>
</tr>
<tr>
<td>Volumetric clouds और weather</td>
<td>हां</td>
<td>BYO</td>
<td>BYO</td>
<td>आंशिक</td>
<td>BYO</td>
</tr>
<tr>
<td>3D Gaussian splatting tooling</td>
<td>Planned</td>
<td>हां (SuperSplat, अग्रणी)</td>
<td>कम्युनिटी</td>
<td>हां</td>
<td>Plugins</td>
</tr>
</tbody>
</table>
<h3 id="world-और-terrain" tabindex="-1">World और terrain <a class="header-anchor" href="#world-और-terrain" aria-label="Permalink to &quot;World और terrain&quot;"></a></h3>
<table tabindex="0">
<thead>
<tr>
<th>Feature</th>
<th>Cinevva</th>
<th>PlayCanvas</th>
<th>Three.js</th>
<th>Babylon.js</th>
<th>Unity WebGL</th>
</tr>
</thead>
<tbody>
<tr>
<td>बिल्ट-इन large-world streaming</td>
<td>हां (64m chunks)</td>
<td>BYO</td>
<td>BYO</td>
<td>BYO</td>
<td>Export-only</td>
</tr>
<tr>
<td>Terrain system</td>
<td>हाइब्रिड heightmap + marching-cubes/SDF</td>
<td>BYO</td>
<td>BYO</td>
<td>Extension</td>
<td>बिल्ट-इन (डेस्कटॉप)</td>
</tr>
<tr>
<td>Runtime terrain sculpting</td>
<td>हां (GPU)</td>
<td>BYO</td>
<td>BYO</td>
<td>BYO</td>
<td>नहीं (edit-time)</td>
</tr>
<tr>
<td>Caves और overhangs (असली 3D topology)</td>
<td>हां (marching cubes)</td>
<td>BYO</td>
<td>BYO</td>
<td>BYO</td>
<td>BYO</td>
</tr>
<tr>
<td>GPU-instanced foliage और grass</td>
<td>हां</td>
<td>हां</td>
<td>BYO</td>
<td>हां</td>
<td>हां</td>
</tr>
</tbody>
</table>
<h3 id="physics-और-character" tabindex="-1">Physics और character <a class="header-anchor" href="#physics-और-character" aria-label="Permalink to &quot;Physics और character&quot;"></a></h3>
<table tabindex="0">
<thead>
<tr>
<th>Feature</th>
<th>Cinevva</th>
<th>PlayCanvas</th>
<th>Three.js</th>
<th>Babylon.js</th>
<th>Unity WebGL</th>
</tr>
</thead>
<tbody>
<tr>
<td>Physics engine</td>
<td>कस्टम kinematic solver</td>
<td>Ammo integration</td>
<td>BYO (Rapier/Cannon/Ammo)</td>
<td>Havok built-in</td>
<td>PhysX built-in</td>
</tr>
<tr>
<td>Rigid-body dynamics</td>
<td>नहीं (डिज़ाइन से)</td>
<td>हां</td>
<td>BYO</td>
<td>हां</td>
<td>हां</td>
</tr>
<tr>
<td>Character controller</td>
<td>हां (multi-mode FSM)</td>
<td>Templates / Ammo</td>
<td>BYO</td>
<td>हां</td>
<td>बिल्ट-इन</td>
</tr>
<tr>
<td>Terrain-integrated collision (SDF)</td>
<td>हां</td>
<td>नहीं</td>
<td>BYO</td>
<td>नहीं</td>
<td>नहीं</td>
</tr>
</tbody>
</table>
<h3 id="animation" tabindex="-1">Animation <a class="header-anchor" href="#animation" aria-label="Permalink to &quot;Animation&quot;"></a></h3>
<table tabindex="0">
<thead>
<tr>
<th>Feature</th>
<th>Cinevva</th>
<th>PlayCanvas</th>
<th>Three.js</th>
<th>Babylon.js</th>
<th>Unity WebGL</th>
</tr>
</thead>
<tbody>
<tr>
<td>Skeletal animation</td>
<td>हां</td>
<td>हां</td>
<td>हां</td>
<td>हां</td>
<td>हां</td>
</tr>
<tr>
<td>Blend / state machine</td>
<td>हां (resolver FSM)</td>
<td>हां (anim state graph)</td>
<td>Mixer (BYO blending)</td>
<td>हां</td>
<td>हां (Mecanim)</td>
</tr>
<tr>
<td>Skeleton retargeting</td>
<td>हां (pipeline)</td>
<td>सीमित</td>
<td>कम्युनिटी</td>
<td>आंशिक</td>
<td>हां (humanoid)</td>
</tr>
<tr>
<td>Inverse kinematics</td>
<td>Planned</td>
<td>सीमित</td>
<td>कम्युनिटी</td>
<td>हां</td>
<td>हां</td>
</tr>
</tbody>
</table>
<h3 id="multiplayer-और-backend" tabindex="-1">Multiplayer और backend <a class="header-anchor" href="#multiplayer-और-backend" aria-label="Permalink to &quot;Multiplayer और backend&quot;"></a></h3>
<table tabindex="0">
<thead>
<tr>
<th>Feature</th>
<th>Cinevva</th>
<th>PlayCanvas</th>
<th>Three.js</th>
<th>Babylon.js</th>
<th>Unity WebGL</th>
</tr>
</thead>
<tbody>
<tr>
<td>बिल्ट-इन multiplayer</td>
<td>हां (edge-authoritative)</td>
<td>BYO (Photon/Colyseus)</td>
<td>BYO</td>
<td>BYO</td>
<td>BYO (Netcode, web-native नहीं)</td>
</tr>
<tr>
<td>Persistent shared world</td>
<td>हां (हर chunk के लिए Durable Objects)</td>
<td>BYO</td>
<td>BYO</td>
<td>BYO</td>
<td>BYO</td>
</tr>
<tr>
<td>Spatial voice chat</td>
<td>हां (WebRTC + HRTF)</td>
<td>BYO</td>
<td>BYO</td>
<td>BYO</td>
<td>BYO</td>
</tr>
</tbody>
</table>
<h3 id="creation-और-authoring" tabindex="-1">Creation और authoring <a class="header-anchor" href="#creation-और-authoring" aria-label="Permalink to &quot;Creation और authoring&quot;"></a></h3>
<table tabindex="0">
<thead>
<tr>
<th>Feature</th>
<th>Cinevva</th>
<th>PlayCanvas</th>
<th>Three.js</th>
<th>Babylon.js</th>
<th>Unity WebGL</th>
</tr>
</thead>
<tbody>
<tr>
<td>Editor</td>
<td>in-world, इमर्सिव</td>
<td>होस्टेड डेस्कटॉप-स्टाइल (कमर्शियल)</td>
<td>कोई नहीं (मिनिमल)</td>
<td>web-आधारित (मुफ़्त)</td>
<td>डेस्कटॉप (कमर्शियल)</td>
</tr>
<tr>
<td>In-world embodied creation</td>
<td>हां</td>
<td>नहीं</td>
<td>नहीं</td>
<td>नहीं</td>
<td>नहीं</td>
</tr>
<tr>
<td>Natural-language / AI creation</td>
<td>हां (AI builder)</td>
<td>नहीं</td>
<td>नहीं</td>
<td>नहीं</td>
<td>नहीं</td>
</tr>
<tr>
<td>स्क्रिप्टिंग</td>
<td>Natural language + JS</td>
<td>TypeScript / JS</td>
<td>JavaScript</td>
<td>TypeScript / JS</td>
<td>C#</td>
</tr>
</tbody>
</table>
<h3 id="assets-और-distribution" tabindex="-1">Assets और distribution <a class="header-anchor" href="#assets-और-distribution" aria-label="Permalink to &quot;Assets और distribution&quot;"></a></h3>
<table tabindex="0">
<thead>
<tr>
<th>Feature</th>
<th>Cinevva</th>
<th>PlayCanvas</th>
<th>Three.js</th>
<th>Babylon.js</th>
<th>Unity WebGL</th>
</tr>
</thead>
<tbody>
<tr>
<td>Server-side asset pipeline</td>
<td>हां (GLB + LOD + KTX2 + Draco)</td>
<td>हां (GLB)</td>
<td>सिर्फ loaders</td>
<td>Import tools</td>
<td>हां</td>
</tr>
<tr>
<td>बिल्ट-इन AI asset generation</td>
<td>हां (3D, image, audio, music)</td>
<td>नहीं</td>
<td>नहीं</td>
<td>नहीं</td>
<td>नहीं</td>
</tr>
<tr>
<td>Federated asset search</td>
<td>हां (ग्यारह providers)</td>
<td>Asset store</td>
<td>नहीं</td>
<td>नहीं</td>
<td>Asset store</td>
</tr>
<tr>
<td>browser में चलता है, कोई install नहीं</td>
<td>हां</td>
<td>हां</td>
<td>हां</td>
<td>हां</td>
<td>हां (भारी)</td>
</tr>
<tr>
<td>Engine लाइसेंस</td>
<td>प्रोप्राइटरी platform</td>
<td>Engine MIT, editor प्रोप्राइटरी</td>
<td>MIT</td>
<td>MIT</td>
<td>प्रोप्राइटरी</td>
</tr>
</tbody>
</table>
<p>मैट्रिक्स का पैटर्न ही असली कहानी है। general-purpose engines अपनी ताकत क्षैतिज रूप से फैलाते हैं, वे हर एक ज़्यादातर चीज़ें ठीक-ठाक करते हैं और world, backend और creation flow आप पर छोड़ देते हैं। Cinevva लंबवत रूप से केंद्रित करता है, यह कम चीज़ें करता है पर renderer से लेकर एक shared world तक के पूरे रास्ते का मालिक है जिसे आप अंदर से बनाते हैं। अमूर्त रूप से न तो एक आकार बेहतर है। वे अलग-अलग सवालों का जवाब देते हैं।</p>
<h2 id="चुनाव-कैसे-करें" tabindex="-1">चुनाव कैसे करें <a class="header-anchor" href="#चुनाव-कैसे-करें" aria-label="Permalink to &quot;चुनाव कैसे करें&quot;"></a></h2>
<p>एक फीचर चेकलिस्ट के बजाय tool को हालत से मिलाएं।</p>
<p>अगर आपके पास पहले से एक Unity game है, तो उसे Unity WebGL से export करें और वज़न को स्वीकार करें। अगर आप एक स्टूडियो हैं जो browser games के लिए एक editor-संचालित workflow चाहता है, तो PlayCanvas इस्तेमाल करें। अगर आप physics शामिल वाला एक पूरा मुफ़्त engine चाहते हैं, तो Babylon.js इस्तेमाल करें। अगर आप पूरा कंट्रोल चाहते हैं और आपके पास एक नंगे renderer पर बनाने वाली टीम है, तो Three.js इस्तेमाल करें। और अगर आपका मकसद एक game बनाना नहीं बल्कि लोगों को चीज़ों का वर्णन करके एक shared world के अंदर बनाने और खेलने देना है, तो वही श्रेणी है जिसमें हम काम करते हैं, और आप <a href="/hi/">Cinevva आज़मा सकते हैं</a>।</p>
<p>जो भी चुनें, कमिट करने से पहले असली spikes के साथ परख करें। इनमें से हर एक एक असली game संभाल सकता है, और बीच रास्ते में स्विच करने की कीमत वो महीने हैं जो आपने शिप करने में नहीं लगाए।</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[हमने PlayCanvas को fork करने के बजाय अपना WebGPU engine क्यों बनाया]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-06-08-why-we-built-our-own-webgpu-engine</link>
            <guid>https://app.cinevva.com/hi/blog/2026-06-08-why-we-built-our-own-webgpu-engine</guid>
            <pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Three.js, Babylon.js, PlayCanvas, Unity WebGL: अपना renderer लिखने से पहले हमने इन सबको परखा। यहाँ बताया है कि हर एक किसमें अच्छा है, वे चार फैसले जिन्होंने हमें तैयार समाधानों से हटाया, और वे हालात जहाँ आपको बिलकुल वैसा नहीं करना चाहिए जैसा हमने किया।]]></description>
            <content:encoded><![CDATA[<h1 id="हमने-playcanvas-को-fork-करने-के-बजाय-अपना-webgpu-engine-क्यों-बनाया" tabindex="-1">हमने PlayCanvas को fork करने के बजाय अपना WebGPU engine क्यों बनाया <a class="header-anchor" href="#हमने-playcanvas-को-fork-करने-के-बजाय-अपना-webgpu-engine-क्यों-बनाया" aria-label="Permalink to &quot;हमने PlayCanvas को fork करने के बजाय अपना WebGPU engine क्यों बनाया&quot;"></a></h1>
<p><em>लेखक <a href="/hi/about.html">Oleg Sidorkin</a>, Cinevva के CTO और Co-Founder</em></p>
<img src="https://cdn.cinevva.com/blog/why-webgpu-engine-hero.jpg" alt="A stylized low-poly world rendered by Cinevva's WebGPU engine: rolling hills, a cave carved into a cliff, a winding river, and an avatar mid-stride on a path at golden hour" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>जो भी तकनीकी इंसान Cinevva World को देखता है, वह पाँच मिनट के अंदर एक ही बात पूछता है। आपकी टीम छोटी है। पक्के web 3D engines पहले से मौजूद हैं। आपने PlayCanvas या Babylon पर खड़े होकर तेज़ी से shipping करने के बजाय अपना खुद का renderer, अपना character physics, अपना animation system क्यों लिखा?</p>
<p>यह एक जायज़ सवाल है, और &quot;यहाँ नहीं बना तो हम नहीं लेंगे&quot; इसका गलत जवाब है। हमने अपना होमवर्क किया। फैसला लेने से पहले हमने मौजूदा engines चलाए, उनका source पढ़ा, और उनमें से दो के ऊपर spikes ship किए। यह पोस्ट उसी फैसले का ईमानदार वर्ज़न है: तैयार विकल्प असल में किसमें अच्छे हैं, वे चार जगहें जहाँ हमारी ज़रूरतें इतनी ज़्यादा अलग हो गईं कि अपना बनाना सही लगा, और वे हालात जहाँ आपको हमारी नकल करने के बजाय इनमें से कोई एक चुनना चाहिए। हमने इस build को एक लंबी चलने वाली <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">open-world-in-the-browser engineering series</a> में दर्ज किया है, तो नीचे जहाँ किसी दावे के पीछे एक चलता हुआ log है, वहाँ मैं उसका link दूँगा।</p>
<h2 id="जिन-विकल्पों-को-हमने-वाकई-परखा" tabindex="-1">जिन विकल्पों को हमने वाकई परखा <a class="header-anchor" href="#जिन-विकल्पों-को-हमने-वाकई-परखा" aria-label="Permalink to &quot;जिन विकल्पों को हमने वाकई परखा&quot;"></a></h2>
<p>चार चीज़ों को &quot;web game engines&quot; कहा जाता है, और वे एक जैसी चीज़ें नहीं हैं।</p>
<p><strong>Three.js</strong> एक rendering library है, game engine नहीं। यह आपको एक scene graph, materials, loaders, और एक renderer देता है, और फिर आपके रास्ते से हट जाता है। कोई editor नहीं, कोई physics नहीं, कोई entity system नहीं, आपके game की संरचना को लेकर कोई राय नहीं। यही इसका आकर्षण है और यही इसकी कीमत भी। renderer के ऊपर सब कुछ आप खुद बनाते हैं, पर कोई चीज़ आपसे नहीं लड़ती। यह MIT-licensed है, इस क्षेत्र में इसका ecosystem सबसे बड़ा है, और जब रात के 2 बजे आप किसी अनजान shader bug में फँसते हैं तो एक forum जवाब पहले से मौजूद होता है।</p>
<p><strong>Babylon.js</strong> एक पूरा engine है जिसमें एक scene graph, एक physics integration (Havok), एक asset pipeline, और एक web editor है। यह MIT-licensed है, Microsoft की एक टीम इसके पीछे है, और इसका WebGPU काम तेज़ी से आगे बढ़ रहा है। अगर आप सब कुछ शामिल चाहते हैं और engine की संरचना के भीतर रहकर खुश हैं, तो यह एक मज़बूत डिफ़ॉल्ट है।</p>
<p><strong>PlayCanvas</strong> &quot;web के लिए Unity&quot; के सबसे करीब है। इसे लिखते वक्त engine v2.19.6 पर है, जो 5 जून 2026 को रिलीज़ हुआ, और engine खुद MIT के तहत open source है। पर ज़्यादातर लोग असल में जो इस्तेमाल करते हैं वह है hosted visual editor, और वह editor एक commercial product है, open source नहीं। PlayCanvas एक entity-component system इस्तेमाल करता है, आप TypeScript या JavaScript में script करते हैं, assets एक server-side GLB pipeline से होकर जाते हैं, और असली commercial games इस पर ship हो चुके हैं (एक के लिए, Snap अपना production काम PlayCanvas पर चलाता है)। इसका renderer WebGL2 पर चलता है, और इसका WebGPU path अभी डिफ़ॉल्ट होने के बजाय पक रहा है। वह आखिरी बात जितनी लगती है उससे ज़्यादा मायने रखती है, और मैं उस पर वापस आऊँगा।</p>
<p><strong>Unity WebGL</strong> कोई web engine है ही नहीं। यह एक export target है। आप Unity desktop editor में बनाते हैं और एक WebGL bundle में compile करते हैं। यह तब सही टूल है जब आपके पास पहले से एक Unity game हो और आप उसे एक browser में चाहते हों, और तब गलत टूल है जब &quot;एक mid-range phone पर एक tab में तुरंत load हो जाए&quot; एक सख्त ज़रूरत हो, क्योंकि runtime और download का वज़न साथ में चला आता है।</p>
<p>इनमें से कोई भी एक सामान्य web game के लिए एक वाजिब नींव है। हमारे पास एक सामान्य web game नहीं था।</p>
<h2 id="फैसला-एक-webgpu-हमारी-फर्श-है-हमारी-आखिरी-रेखा-नहीं" tabindex="-1">फैसला एक: WebGPU हमारी फर्श है, हमारी आखिरी रेखा नहीं <a class="header-anchor" href="#फैसला-एक-webgpu-हमारी-फर्श-है-हमारी-आखिरी-रेखा-नहीं" aria-label="Permalink to &quot;फैसला एक: WebGPU हमारी फर्श है, हमारी आखिरी रेखा नहीं&quot;"></a></h2>
<p>जो बँटवारा हमें हर तैयार समाधान से हटाता है वह यह है। हमारे लिए WebGPU एक ज़रूरत है, कोई ऐसी सुविधा नहीं जिसमें हम धीरे-धीरे बढ़ेंगे।</p>
<p>हमारा terrain एक स्थिर heightmap नहीं है। यह एक streamed heightmap field और signed-distance field से समर्थित marching-cubes chunks का एक hybrid है, ताकि world में असली caves और overhangs हो सकें, और creators इसे live sculpt कर सकें। sculpt brushes, foliage scatter, और terrain meshing सब compute shaders की तरह चलते हैं। compute हटा दो तो world बिगड़ता नहीं, वह चलता ही नहीं।</p>
<p>यह ठीक उसके उलट है जहाँ general-purpose engines आज बैठे हैं। उनका WebGPU support एक WebGL2-first renderer के ऊपर progressive enhancement की तरह बनाया गया है, और जिन browsers में यह नहीं है उनके लिए एक fallback path के साथ। खास तौर पर PlayCanvas WebGL2-first है और इसका WebGPU अभी beta में है। उनके लिए यह सही फैसला है, क्योंकि उनका काम है games के सबसे चौड़े संभव मैट्रिक्स को devices के सबसे चौड़े संभव मैट्रिक्स पर चलाना। हमारा काम संकरा और गहरा है, इसलिए हमने उलटा फैसला लिया: हम spike 13 पर WebGPU-only हो गए और फिर कभी पीछे मुड़कर नहीं देखा। WebGPU के बिना browsers को घटाया नहीं जाता, वे असमर्थित हैं, और हम इसे एक reach संख्या की तरह track करते हैं, यह दिखावा करने के बजाय कि एक WebGL2 fallback बस एक config flag दूर है। वह नहीं है। वह हमारे terrain और foliage stages का एक आंशिक rewrite होगा।</p>
<p>एक WebGL2-first engine पर बनाने का मतलब होता या तो हर compute feature पर उसकी fallback मान्यताओं से लड़ना, या हमेशा के लिए दो rendering paths बनाए रखना। renderer का मालिक होने से हमें compute को बेसलाइन की तरह बरतने का मौका मिला।</p>
<h2 id="फैसला-दो-एक-character-solver-एक-physics-engine-नहीं" tabindex="-1">फैसला दो: एक character solver, एक physics engine नहीं <a class="header-anchor" href="#फैसला-दो-एक-character-solver-एक-physics-engine-नहीं" aria-label="Permalink to &quot;फैसला दो: एक character solver, एक physics engine नहीं&quot;"></a></h2>
<p>किताबी चाल है एक physics engine लाकर डाल देना। हमने वह आज़माया। एक शुरुआती spike ने एक worker में Rapier को चलते हुए validate किया, और वह ठीक लगा।</p>
<p>फिर भी हमने अपना खुद का लिखा, और shipped build में कहीं भी Rapier, Cannon, या Ammo नहीं है। वजह है scope। हमें rigid bodies, joints, ragdolls, या एक constraint solver की ज़रूरत नहीं है। हमें एक capsule चाहिए जो terrain के खिलाफ सही ढंग से चले, और हमें walking, sliding, gliding, climbing, और swimming को &quot;मैं grounded हूँ या नहीं, किस surface पर, किस कोण पर&quot; के एक साझा जवाब पर सहमत होना चाहिए। एक general physics engine इसे आसान नहीं, मुश्किल बनाता है, क्योंकि वे modes आखिर में उसके भीतरी springs और dampers से लड़ने लगते हैं।</p>
<p>तो हमारा character controller एक <a href="/hi/blog/2026-05-15-open-world-browser-part-29-pluggable-character.html">pluggable multi-channel state machine</a> है। हर mode एक छोटी unit है जो बताती है कि क्या वह इस frame में control चाहती है और, अगर वह जीतती है, तो velocity और facing लिखती है। वे तीन channels के पार प्राथमिकता से तय करती हैं, resource फिर stance फिर locomotion, और वे सब एक ही terrain query पढ़ती हैं। Collision chunk के हिसाब से heightmap या signed-distance field के खिलाफ एक capsule probe है।</p>
<p>जिस ब्योरे पर मुझे सबसे ज़्यादा गर्व है वह बेरंग है। Ground detection आपके पैरों के नीचे की ऊर्ध्वाधर column में हर surface को scan करता है और SDF gradient पर भरोसा करने के बजाय capsule के बराबर या नीचे वाली सबसे ऊँची surface चुनता है। एक overhang के किनारे पर बगल में सबसे नज़दीकी surface cliff का चेहरा होती है, तो एक gradient-आधारित normal &quot;floor&quot; और &quot;wall&quot; के बीच टिमटिमाता है और आपको phantom sliding मिलती है। column query एक ledge पर खड़ा होना उबाऊ बना देती है, जो बिलकुल वही है जो आप चाहते हैं। एक तैयार heightfield collider हमें यह मुफ्त में नहीं देता, क्योंकि वह तो हमारे terrain को देख ही नहीं सकता। terrain हमारे format में GPU पर रहता है। कोई बाहरी engine इसके खिलाफ collide नहीं कर सकता बिना हमारे हर edit पर पूरे field को उसके collider format में कॉपी किए।</p>
<h2 id="फैसला-तीन-ऐसा-animation-जो-rigs-के-पार-सफर-करे" tabindex="-1">फैसला तीन: ऐसा animation जो rigs के पार सफर करे <a class="header-anchor" href="#फैसला-तीन-ऐसा-animation-जो-rigs-के-पार-सफर-करे" aria-label="Permalink to &quot;फैसला तीन: ऐसा animation जो rigs के पार सफर करे&quot;"></a></h2>
<p>Avatars Synty POLYGON rig इस्तेमाल करते हैं, और हमारे motion clips एक बड़ी open animation library से आते हैं। चूँकि rig और clips bone names साझा करते हैं, आम मामले में runtime पर किसी retargeting की ज़रूरत नहीं होती, tracks बस name से bind हो जाते हैं। हमने पूरी character pipeline को <a href="/hi/blog/2026-05-10-open-world-browser-part-25-universal-characters.html">universal characters</a> में लिखा है।</p>
<p>दिलचस्प काम वह मामला है जहाँ वे मेल नहीं खाते। हमने एक retargeting pass बनाया जो एक skeleton को दूसरे पर map करता है, और इसे सही करने का मतलब था तीन खास समस्याएँ हल करना। आप पहले bind poses को align करते हैं, क्योंकि एक T-pose के खिलाफ एक A-pose चुपचाप हर joint पर लगभग तीस डिग्री जोड़ देती है। आप root motion और stride को दो अलग अनुपातों से scale करते हैं, ऊर्ध्वाधर के लिए hip-to-floor और क्षैतिज के लिए कुल अनुपात। और आप retargeted clips को उनके source के खिलाफ एक तय sample rate पर test करते हैं, ताकि regressions एक player के सामने आने से पहले दिख जाएँ। वही pipeline है जो हमें नए animation sources, और आखिरकार creator-supplied characters, जोड़ने देती है बिना हर clip को हाथ से ठीक किए।</p>
<p>उसके ऊपर एक animation state machine बैठता है जो हर frame में motion state से सही clip family चुनता है: speed के हिसाब से jump variant, impact के हिसाब से landing की तीव्रता, terrain gradient के खिलाफ velocity के dot से slope की दिशा, foot-phase-सही stops ताकि आप रुकते वक्त moonwalk न करें, और एक सौ-millisecond का debounce ताकि एक दीवार से टकराने पर आप walk और fall के बीच न टिमटिमाएँ। इसमें से कुछ भी अनोखा नहीं है, पर यह वैसी चीज़ है जो आपको सिर्फ इस layer का मालिक होने से मिलती है।</p>
<h2 id="फैसला-चार-वह-हिस्सा-जो-कोई-engine-ship-नहीं-करता" tabindex="-1">फैसला चार: वह हिस्सा जो कोई engine ship नहीं करता <a class="header-anchor" href="#फैसला-चार-वह-हिस्सा-जो-कोई-engine-ship-नहीं-करता" aria-label="Permalink to &quot;फैसला चार: वह हिस्सा जो कोई engine ship नहीं करता&quot;"></a></h2>
<p>बाकी तीन फैसले इस बारे में हैं कि world कैसे चलता है। यह इस बारे में है कि product क्या है, और यही वजह है कि PlayCanvas से तुलना आखिर में एक category की गलती है।</p>
<p>PlayCanvas, Babylon, Unity, और एक हाथ से बना Three.js app सब एक ही आकार मान लेते हैं: आप अपना game एक डेस्क पर, एक 2D editor में बनाते हैं, world को बाहर से देखते हुए, और फिर आप play दबाते हैं और एक अलग runtime ship करते हैं। यहाँ तक कि उनका in-engine editing भी एक workstation पर बैठे आप होते हैं जो एक scene को देखते हुए उससे छेड़छाड़ कर रहे होते हैं।</p>
<p>Cinevva World इसे उलट देता है। आप world के भीतर से, एक avatar के रूप में उसी जगह खड़े होकर जहाँ आपके players खड़े होंगे, यह बताकर कि आप क्या चाहते हैं और उसे प्रकट होते हुए देखकर बनाते हैं। Creation और play एक लगातार चलने वाला session हैं, एक runtime से जुड़ा कोई build step नहीं। सबसे करीबी संदर्भ बिंदु Roblox, Rec Room, और Horizon Worlds हैं, web 3D engines नहीं, और वे भी ज़्यादातर creation को एक डेस्क पर ही रखते हैं। जो चीज़ इसे एक mouse-चालित editor के बिना संभव बनाती है वह है AI builder, जो &quot;यहाँ एक lantern से रोशन dock रखो&quot; को geometry और placement में बदल देता है।</p>
<p>आप इसे एक general-purpose engine पर जोड़ नहीं सकते, क्योंकि यह कोई rendering feature नहीं है। यह पूरे stack की बुनियादी मान्यता है, इस बात से कि terrain runtime पर कैसे editable है, इस बात तक कि network हर object को कैसे ऐसी चीज़ की तरह बरतता है जिसे पास खड़े किसी इंसान ने अभी बनाया हो।</p>
<h2 id="आपको-कब-वह-नहीं-करना-चाहिए-जो-हमने-किया" tabindex="-1">आपको कब वह नहीं करना चाहिए जो हमने किया <a class="header-anchor" href="#आपको-कब-वह-नहीं-करना-चाहिए-जो-हमने-किया" aria-label="Permalink to &quot;आपको कब वह नहीं करना चाहिए जो हमने किया&quot;"></a></h2>
<p>यह वह हिस्सा है जिसे &quot;हमने अपना engine बनाया&quot; वाली पोस्टें आम तौर पर छोड़ देती हैं। अगर आप इसी तिमाही एक browser game ship करना चाहते हैं, तो हमारी नकल मत करिए। PlayCanvas इस्तेमाल करिए अगर आप एक Unity-शैली का editor और एक managed pipeline चाहते हैं। Babylon इस्तेमाल करिए अगर आप physics सहित एक पूरा engine चाहते हैं और उसकी संरचना के भीतर खुश हैं। Three.js इस्तेमाल करिए अगर आप ज़्यादा से ज़्यादा control और कम से कम राय चाहते हैं और आपके पास इसके ऊपर बनाने वाली टीम है। Unity से port करिए अगर आपके पास पहले से एक Unity game है।</p>
<p>अपना खुद का renderer, physics, और animation लिखना सिर्फ तभी सही फैसला है जब आपके product की बुनियादी मान्यता तैयार समाधानों के साथ बेमेल हो, जब आप जो बना रहे हैं वह किसी engine पर एक game न होकर एक ऐसी जगह हो जो संयोग से एक engine से बनी है। हमारे लिए यह सच था। आपके लिए शायद सच नहीं है, और यह ठीक है। मूल्यांकन ईमानदारी से करने का मकसद यही है कि पहली लाइन लिखने से पहले आप जान लें कि आप किस मामले में हैं।</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[खाली दुनिया एक उदास दुनिया है: हर उस creator platform से क्या सीखा जा सकता है जो जिया या मरा]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-06-06-how-creator-worlds-live-or-die</link>
            <guid>https://app.cinevva.com/hi/blog/2026-06-06-how-creator-worlds-live-or-die</guid>
            <pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[हमने एक AI बनाया है जो एक वाक्य से एक साझा 3D world में पूरी इमारतें खड़ी कर देता है। इसे सबके लिए खोलने से पहले, हमने हर मिलते-जुलते platform के launch का अध्ययन किया जो हमें मिल सका। कब्रिस्तान बहुत बड़ा है, बचे हुए बहुत कम हैं, और दोनों के बीच की रेखा hype के मानने से कहीं ज़्यादा साफ है। यहां वो कहानियां, वो आंकड़े, और हम जो अलग कर रहे हैं वो सब हैं।]]></description>
            <content:encoded><![CDATA[<h1 id="खाली-दुनिया-एक-उदास-दुनिया-है-हर-उस-creator-platform-से-क्या-सीखा-जा-सकता-है-जो-जिया-या-मरा" tabindex="-1">खाली दुनिया एक उदास दुनिया है: हर उस creator platform से क्या सीखा जा सकता है जो जिया या मरा <a class="header-anchor" href="#खाली-दुनिया-एक-उदास-दुनिया-है-हर-उस-creator-platform-से-क्या-सीखा-जा-सकता-है-जो-जिया-या-मरा" aria-label="Permalink to &quot;खाली दुनिया एक उदास दुनिया है: हर उस creator platform से क्या सीखा जा सकता है जो जिया या मरा&quot;"></a></h1>
<p><em>लेखक <a href="/hi/about.html">Oleg Sidorkin</a>, Cinevva के CTO और सह-संस्थापक</em></p>
<figure style="margin:1.5rem 0">
<img src="/img/blog/ai-builder-hero.webp" alt="Cinevva's AI Builder constructing a two-story house from a chat prompt" style="width:100%;border-radius:10px">
<figcaption style="color:#9aa7b4;font-size:0.85rem;margin-top:0.5rem">हमारा AI Builder। किसी ने टाइप किया "build a second floor" और AI ने फर्श की deck बिछाई, दीवारें खड़ी कीं, और आगे सीढ़ियां और छत बनाने की पेशकश की, और यह सब एक ऐसी दुनिया के अंदर जिसमें दूसरे लोग चलकर आ सकते हैं।</figcaption>
</figure>
<p>अब हम worlds generate कर सकते हैं, और मेरा मतलब किसी demo reel से नहीं है। ऊपर की तस्वीर हमारा editor है। किसी ने एक chat box में &quot;build a second floor&quot; टाइप किया और देखा कि AI ने फर्श की deck बिछाई, आगे, बगल और पीछे की दीवारें खड़ी कीं, और सीढ़ियों व छत के साथ आगे बढ़ने की पेशकश की। props नहीं, textures नहीं, पूरी संरचनाएं, एक ऐसी दुनिया में रखी गईं जिसमें दूसरे लोग चलकर आ सकते हैं। हमारी pipeline पहले से ही हिस्से भी बनाती है: 3D models, music, sound, materials।</p>
<p>तो हम Cinevva World को जनता के लिए खोलने के करीब हैं। और ऐसा करने से पहले, मैं गया और मौत की खबरें पढ़ीं।</p>
<p>क्योंकि हम जो बना रहे हैं उसके बारे में असहज सच यही है। पंद्रह साल से, बहुत समझदार, बहुत अच्छी फंडिंग वाली टीमों ने साझा रचनात्मक worlds को काम करने लायक बनाने की कोशिश की है। कुछ इंसानियत की बनाई सबसे बड़ी चीज़ों में से बन गए। ज़्यादातर मर चुके हैं। इन दो नतीजों के बीच का फासला न प्रतिभा है और न पैसा, क्योंकि कुछ मरने वालों के पास हमसे कहीं ज़्यादा दोनों थे। फासला है कुछ चंद फैसले जो लगभग कोई भी पहली बार में सही नहीं कर पाता। मुझे यही मिला।</p>
<h2 id="कब्रिस्तान" tabindex="-1">कब्रिस्तान <a class="header-anchor" href="#कब्रिस्तान" aria-label="Permalink to &quot;कब्रिस्तान&quot;"></a></h2>
<p>नाकामियों से शुरू करें, क्योंकि वे कामयाबी की कहानियों से ज़्यादा ईमानदार होती हैं। जीतने वाले अपना इतिहास एक साफ-सुथरी कहानी में दोबारा लिख देते हैं। हारने वाले memos leak कर देते हैं।</p>
<h3 id="meta-horizon-worlds-अब-तक-का-सबसे-महंगा-खाली-कमरा" tabindex="-1">Meta Horizon Worlds: अब तक का सबसे महंगा खाली कमरा <a class="header-anchor" href="#meta-horizon-worlds-अब-तक-का-सबसे-महंगा-खाली-कमरा" aria-label="Permalink to &quot;Meta Horizon Worlds: अब तक का सबसे महंगा खाली कमरा&quot;"></a></h3>
<p>Meta ने अपने metaverse दांव पर दसियों अरब डॉलर खर्च किए। Reality Labs ने 2026 की शुरुआत में रिपोर्ट किया गया एक ही तिमाही में <a href="https://www.cnbc.com/2026/03/18/meta-horizon-worlds-metaverse-vr.html" target="_blank" rel="noreferrer">$6.02 अरब का operating loss</a> दर्ज किया, और वह सालों से हर तिमाही कई अरब का घाटा झेल रहा था। flagship था Horizon Worlds। यहां वह है जो उस पैसे ने खरीदा।</p>
<figure style="margin:1.5rem 0">
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:10px">
<iframe src="https://www.youtube-nocookie.com/embed/mNbz7-ejnZw" title="Horizon Worlds - Official Trailer" loading="lazy" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen style="position:absolute;top:0;left:0;width:100%;height:100%"></iframe>
</div>
<figcaption style="color:#9aa7b4;font-size:0.85rem;margin-top:0.5rem">Meta का Horizon Worlds, official trailer। जिस platform पर Meta ने अरबों खर्च किए, वह जून 2026 में एक mobile app के रूप में बचे रहने के लिए VR support हटा देता है।</figcaption>
</figure>
<p>एक leak हुआ internal memo, जिसे <a href="https://fortune.com/2022/10/07/metas-horizon-world-quality-poor-not-even-employees-using-says-metaverse-vp-leaked-memo/amp/" target="_blank" rel="noreferrer">Fortune</a> और <a href="https://ryanschultz.com/2022/10/07/leaked-internal-memos-from-meta-detail-problems-with-horizon-worlds-and-horizon-workrooms/" target="_blank" rel="noreferrer">Ryan Schultz</a> ने रिपोर्ट किया, उसने बताया कि creators ने जो worlds बनाए उनमें से सिर्फ़ करीब 9 प्रतिशत को कभी 50 या ज़्यादा लोगों ने देखा। ज़्यादातर को उनके अपने बनाने वाले के सिवा शून्य visits मिले। एक memo ने engagement की समस्या को एक वाक्य में समेट दिया जो इस क्षेत्र के हर founder पर गुदवा देना चाहिए: <a href="https://kotaku.com/meta-facebook-horizon-worlds-vr-mark-zuckerberg-1849669048" target="_blank" rel="noreferrer">&quot;खाली दुनिया एक उदास दुनिया है।&quot;</a> active users का survey करने के इच्छुक शोधकर्ताओं को उनमें से सिर्फ़ 514 ही मिल पाए, क्योंकि player base इतना छोटा था।</p>
<p>retention के आंकड़े और भी बुरे थे। leak हुए data से पता चला कि पहले महीने के बाद <a href="https://mixed-news.com/en/horizon-worlds-leak-only-1-in-10-users-return-web-launch-coming/" target="_blank" rel="noreferrer">सिर्फ़ हर 10 में से करीब 1 user लौटा</a>। Meta ने चुपचाप अपने 2022 के लक्ष्य को 500,000 monthly users से घटाकर 200,000 कर दिया, और तब भी platform पर VRChat से कम और Second Life, जो 2003 का एक game है, से भी कम concurrent users थे। internal dogfooding dashboards ने दिखाया कि Meta के अपने कर्मचारी इसका इस्तेमाल नहीं कर रहे थे, जिसने management को साप्ताहिक logins के लिए managers को जवाबदेह ठहराना शुरू करने पर मजबूर किया। एक VP ने टीम को बाकी साल के लिए &quot;quality lockdown&quot; में डाल दिया और लिखित में माना कि वे एक ऐसे product पर काम कर रहे थे जिसने product-market fit नहीं पाया था।</p>
<p>मार्च 2026 में, Meta ने <a href="https://www.cnbc.com/2026/03/18/meta-horizon-worlds-metaverse-vr.html" target="_blank" rel="noreferrer">पूरी तरह VR support बंद करने की घोषणा की</a> और Horizon Worlds को लगभग पूरी तरह एक mobile app में बदल दिया, headsets के बिना लोगों के लिए एक entry point, जो उनके अपने शब्दों में, Roblox की तरह काम करता है। अब तक बना सबसे महंगा metaverse अपनी ज़िंदगी उसी चीज़ बनने की कोशिश में खत्म कर रहा था जो उसे पहले ही दिन होना चाहिए था।</p>
<p>सबक &quot;VR बहुत जल्दी आ गया&quot; नहीं है, हालांकि वह था। सबक यह है कि कितनी भी पूंजी एक खाली दुनिया को नहीं भर सकती। Content density ऐसी चीज़ नहीं जो आप marketing budget से खरीद सकें। अगर worlds खाली हैं, तो लोग चले जाते हैं, और जब लोग चले जाते हैं, तो worlds खाली रह जाते हैं। उस चक्र ने Meta को ज़िंदा निगल लिया।</p>
<h3 id="decentraland-और-the-sandbox-अरबों-डॉलर-के-भुतहा-शहर" tabindex="-1">Decentraland और The Sandbox: अरबों डॉलर के भुतहा शहर <a class="header-anchor" href="#decentraland-और-the-sandbox-अरबों-डॉलर-के-भुतहा-शहर" aria-label="Permalink to &quot;Decentraland और The Sandbox: अरबों डॉलर के भुतहा शहर&quot;"></a></h3>
<p>अक्टूबर 2022 में, एक अकेले data point ने crypto की दुनिया में आग लगा दी। <a href="https://www.coindesk.com/web3/2022/10/07/its-lonely-in-the-metaverse-decentralands-38-daily-active-users-in-a-13b-ecosystem" target="_blank" rel="noreferrer">DappRadar ने रिपोर्ट किया</a> कि Decentraland के 38 daily active users थे। The Sandbox के 522। इन दोनों प्रोजेक्ट्स की उस समय market capitalization करीब $1.3 अरब थी।</p>
<figure style="margin:1.5rem 0">
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:10px">
<iframe src="https://www.youtube-nocookie.com/embed/Zg5vcdEeLOA" title="The Sandbox Official Teaser" loading="lazy" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen style="position:absolute;top:0;left:0;width:100%;height:100%"></iframe>
</div>
<figcaption style="color:#9aa7b4;font-size:0.85rem;margin-top:0.5rem">The Sandbox, official teaser। इसकी और Decentraland की valuations करीब $1.3 अरब थीं जबकि उनके daily users सैकड़ों से लेकर कुछ हज़ार तक थे।</figcaption>
</figure>
<p>अब, प्रोजेक्ट्स ने पलटवार किया, और बारीकी असल में इस तंज़ से ज़्यादा मायने रखती है। 38 का आंकड़ा सिर्फ़ एक दिन में on-chain transactions करने वाले unique wallets को गिनता था, जिसे DappRadar &quot;payers&quot; कहता है, न कि उन लोगों को जो log in करके इधर-उधर घूमे बिना blockchain को छुए। Decentraland ने जवाब दिया कि उसके <a href="https://blockworks.com/news/metaverse-platforms-set-the-record-straight-about-daily-active-users" target="_blank" rel="noreferrer">56,697 monthly logged-in users</a> थे और दूसरे अनुमानों के मुताबिक करीब 8,000 daily। The Sandbox ने एक alpha season के दौरान 39,000 daily होने का दावा किया जिसमें day-14 retention 40 प्रतिशत था।</p>
<p>लेकिन एक पल के लिए इस फासले के साथ बैठिए, क्योंकि यह इस पूरे निबंध का सबसे ज़रूरी आंकड़ा है। उदार आंकड़े मान लें तब भी, आपके पास अरबों डॉलर की valuations हैं जो ज़्यादा से ज़्यादा कुछ हज़ार daily users के ऊपर टिकी हैं। तुलना के लिए, शोध में सामने आया कि non-blockchain Roblox के पास उसी दौर में <a href="https://blockworks.com/news/metaverse-platforms-set-the-record-straight-about-daily-active-users" target="_blank" rel="noreferrer">52 मिलियन daily active users थे लेकिन सिर्फ़ 11.3 मिलियन monthly paying users</a>। मुफ़्त virtual worlds में ज़्यादातर लोग कभी-कभार या कभी नहीं transact करते। यह दोनों तरफ काटता है। इसका मतलब है कि 38-DAU वाला तंज़ नाइंसाफ़ी था, और इसका मतलब है कि अरबों डॉलर की valuation एक कल्पना थी। दोनों चीज़ों ने गलत आंकड़ा नापा। valuation ने token speculation नापा। तंज़ ने wallet transactions नापीं। किसी ने भी यह नहीं नापा कि कोई मज़े कर रहा था या नहीं।</p>
<p>यह vanity-metric जाल अपने सबसे शुद्ध रूप में है। registered accounts, token market cap, total addressable market, press impressions: इनमें से कोई भी आपको नहीं बताता कि आपकी दुनिया ज़िंदा है या नहीं। ऐसा बताने वाले एकमात्र आंकड़े हैं कि कितने लोग दोबारा आते हैं, और क्या चीज़ें बनाने वाले लोग चीज़ें बनाते रहते हैं।</p>
<h3 id="dreams-सबसे-खूबसूरत-tool-जिसमें-कोई-टिक-न-सका" tabindex="-1">Dreams: सबसे खूबसूरत tool जिसमें कोई टिक न सका <a class="header-anchor" href="#dreams-सबसे-खूबसूरत-tool-जिसमें-कोई-टिक-न-सका" aria-label="Permalink to &quot;Dreams: सबसे खूबसूरत tool जिसमें कोई टिक न सका&quot;"></a></h3>
<p>Media Molecule, वह studio जो LittleBigPlanet के पीछे था, उसने Dreams बनाने में करीब एक दशक का बड़ा हिस्सा बिताया, एक ऐसा creation tool जो इतना गहरा था कि लोगों ने उसके अंदर खेलने लायक games, animated short films, और music albums बनाए। आलोचकों ने इसे बहुत सराहा। और <a href="https://www.pushsquare.com/news/2023/07/dreams-live-service-ending-as-media-molecule-couldnt-find-a-sustainable-path" target="_blank" rel="noreferrer">सितंबर 2023 में, studio ने live service बंद कर दी</a>, साफ़ कहते हुए कि उन्हें एक टिकाऊ business model नहीं मिल पाया।</p>
<figure style="margin:1.5rem 0">
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:10px">
<iframe src="https://www.youtube-nocookie.com/embed/2ltgkcoQzow" title="Dreams | Release Date Trailer | PS4" loading="lazy" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen style="position:absolute;top:0;left:0;width:100%;height:100%"></iframe>
</div>
<figcaption style="color:#9aa7b4;font-size:0.85rem;margin-top:0.5rem">Dreams, Media Molecule का। एक creation tool जिसे लोगों ने बहुत सराहा, जिसकी live service 2023 में बिना creators के एक पैसा भी कमाने के रास्ते के खत्म हो गई।</figcaption>
</figure>
<p>postmortem खुद को पहुंचाई गई चोटों की एक चेकलिस्ट है, और मैं यह बहुत सम्मान के साथ कहता हूं, क्योंकि हम इनमें से हर एक कर सकते हैं। Dreams ने <a href="https://www.pushsquare.com/news/2023/07/dreams-live-service-ending-as-media-molecule-couldnt-find-a-sustainable-path" target="_blank" rel="noreferrer">creators को अपने काम से कभी कमाई करने नहीं दी</a>। वादा किया गया in-game store कभी आया ही नहीं। कोई cosmetics नहीं, कोई battle pass नहीं, कुछ नहीं। गंभीर creators, वो किस्म जो एक tool को platform में बदलते हैं, उनके पास सालों लगाने की कोई वजह नहीं थी जब कोई फ़ायदा ही नहीं था। यह PS4-only launch हुआ, launch पर न कोई PC version और न native PS5 build के साथ, जिसने इसके संभावित audience पर कड़ी रोक लगा दी। और co-founder <a href="https://icon-era.com/threads/media-molecule-co-founders-biggest-regret-with-dreams-was-not-focusing-on-multiplayer-understands-new-ip-is-more-of-a-game-than-a-creative-tool.11724/" target="_blank" rel="noreferrer">Mark Healey ने बाद में कहा कि उनका सबसे बड़ा अफ़सोस multiplayer पर ध्यान न देना था</a>, और कि टीम यह समझ गई कि उनकी रचना एक creative tool के मुकाबले एक game के रूप में बेहतर काम करती थी।</p>
<p>उस आखिरी हिस्से को दोबारा पढ़िए। धरती पर सबसे प्रतिभाशाली UGC studio ने, बाद में, यह निष्कर्ष निकाला कि यह चीज़ पहले एक game और बाद में एक tool होनी चाहिए थी। यह इस पूरे अध्ययन का सबसे ज़रूरी एकमात्र वाक्य है, और हम इस पर वापस आएंगे।</p>
<h3 id="बाकी-का-कब्रिस्तान" tabindex="-1">बाकी का कब्रिस्तान <a class="header-anchor" href="#बाकी-का-कब्रिस्तान" aria-label="Permalink to &quot;बाकी का कब्रिस्तान&quot;"></a></h3>
<p>यह पैटर्न खौफ़नाक नियमितता से दोहराता है।</p>
<p><a href="https://www.gamedeveloper.com/business/crayta-to-shut-down-after-launch-platform-stadia-bites-the-dust" target="_blank" rel="noreferrer">Crayta</a>, एक सहयोगी UGC creation platform, मार्च 2023 में बंद हो गया और users ने वह सब खो दिया जो उन्होंने बनाया था। इसके developer को 2021 में Meta ने खरीदा था और फिर भी platform मार दिया गया। तत्काल वजह: यह Google Stadia पर launch हुआ, और जब Stadia मरा, तो Crayta उसके साथ मर गया। Platform dependency आपके अपने सिर पर तनी एक भरी हुई बंदूक है।</p>
<figure style="margin:1.5rem 0">
<img src="https://cdn.cinevva.com/blog/lived-or-died-crayta.webp" alt="Crayta, the collaborative game-creation platform" loading="lazy" style="width:100%;border-radius:10px">
<figcaption style="color:#9aa7b4;font-size:0.85rem;margin-top:0.5rem">Crayta Google Stadia पर launch हुआ। जब Stadia 2023 में बंद हुआ, Crayta उसके साथ चला गया, और creators ने वह सब खो दिया जो उन्होंने बनाया था। Trailer still।</figcaption>
</figure>
<p>Project Spark, Microsoft का UGC game-maker, सालों पहले उसी राह पर बंद हुआ: एक ताकतवर tool, टिकने वाले लोग पर्याप्त नहीं। Sansar, Linden Lab का Second Life का VR उत्तराधिकारी, audience न पाने के बाद बेच दिया गया। High Fidelity, Second Life के अपने ही founder Philip Rosedale की दूसरी metaverse कंपनी, virtual worlds से पूरी तरह दूर हट गई।</p>
<figure style="margin:1.5rem 0">
<img src="https://cdn.cinevva.com/blog/lived-or-died-secondlife.webp" alt="Second Life, Linden Lab's user-created virtual world" loading="lazy" style="width:100%;border-radius:10px">
<figcaption style="color:#9aa7b4;font-size:0.85rem;margin-top:0.5rem">Second Life, Linden Lab की 2003 की दुनिया, दो दशक से ज़्यादा बाद भी चल रही है। इसके अपने VR उत्तराधिकारी, Sansar और Philip Rosedale की High Fidelity, दोनों नाकाम रहे। Trailer still।</figcaption>
</figure>
<p>और एक ऐसे संकेत में जिसे आप नज़रअंदाज़ नहीं कर सकते क्योंकि यह अभी हो रहा है, Rec Room ने <a href="https://www.uploadvr.com/vrchat-statement-after-rec-room-and-horizon-worlds-fold/" target="_blank" rel="noreferrer">1 जून 2026 से बंद होने की घोषणा की</a>, यह बताते हुए कि वह कभी टिकाऊ मुनाफ़े तक नहीं पहुंचा।</p>
<p>metaverse कंपनियों के founders, metaverses बना रहे थे, अपने ही metaverses में टिक नहीं सके। यह उस किसी को भी डरा देना चाहिए जो सोचता है कि मुश्किल हिस्सा rendering है।</p>
<figure style="margin:1.5rem 0">
<img src="https://cdn.cinevva.com/blog/lived-or-died-recroom.webp" alt="Rec Room, the cross-platform social UGC world" loading="lazy" style="width:100%;border-radius:10px">
<figcaption style="color:#9aa7b4;font-size:0.85rem;margin-top:0.5rem">Rec Room, सबसे बड़े social creation worlds में से एक, 150 मिलियन से ज़्यादा lifetime players तक पहुंचा और फिर भी 1 जून 2026 को बंद हो गया, उस पहुंच को कभी एक टिकाऊ business में बदले बिना। Trailer still।</figcaption>
</figure>
<h2 id="बचे-हुए-और-असल-में-किसने-उन्हें-बचाया" tabindex="-1">बचे हुए, और असल में किसने उन्हें बचाया <a class="header-anchor" href="#बचे-हुए-और-असल-में-किसने-उन्हें-बचाया" aria-label="Permalink to &quot;बचे हुए, और असल में किसने उन्हें बचाया&quot;"></a></h2>
<p>अब ज़िंदा रहने वाले। सीख देने वाली बात यह है कि इनमें से किसी ने भी उस तरह नहीं जीता जैसा आप उम्मीद करेंगे, और कइयों ने उन्हीं नियमों को तोड़कर जीता जिनका नाकामियों ने पालन किया।</p>
<h3 id="roblox-बारह-साल-वाली-रातों-रात-कामयाबी" tabindex="-1">Roblox: बारह साल वाली रातों-रात कामयाबी <a class="header-anchor" href="#roblox-बारह-साल-वाली-रातों-रात-कामयाबी" aria-label="Permalink to &quot;Roblox: बारह साल वाली रातों-रात कामयाबी&quot;"></a></h3>
<p>हर कोई Roblox को model के तौर पर पेश करता है। लगभग कोई भी उसकी नकल नहीं करता जो असल में हुआ, क्योंकि असल में जो हुआ वह बारह साल तक एक नाकामी जैसा दिखना था।</p>
<figure style="margin:1.5rem 0">
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:10px">
<iframe src="https://www.youtube-nocookie.com/embed/LTnMKjXEnMY" title="ROBLOX - Game Trailer" loading="lazy" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen style="position:absolute;top:0;left:0;width:100%;height:100%"></iframe>
</div>
<figcaption style="color:#9aa7b4;font-size:0.85rem;margin-top:0.5rem">Roblox। इसने 2006 में करीब 100 लोग खींचे और exponential growth तक पहुंचने में बारह साल लगाए, और यह सब community को games बनाने देने के दम पर हुआ।</figcaption>
</figure>
<p>Roblox के 2006 के beta ने <a href="https://www.howtheygrow.co/p/how-roblox-grows" target="_blank" rel="noreferrer">करीब 100 tech उत्साही खींचे जिनमें peak concurrency 30 से 40 लोगों की थी</a>। फिर इसने एक दशक से ज़्यादा तक धीरे-धीरे आगे बढ़ना जारी रखा। यह 2016 की शुरुआत में 9 मिलियन users से 2019 में 90 मिलियन और 2023 तक 214 मिलियन तक पहुंचा। founder David Baszucki ने user-generated-content vision से पलटने से इनकार कर दिया, तब भी जब Minecraft 2009 में उनसे आगे फट पड़ा। उन्होंने इसे एक जानबूझकर धीमी पकाई की तरह लिया, और जो एकमात्र कदम मायने रखा वह यह फैसला था कि community को सारे games खुद बनाने दिया जाए बजाय उन्हें in-house बनाने के। इसने content की लागत हटा दी और हर creator को एक growth engine में बदल दिया।</p>
<p>लेकिन यहां वह हिस्सा है जो नकलची चूक जाते हैं, और यही वजह है कि मैं एक दूसरा source खुला रखता हूं। Matthew Ball का <a href="https://www.matthewball.co/all/roblox2024" target="_blank" rel="noreferrer">2024 का teardown</a> दिखाता है कि Roblox भारी पैमाने पर भी एक कठोर घाटे में चल रहा है, करीब negative-38-प्रतिशत operating margin, जहां किसी दिए गए महीने में सिर्फ़ 6 प्रतिशत users उसकी currency खरीदते हैं और per user revenue console platforms का एक अंश है। Roblox दुनिया का सबसे बड़ा game है और फिर भी वह पैसा बनाने के लिए संघर्ष करता है। flywheel असली है और economics मुश्किल है। जो भी आपसे कहे कि एक creator platform पैसे छापने का license है, वह आपको कुछ बेच रहा है।</p>
<p>गहरा सबक, हालांकि, उन्हीं user आंकड़ों में साफ़ छुपा है। Roblox के करोड़ों users में भारी बहुमत कभी कुछ नहीं बनाता। वे दूसरों के बनाए करोड़ों games की एक catalog <em>खेलने</em> आते हैं। उस catalog को बढ़ने में एक दशक और एक developer-payout economy लगी। Roblox कोई building tool नहीं है जिसे लोग खेलते भी हैं। यह खेलने की एक जगह है जिसे लोगों का एक छोटा हिस्सा बनाता भी है। वह क्रम ही सब कुछ है।</p>
<h3 id="minecraft-वह-दुनिया-जो-खाली-हो-ही-नहीं-सकती-थी" tabindex="-1">Minecraft: वह दुनिया जो खाली हो ही नहीं सकती थी <a class="header-anchor" href="#minecraft-वह-दुनिया-जो-खाली-हो-ही-नहीं-सकती-थी" aria-label="Permalink to &quot;Minecraft: वह दुनिया जो खाली हो ही नहीं सकती थी&quot;"></a></h3>
<p>Minecraft के पास कभी खाली-दुनिया वाली समस्या नहीं थी, और यह समझना कि क्यों, यही पूरा खेल है।</p>
<figure style="margin:1.5rem 0">
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:10px">
<iframe src="https://www.youtube-nocookie.com/embed/MmB9b5njVbA" title="Official Minecraft Trailer" loading="lazy" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen style="position:absolute;top:0;left:0;width:100%;height:100%"></iframe>
</div>
<figcaption style="color:#9aa7b4;font-size:0.85rem;margin-top:0.5rem">Minecraft, official trailer। Procedural survival का मतलब था कि दुनिया कभी खाली नहीं थी और उसे खेलने लायक होने के लिए कभी user content की ज़रूरत नहीं थी।</figcaption>
</figure>
<p>Minecraft procedural generation के साथ एक survival game के रूप में आया। दुनिया खुद को बनाती है, अनंत रूप से, और पहले ही मिनट पर आप यह सोचते हुए एक खाली canvas को नहीं ताक रहे होते कि क्या करें। रात ढल रही है और कोई चीज़ आपको मार डालने वाली है, इसलिए आप खुदाई करते हैं। game एक अकेले इंसान के लिए शून्य दूसरे users और शून्य user-generated content के साथ मज़ेदार है, हमेशा के लिए, क्योंकि procedural generator एक अटूट content मशीन है। mods, servers, custom maps, पूरा रचनात्मक ecosystem, यह सब एक ऐसे game के <em>ऊपर</em> उगा जो पहले ही खुद को बेच चुका था। creative mode तब आया जब लाखों लोग पहले ही survival के दीवाने हो चुके थे। बाकी काम word of mouth और YouTube ने किया।</p>
<p>Minecraft ने cold-start को हल किया उसे कभी रखकर ही नहीं। यही cheat code है, और हम इसे चुरा लेंगे।</p>
<h3 id="browser-games-distribution-ही-पूरी-खाई" tabindex="-1">Browser games: distribution ही पूरी खाई <a class="header-anchor" href="#browser-games-distribution-ही-पूरी-खाई" aria-label="Permalink to &quot;Browser games: distribution ही पूरी खाई&quot;"></a></h3>
<p>फिर वह genre है जो हमारी असल delivery mechanism के सबसे करीब है, बिना-download वाला browser game।</p>
<figure style="margin:1.5rem 0">
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:10px">
<iframe src="https://www.youtube-nocookie.com/embed/oznO3GGzu2s" title="Krunker.io trailer" loading="lazy" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen style="position:absolute;top:0;left:0;width:100%;height:100%"></iframe>
</div>
<figcaption style="color:#9aa7b4;font-size:0.85rem;margin-top:0.5rem">Krunker, .io परंपरा का एक browser FPS। इस genre की पूरी खाई distribution है, एक link जो बिना किसी download के पूरा game load कर देता है।</figcaption>
</figure>
<p><a href="https://news.viverse.com/post/what-are-io-games" target="_blank" rel="noreferrer">Agar.io अपने 2015 के launch के हफ़्तों के भीतर करीब 5 मिलियन daily players तक पहुंच गया</a>। Slither.io ने 68 मिलियन mobile downloads और 67 मिलियन browser plays बटोरे। शोध इस बारे में दो-टूक है कि क्यों: <a href="https://news.viverse.com/post/what-are-io-games" target="_blank" rel="noreferrer">&quot;.io genre के लिए competitive खाई distribution ही है, game mechanic नहीं।&quot;</a> आप एक link पर click करते हैं और आप खेल रहे होते हैं। कोई install नहीं, कोई account नहीं, कोई app store नहीं। <a href="https://medium.com/the-megacool-blog/9-growth-hacks-from-viral-hit-game-agar-io-7d8f71f70a0c" target="_blank" rel="noreferrer">Agar.io का onboarding एक click का था</a>: एक नाम टाइप करो, play दबाओ, आप अंदर हैं। यह chat apps के ज़रिए उसी तरह फैला जैसे video TikTok पर फैलता है।</p>
<p>लेकिन इस तोहफ़े में एक चाकू है, और वह हमारी तरफ भी काटता है। कोई download नहीं का मतलब कोई commitment नहीं। वही frictionlessness जो किसी को अंदर लाती है, वही उसे बाहर भी कर देती है, क्योंकि एक tab बंद करने की कोई कीमत नहीं। Browser virality असली है और by default उथली भी है। .io games इससे बच गए क्योंकि वे पहले दस सेकंड में फ़ौरन, साफ़ तौर पर मज़ेदार थे। जो browser worlds मरे, वे घुसने में frictionless थे और एक बार पहुंचने पर आपको रुकने की कोई वजह नहीं देते थे।</p>
<h3 id="among-us-figma-townscaper-vrchat-जीतने-के-चार-और-तरीके" tabindex="-1">Among Us, Figma, Townscaper, VRChat: जीतने के चार और तरीके <a class="header-anchor" href="#among-us-figma-townscaper-vrchat-जीतने-के-चार-और-तरीके" aria-label="Permalink to &quot;Among Us, Figma, Townscaper, VRChat: जीतने के चार और तरीके&quot;"></a></h3>
<p>चार झटपट वाले, क्योंकि हर एक एक अलग लीवर को अलग कर दिखाता है।</p>
<p><a href="https://www.esports.net/news/how-among-us-blew-up-online-two-years-after-release/" target="_blank" rel="noreferrer">Among Us</a> 2018 में launch हुआ और दो साल तक एक commercial शून्य रहा। developers ने इसे लगभग छोड़ ही दिया था। फिर सितंबर 2020 में <a href="https://howtomarketagame.com/2020/09/14/among-us-the-4-lessons-of-their-viral-success/" target="_blank" rel="noreferrer">लगातार बड़े होते streamers की एक सीढ़ी</a> ने इसे खोजा, जिसका चरम एक कई घंटे लंबा Sodapoppin stream था, और यह एक वैश्विक तूफ़ान बन गया। शुरुआती ऑक्सीजन एक itch.io front-page feature और एक Korean audience से आई जो इसकी आधी बिक्री बन गया। सबक: breakout launch के सालों बाद आ सकता है, एक ऐसे channel से जिसकी आपने योजना नहीं बनाई, बशर्ते आप खोजे जाने तक काफ़ी देर ज़िंदा रहें।</p>
<figure style="margin:1.5rem 0">
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:10px">
<iframe src="https://www.youtube-nocookie.com/embed/NSJ4cESNQfE" title="Among Us Steam Release Trailer" loading="lazy" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen style="position:absolute;top:0;left:0;width:100%;height:100%"></iframe>
</div>
<figcaption style="color:#9aa7b4;font-size:0.85rem;margin-top:0.5rem">Among Us। यह दो साल तक लगभग किसी की नज़र में आए बिना बैठा रहा, इससे पहले कि streamers की एक सीढ़ी ने इसे 2020 में एक वैश्विक तूफ़ान में बदल दिया।</figcaption>
</figure>
<p><a href="https://review.firstround.com/the-5-phases-of-figmas-community-led-growth-from-stealth-to-enterprise/" target="_blank" rel="noreferrer">Figma</a> करीब तीन साल stealth में रहा, मुफ़्त launch हुआ, और charge करने से पहले दो साल और इंतज़ार किया। इसका activation moment multiplayer था: वह पल जब एक designer ने महसूस किया कि कोई और उसी file को edit कर रहा है। और यहां वह हिस्सा है जो मायने रखता है। Figma का free tier मूल रूप से आपको 2 collaborators तक सीमित करता था, जिसने ठीक उसी जादुई पल का गला घोंट दिया जो product को बेचता था, और उन्होंने इसे collaborators को असीमित बनाकर ठीक किया ताकि लोग असल में उस चीज़ को महसूस कर सकें। उन्होंने community को सीधे Twitter पर design influencers को target करके seed किया। सबक: अपना aha moment खोजो, फिर एक नए user और उसके बीच की हर बाधा हटा दो।</p>
<figure style="margin:1.5rem 0">
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:10px">
<iframe src="https://www.youtube-nocookie.com/embed/n5gJgkO2Dg0" title="Figma product launch keynote" loading="lazy" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen style="position:absolute;top:0;left:0;width:100%;height:100%"></iframe>
</div>
<figcaption style="color:#9aa7b4;font-size:0.85rem;margin-top:0.5rem">Figma। इसका activation moment multiplayer था, इसलिए इसने वह free-tier collaborator सीमा हटा दी जो उसी जादू को रोक रही थी जो उसे बेचता था।</figcaption>
</figure>
<p><a href="https://www.gamedeveloper.com/game-platforms/how-townscaper-works-a-story-four-games-in-the-making" target="_blank" rel="noreferrer">Townscaper</a> एक नन्हा creative खिलौना था जो screenshots के दम पर hit बन गया। इसके developer ने अपने Twitter following को करीब 20,000 से 90,000 तक छलांग लगाते देखा, सिर्फ़ development के दौरान clips पोस्ट करके, और इसे इस शुरुआती संकेत के तौर पर पढ़ा कि यह अच्छा चलेगा। सबक: अगर आपकी चीज़ खूबसूरत है और लोग launch से पहले ही बिना कहे उसे share करते हैं, तो यह उससे ज़्यादा असली validation और कोई नहीं है।</p>
<figure style="margin:1.5rem 0">
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:10px">
<iframe src="https://www.youtube-nocookie.com/embed/hqq25n6cQqo" title="Townscaper Launch Trailer" loading="lazy" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen style="position:absolute;top:0;left:0;width:100%;height:100%"></iframe>
</div>
<figcaption style="color:#9aa7b4;font-size:0.85rem;margin-top:0.5rem">Townscaper, launch trailer। बिना किसी लक्ष्य वाला एक creative खिलौना जो उन screenshots के दम पर फैला जिन्हें लोगों ने बिना कहे share किया।</figcaption>
</figure>
<p>और <a href="https://www.uploadvr.com/vrchat-statement-after-rec-room-and-horizon-worlds-fold/" target="_blank" rel="noreferrer">VRChat</a>, उन्हीं महीनों में जब Meta के अरबों और Rec Room दोनों ढह गए, करीब 160,000 concurrent users के एक record पर पहुंचा। यह community-driven, creator-driven है, और दूर-दूर तक उन चीज़ों जितना अच्छी फंडिंग वाला नहीं जो उसके आसपास मरीं। VRChat अपने टिकने का श्रेय पूंजी के बजाय community की वफ़ादारी और रचनात्मकता को देता है। सबक, खुद बचे हुए के शब्दों में: जुड़ी हुई creator की लगन पैसे से ज़्यादा टिकती है।</p>
<h2 id="असल-में-ज़िंदा-को-मरे-हुए-से-क्या-अलग-करता-है" tabindex="-1">असल में ज़िंदा को मरे हुए से क्या अलग करता है <a class="header-anchor" href="#असल-में-ज़िंदा-को-मरे-हुए-से-क्या-अलग-करता-है" aria-label="Permalink to &quot;असल में ज़िंदा को मरे हुए से क्या अलग करता है&quot;"></a></h2>
<p>कहानियों को साथ-साथ रखिए और पैटर्न सूक्ष्म नहीं है।</p>
<table tabindex="0">
<thead>
<tr>
<th>Platform</th>
<th>इसने किस पर दांव लगाया</th>
<th>यह कहां पहुंचा</th>
<th>सबक</th>
</tr>
</thead>
<tbody>
<tr>
<td>Minecraft</td>
<td>Procedural survival, एक player के लिए मज़ेदार</td>
<td>अब तक का सबसे बिकने वाला game, 350M+ copies</td>
<td>कभी खाली दुनिया मत रखो</td>
</tr>
<tr>
<td>Roblox</td>
<td>Community-built games साथ में creator payouts</td>
<td>बारह साल में 80M+ daily users</td>
<td>पहले खेलने की जगह बनो, बाद में tool</td>
</tr>
<tr>
<td>.io games</td>
<td>One-click, no-download browser play</td>
<td>हफ़्तों में लाखों players</td>
<td>distribution खाई है, commitment उथली है</td>
</tr>
<tr>
<td>Figma</td>
<td>Free tier, real-time multiplayer</td>
<td>करीब $20B का acquisition offer</td>
<td>aha moment की हर बाधा हटाओ</td>
</tr>
<tr>
<td>Among Us</td>
<td>एक सस्ता social game, और सब्र</td>
<td>3.8M concurrent, दो साल देर से</td>
<td>खोजे जाने तक काफ़ी देर ज़िंदा रहो</td>
</tr>
<tr>
<td>Townscaper</td>
<td>एक खूबसूरत खिलौना जो screenshot के लायक हो</td>
<td>~380K बिक्री, organic फैलाव</td>
<td>बिना कहे share होना सबसे असली संकेत है</td>
</tr>
<tr>
<td>VRChat</td>
<td>Community और creator की ऊर्जा</td>
<td>2026 में ~160K concurrent</td>
<td>लगन पूंजी से ज़्यादा टिकती है</td>
</tr>
<tr>
<td>Horizon Worlds</td>
<td>अरबों की पूंजी, VR-first</td>
<td>VR 2026 में बंद, ~10 में से 1 लौटा</td>
<td>पैसा खाली दुनिया नहीं भर सकता</td>
</tr>
<tr>
<td>Decentraland / Sandbox</td>
<td>game से पहले एक token economy</td>
<td>~$1.3B valuations, सैकड़ों daily users</td>
<td>valuation कोई audience नहीं है</td>
</tr>
<tr>
<td>Dreams</td>
<td>एक गहरा tool, कोई economy नहीं, कोई multiplayer नहीं</td>
<td>live service 2023 में खत्म</td>
<td>creators को पैसे दो, multiplayer भेजो, game बनो</td>
</tr>
<tr>
<td>Crayta</td>
<td>Stadia पर जीने वाला एक UGC platform</td>
<td>Stadia के साथ बंद, 2023</td>
<td>ऐसे platform पर कभी मत बनाओ जो तुम्हें निकाल सके</td>
</tr>
<tr>
<td>Project Spark / Sansar</td>
<td>ताकतवर tools, लौटने की कोई वजह नहीं</td>
<td>बंद हुए या दूर हट गए</td>
<td>game के बिना एक tool की कोई दैनिक आदत नहीं</td>
</tr>
</tbody>
</table>
<p>जो चीज़ रचनात्मक worlds को मारती है वह खाली कमरा है। Horizon Worlds, Decentraland, Dreams, Crayta, Project Spark, Sansar, सब एक ही मौत मरे: पर्याप्त लोग नहीं, पर्याप्त content नहीं, लौटने की पर्याप्त वजह नहीं, एक ऐसे चक्र में जो खुद को ही खाता है। cold-start समस्या boss fight है। बाकी सब एक tutorial level है।</p>
<p>जो चीज़ उन्हें बचाती है वह भीड़ के आने से पहले मौजूद रहने की एक वजह होना है। Minecraft के पास procedural survival थी। Roblox के पास सब्र से बोए गए games का एक दशक था। .io games के पास दस सेकंड का मज़ा था। हर बचा हुआ एक खाली catalog के साथ आपके समय के लायक था। हर शिकार एक खूबसूरत डिब्बा था जो इंतज़ार कर रहा था कि दूसरे लोग उसे देखने लायक बनाएं। यह Dreams की स्वीकारोक्ति को आम बना देना है: पहले एक game बनाओ और बाद में एक platform। platform दूसरा अंक है। आप इसे पहले खुद के लिए कुछ ऐसा बनकर कमाते हैं जिसे लोग उसकी अपनी खातिर इस्तेमाल करते हैं।</p>
<p>जो metrics असल में टिकने की भविष्यवाणी करते हैं वे press release वाले नहीं हैं। शोध यहां एकमत है। product-market fit का परिभाषित करने वाला संकेत यह है कि आपकी <a href="https://newsletter.pmcurve.com/p/retention-masterclass" target="_blank" rel="noreferrer">retention curve समतल हो जाती है</a>: लोगों का कोई समूह हमेशा के लिए लौटता रहता है। एक curve जो शून्य की ओर गिरती है उसका मतलब है कोई fit नहीं, चाहे funnel का ऊपरी हिस्सा कितना भी बड़ा हो। रफ़ industry benchmarks हैं <a href="https://solsten.io/blog/d1-d7-d30-retention-in-gaming" target="_blank" rel="noreferrer">40 प्रतिशत day-1, 20 प्रतिशत day-7, 10 प्रतिशत day-30</a> retention, जहां day-30 वह है जो दीर्घकालिक सेहत की भविष्यवाणी करता है। और किसी भी creator-side वाली चीज़ के लिए, supply side वह जगह है जहां आप मरते हैं: <a href="https://forkoff.xyz/blog/founder-growth/two-sided-marketplace-cold-start-2026" target="_blank" rel="noreferrer">नाकाम हुए marketplaces में करीब 67 प्रतिशत supply पर ढहते हैं</a>, demand पर नहीं। Creator retention जान का संकेत है। registered accounts और valuations vanity हैं।</p>
<p>कहानियों से कुछ और भी निकलते हैं। अपने creators को पैसे दो या उन्हें खो दो, क्योंकि Dreams ने साबित किया कि प्रतिभाशाली लोग बिना किसी फ़ायदे के सालों नहीं लगाएंगे। multiplayer आम तौर पर मकसद होता है, कोई feature नहीं, Media Molecule के अपने अफ़सोस के मुताबिक। ऐसे platform पर अपना घर कभी मत बनाओ जो तुम्हें निकाल सके, Crayta के मुताबिक। और no-download दोधारी तलवार है: यह मौजूद सबसे बेहतरीन acquisition channel है और सबसे कमज़ोर commitment उपकरण, इसलिए बोझ पूरी तरह पहले साठ सेकंड के अच्छे होने पर पड़ता है।</p>
<h2 id="इन-सबके-नीचे-का-जाल" tabindex="-1">इन सबके नीचे का जाल <a class="header-anchor" href="#इन-सबके-नीचे-का-जाल" aria-label="Permalink to &quot;इन सबके नीचे का जाल&quot;"></a></h2>
<p>एक और परत है, और यह वही है जो हमारे पल के लिए खास है, क्योंकि हमारे पास एक tool है जो मरने वालों के पास कभी नहीं था। हम AI से worlds generate कर सकते हैं। जो एक विरोधाभास खड़ा करता है जिस पर मैं हफ़्तों आगे-पीछे होता रहा हूं।</p>
<p>अगर यह AI है, तो क्या हर दुनिया अनोखी, हर इंसान के लिए नई generate की गई, उसके मुताबिक tune की गई, नहीं होनी चाहिए? लेकिन अगर हर इंसान की दुनिया अनोखी है, तो कोई भी कभी किसी और से कैसे टकराएगा, यह देखते हुए कि एक साझा पल के लिए एक साझा जगह चाहिए? और अगर दुनिया को वैसे भी साझा होना ही है, तो AI का इस्तेमाल ही क्यों किया जाए, बजाय एक असली studio की तरह एक खूबसूरत जगह को हाथ से गढ़ने के?</p>
<p>इनमें से हर खिंचाव, अपने अंत तक ले जाने पर, किसी ऐसी चीज़ पर पहुंचता है जो काम नहीं करती। सिर्फ़ आपके लिए generate की गई दुनिया एक ऐसी दुनिया है जिसमें कोई नहीं। Google का Genie एक वाक्य से एक खेलने लायक environment खड़ा कर सकता है और वह एक मिनट बाद गायब हो जाता है, single-player, कोई याददाश्त नहीं, कोई पड़ोसी नहीं। यह अकेला मृत-अंत है। लेकिन एक तय दुनिया को हाथ से गढ़ना भी एक मृत-अंत है: दो वर्ग किलोमीटर को हाथ से भरना सौ लोगों का, कई साल का काम है, और जब आप कर लेते हैं तो वह जमी हुई होती है, आपकी सौवीं यात्रा पर वही जैसी पहली पर, लोगों के आने पर बढ़ने में असमर्थ।</p>
<p>बाहर निकलने का रास्ता है &quot;दुनिया&quot; को एक चीज़ की तरह मानना बंद करना। यह तीन परतें हैं, और अनोखापन व साझापन बिना लड़े अलग-अलग परतों में रह सकते हैं। वह ज़मीन जिस पर हर कोई खड़ा होता है एक साझा दुनिया है, एक ऊंचे स्तर पर curated, मिलने की जगह। आप उसमें जो लाते हैं, आपके AI-generated assets, आपकी बनाई इमारत, वह बेहद अनोखा है, और आप उसे साझा दुनिया <em>में</em> जमा करते हैं ताकि आपका अनोखापन बाकी सबकी खोज बन जाए। और उसमें से होकर आपका रास्ता, जो quests आपको मिलती हैं, जो यह आपको दिखाता है, वह मुफ़्त में personalized है, क्योंकि एक रास्ता कोई जगह नहीं है। झूठा चुनाव था &quot;एक personalized दुनिया&quot;, जो multiplayer को मार देती है, बनाम &quot;एक साझा दुनिया से होकर एक personalized रास्ता&quot;, जो उसे और गहरा करता है। हमें दूसरा चाहिए।</p>
<p>तो AI का काम कभी हर इंसान को एक निजी दुनिया थमाना नहीं था। उसका काम एक साझा दुनिया को अनंत, ज़िंदा, और उसमें घूमने के लिए personal महसूस कराना है। अनोखापन उस हर चीज़ से आता है जो समय के साथ उसमें जमा होती है, हर creator का अपनी तरह का अकेला योगदान। हर Minecraft server अनोखा है। एक दिए गए server पर हर कोई उसे साझा करता है। यह कोई विरोधाभास नहीं है। यही पूरी तरकीब है, और इस पोस्ट के ऊपर वाला screenshot, AI एक ऐसा घर बना रहा है जो एक ऐसी दुनिया में टिका रहता है जिसमें दूसरे लोग चलकर आ सकते हैं, वह तरकीब हकीकत बनी हुई है।</p>
<h2 id="हम-cinevva-world-को-कैसे-launch-कर-रहे-हैं" tabindex="-1">हम Cinevva World को कैसे launch कर रहे हैं <a class="header-anchor" href="#हम-cinevva-world-को-कैसे-launch-कर-रहे-हैं" aria-label="Permalink to &quot;हम Cinevva World को कैसे launch कर रहे हैं&quot;"></a></h2>
<p>तो यहां है कि यह सब हमारे लिए किसमें बदलता है। कोई marketing plan नहीं। पांच दांव, जानबूझकर उन पांच चीज़ों के खिलाफ़ लगाए गए जिन्होंने इस लेख के पहले हिस्से में सबको मारा। और मैं हर एक को इस आधार पर grade करूंगा कि सबूत असल में उसका कितना समर्थन करता है, क्योंकि एक plan जिसे आप grade नहीं कर सकते वह बस अच्छी रोशनी वाली एक ख्वाहिश है।</p>
<p><strong>दांव एक, वह जिस पर मैं कंपनी लगा दूंगा: हम एक game launch करते हैं, एक platform नहीं।</strong> यह कोई पसंद नहीं है, यह पूरे अध्ययन का सबसे लगातार मिलने वाला निष्कर्ष है। Minecraft, Roblox, और Fortnite सबने करने को कुछ मज़ेदार के साथ अगुवाई की और उसके ऊपर creator परत बढ़ाई। Media Molecule, ज़िंदा सबसे प्रतिभाशाली creation studio, ने बाद में निष्कर्ष निकाला कि Dreams को पहले एक game होना चाहिए था। तो Cinevva World में एक नया इंसान पहली चीज़ जो करेगा वह एक खाली प्लॉट को ताकना नहीं होगा। यह एक लक्ष्य वाला loop होगा, एक मंगलवार को वहां होने की एक वजह जब लगभग कोई और online न हो। ज़्यादातर लोग जो आएंगे वे खेलेंगे और कभी नहीं बनाएंगे, और यह design है, कोई नाकामी नहीं। यह Roblox की असली शक्ल है: करोड़ों जो खेलते हैं, उन लोगों की एक पतली परत पर बैठे जो बनाते हैं। flywheel दूसरा अंक है, और हमें इसे कमाना होगा। मुझे इसका भरोसा है क्योंकि कब्रिस्तान पहले ही यह प्रयोग चला चुका है।</p>
<p><strong>दांव दो, वह जो ईमानदारी से एक सट्टा है: AI हमें वह supply बनाने देता है जिसका इंतज़ार करते-करते बाकी सब मर गए।</strong> मैं इस बारे में सटीक रहना चाहता हूं कि यह एक दांव क्यों है और कोई गारंटी क्यों नहीं, क्योंकि इस अध्ययन में किसी भी platform को कभी generative AI से bootstrap नहीं किया गया था। मेरे पास एक mechanism है, कोई सबूत नहीं। mechanism: करीब दो-तिहाई two-sided platforms supply side पर मरते हैं, demand side पर नहीं। क्लासिक उपाय है supply को तब तक नकली बनाना जब तक वह असली न हो, जैसे DoorDash ने खुद खाना पहुंचाया, Reddit की टीम ने नकली handles के नीचे पोस्ट किया, और Roblox के founders ने सालों तक शुरुआती games हाथ से बनाए। हम यह generation से कर सकते हैं, एक ऐसी लागत और गति पर जो उनमें से किसी के पास नहीं थी। लेकिन यहां वह हिस्सा है जो मुझे ईमानदार रखता है, और यह Decentraland की कब्र है: Decentraland generated चीज़ों से भरा था और एक दिन में करीब तीस लोग खींचता था, क्योंकि सुंदर होना समय-के-लायक होने के बराबर नहीं है। तो मैं यह दांव नहीं लगा रहा कि AI दुनिया को मज़ेदार बनाता है। यह नहीं कर सकता। मैं यह दांव लगा रहा हूं कि AI asset की रुकावट हटा देता है ताकि हमारी दुर्लभ इंसानी मेहनत का हर घंटा उस एक चीज़ में जाए जो असल में लोगों को टिकाती है, loop। AI पहाड़ी सस्ते में बनाता है। हम उस पर चढ़ने की वजह हाथ से बनाते हैं। और हम synthetic seed को <a href="https://forkoff.xyz/blog/founder-growth/two-sided-marketplace-cold-start-2026" target="_blank" rel="noreferrer">करीब 30 प्रतिशत पर सीमित रखते हैं, उसे करीब 60 दिनों के भीतर असली creator content में बदलते हुए</a>, क्योंकि नकली supply जो कभी असली नहीं होती, जैसे ही कोई गौर करता है उसी पल भरोसा तोड़ देती है।</p>
<p><strong>दांव तीन: हम अपने खुद के kill-criteria प्रकाशित करते हैं।</strong> यही एक ज़मीनी plan और एक उम्मीद भरे plan के बीच का फ़र्क है। हर एक मामले में टिकने की भविष्यवाणी करने वाला metric यह था कि <a href="https://newsletter.pmcurve.com/p/retention-masterclass" target="_blank" rel="noreferrer">retention curve समतल होती है या नहीं</a>, कोई समूह शून्य की ओर सड़ने के बजाय लौटता रहता है या नहीं। तो यही वह कसौटी है जिस पर हम खुद को खरा उतारते हैं, खुलकर। अगर alpha day-7 retention समतल नहीं होती, अगर वे players जो कभी नहीं बनाते लौटते नहीं, अगर AI-seeded content को नज़रअंदाज़ करके आगे निकल जाया जाता है, तो thesis गलत है, और हम इसे बदलते हैं या हम रुक जाते हैं। हम players और creators को दो अलग funnels के रूप में, दो अलग aha moments के साथ, track करेंगे, क्योंकि data साफ़ है कि वे एक ही इंसान नहीं हैं। और हम यह दिखावा नहीं करेंगे कि पैसा शुरुआती काम करता है। पचास users पर, या एक हज़ार पर भी, tips और marketplace कमाई शून्य के बराबर है, इसलिए वे अभी किसी को नहीं टिकाते। शुरुआती retention loop से आता है या बिल्कुल नहीं आता। Dreams इसे उल्टा करने की रसीद है।</p>
<p><strong>दांव चार: हम जानबूझकर संकरे से शुरू करते हैं।</strong> networked products पर शोध एकमत है। आप एक market के लिए launch नहीं करते, आप एक <a href="https://www.lennysnewsletter.com/p/atomic-network" target="_blank" rel="noreferrer">&quot;atomic network&quot;</a> के लिए launch करते हैं, वह सबसे छोटा समूह जो अपने दम पर ज़िंदा रहने लायक घना हो। Facebook एक स्कूल से शुरू हुआ। हमारा पहले से मौजूद है: वे Cinevva creators जिन्होंने 3D assets, music, और sound generate किए हैं, और जिनके पास रखने के लिए पहले से inventory है। उनमें से पचास एक ही दुनिया में एक ही घंटे पर, एक लक्ष्य और एक सीमा के साथ, पचास हज़ार बिखरे हुए signups की तुलना में एक घनी और ज़्यादा ज़िंदा चीज़ है। सबूत इसका ज़ोरदार समर्थन करते हैं।</p>
<p><strong>दांव पांच, सबसे नरम, और मैं यह कह दूंगा: हम खालीपन को छुपाने के बजाय उसके बारे में सच बोलते हैं।</strong> एक चमकीली, शांत दुनिया मरी हुई लगती है, और सभी नाकामियों ने उसे ambient effects से ढकने की कोशिश की। हम इसका उल्टा कोशिश करेंगे। यह पांचों में सबसे कम साबित कदम है, एक निष्कर्ष से ज़्यादा एक अंदाज़े के करीब। अंदर आने वाले पहले लोग किसी अधूरे product को नहीं देख रहे। वे एक ऐसी जगह के संस्थापक नागरिक हैं जो खाली है <em>क्योंकि वे जल्दी आए हैं</em>, और जो वे बनाएंगे वह तब भी खड़ा होगा जब अगले हज़ार आएंगे।</p>
<p>यही plan है, ईमानदारी से grade किया गया। चार दांव जिनका कब्रिस्तान ज़ोरदार समर्थन करता है, और एक असली सट्टा एक ऐसे tool पर जो मरने वालों में से किसी के पास नहीं था, ठीक उसी अनुशासन से घिरा हुआ जिसकी उनमें कमी थी। हम पहाड़ी generate कर सकते हैं। हम उस पर सबसे पहले चढ़ने का एहसास, या ऊपर से हाथ हिलाने वाले अजनबी को generate नहीं कर सकते। काम है उस हाथ हिलाने को मुमकिन बनाना, उसे retention curve पर साबित करना, और जिस पल curve &quot;नहीं&quot; कहे, उसी पल खुद को धोखा देना बंद कर देना।</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ब्राउज़र में एक ओपन वर्ल्ड बनाना, भाग 30: एक कैमरा जो दीवारों का सम्मान करता है]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-06-04-open-world-browser-part-30-collision-aware-camera</link>
            <guid>https://app.cinevva.com/hi/blog/2026-06-04-open-world-browser-part-30-collision-aware-camera</guid>
            <pubDate>Thu, 04 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[उनतीस भागों ने एक ऐसा वर्ल्ड बनाया जिसमें आप चल सकते हैं, तैर सकते हैं और बना सकते हैं, और यह सब एक ऐसे कैमरे की निगरानी में था जो पहाड़ियों और घर की दीवारों के बीच से सीधे निकल जाता था। भाग 30 इसे एक collision-aware boom से ठीक करता है: एक spring arm जो सिर्फ़ अपनी लंबाई का मालिक है, एक pluggable collider contract ताकि terrain, props और buildings सब एक ही interface के ज़रिए कैमरे को रोक सकें, और एक signed-distance probe जो उस एक चीज़ का सम्मान करता है जो एक heightmap कभी नहीं कर सकता था, overhangs और caves। यह OrbitControls के ऊपर एक post-process के रूप में प्लग होता है, उस orbit input की एक भी लाइन को दोबारा लिखे बिना जिस पर हम पहले से भरोसा करते थे।]]></description>
            <content:encoded><![CDATA[<h1 id="ब्राउज़र-में-एक-ओपन-वर्ल्ड-बनाना-भाग-30-एक-कैमरा-जो-दीवारों-का-सम्मान-करता-है" tabindex="-1">ब्राउज़र में एक ओपन वर्ल्ड बनाना, भाग 30: एक कैमरा जो दीवारों का सम्मान करता है <a class="header-anchor" href="#ब्राउज़र-में-एक-ओपन-वर्ल्ड-बनाना-भाग-30-एक-कैमरा-जो-दीवारों-का-सम्मान-करता-है" aria-label="Permalink to &quot;ब्राउज़र में एक ओपन वर्ल्ड बनाना, भाग 30: एक कैमरा जो दीवारों का सम्मान करता है&quot;"></a></h1>
<p><em><a href="/hi/about.html">Oleg Sidorkin</a> द्वारा, Cinevva के CTO और सह-संस्थापक</em></p>
<p>यहाँ नए हैं? <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">सीरीज़ गाइड</a> का इस्तेमाल करें। यह बताती है कि स्पाइक क्या होता है और सभी भागों को लिंक करती है।</p>
<p><a href="/hi/blog/2026-05-15-open-world-browser-part-29-pluggable-character.html">भाग 29</a> ने हमें एक ऐसा कंट्रोलर दिया जो किसी भी बॉडी को चलाता है। बॉडी अब सही तरीके से चलती है। वह चलती है, फिसलती है, तैरती है, ग्लाइड करती है, caves में चढ़ती है, और overhangs के नीचे झुकती है। समस्या यह है कि उसे क्या देख रहा है। उनतीस भागों तक कैमरा एक stock orbit rig था जो प्लेयर के पीछे चलता था और शर्मिंदगी से बचने के लिए ठीक एक चतुर काम करता था, वह क्षितिज से नीचे झुकने से इनकार करता था ताकि वह समतल ज़मीन के नीचे न फिसल सके। वह clamp ही पोल खोलता है। यह इसलिए मौजूद है क्योंकि कैमरे को यह पता ही नहीं था कि वर्ल्ड की geometry असल में कहाँ है, इसलिए clipping के खिलाफ़ एकमात्र बचाव वही angles मना करना था जहाँ clipping की सबसे ज़्यादा संभावना थी। किसी पहाड़ी की तरफ़ चलें और कैमरा पहाड़ी के अंदर बैठ जाता था। <a href="/hi/blog/2026-02-25-open-world-browser-part-07-marching-cubes.html">भाग 7</a> की marching-cubes caves में से किसी एक में कदम रखें और आप एक चट्टान के अंदर देख रहे होते थे। <a href="/hi/blog/2026-04-28-open-world-browser-part-16-structure-and-authoring.html">भाग 16</a> के authoring tools से एक घर बनाएँ और किसी कमरे में खड़े हों, तो कैमरा दीवार के बाहर तैरता रहता था और siding को देखता रहता था। यह भाग कैमरे को geometry के लिए वही सम्मान देता है जो बॉडी के पास पहले से है।</p>
<h2 id="समस्या-का-आकार-और-समाधान-का-आकार" tabindex="-1">समस्या का आकार, और समाधान का आकार <a class="header-anchor" href="#समस्या-का-आकार-और-समाधान-का-आकार" aria-label="Permalink to &quot;समस्या का आकार, और समाधान का आकार&quot;"></a></h2>
<p>एक third-person कैमरे का एक काम मुश्किल होता है और एक दर्जन आसान। आसान काम हैं फॉलो करना, smoothing, और orbit input, और ये हमारे पास पहले से थे। मुश्किल वाला यह है कि academic साहित्य इसे एक visibility constraint कहता है, और जिस survey का हर कोई हवाला देता है, Christie और Olivier का <em>Camera Control in Computer Graphics</em>, वह पूरे क्षेत्र को इसी के इर्द-गिर्द ढालता है: subject को framed और बिना रुकावट के रखें जबकि वर्ल्ड का सम्मान करते रहें। runtime पर यह हर frame पूछे जाने वाले एक धोखे से सरल सवाल में सिमट जाता है। प्लेयर pivot है। user ने घुमाकर और zoom करके उनके पीछे कुछ दूरी पर एक मनचाही कैमरा position तय की है। कैमरा असल में उस रेखा के साथ कितना पीछे बैठ सकता है, इससे पहले कि वह किसी ठोस चीज़ में घुस जाए? इसका ईमानदारी से जवाब दें और कैमरा खुद को पहाड़ी के सामने टिका लेता है, जब आप किसी कोने में पीछे हटते हैं तो boom के नीचे सरक जाता है, और cave की छत के बीच से घुसने के बजाय वहीं रुक जाता है।</p>
<p>जो pattern इसका जवाब देता है वह पुराना और आज़माया हुआ है। Unreal इसे spring arm कहता है, Godot एक <code>SpringArm3D</code> node देता है, और Unity का Cinemachine इसे एक third-person follow rig और एक deoccluder extension में बाँट देता है। विचार हमेशा एक ही रहता है। कैमरे को pivot पर लगे एक boom के सिरे से लटका दें। जब रास्ता साफ़ हो तो उसे मनचाही लंबाई पर रखें, जब कुछ रास्ते में आए तो उसे pivot की तरफ़ खींच लें, और जब रास्ता साफ़ हो जाए तो उसे वापस बाहर spring कर दें। Mark Haigh-Hutchinson की <em>Real-Time Cameras</em>, जिसे Metroid Prime के camera lead ने लिखा था, उन failure modes पर पूरे-पूरे अध्याय खर्च करती है जो इसके किसी भोले संस्करण को कुछ ऐसा बना देते हैं जो प्लेयर्स को बीमार कर देता है। हमने वह pattern लिया और अपना खुद का बनाया, इतना छोटा कि एक ही बैठक में पढ़ा जा सके, <code>public/world/src/camera-rig.mjs</code> में।</p>
<figure style="margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12);border-radius:8px;overflow:hidden;background:#0d1117">
<svg viewBox="0 0 680 290" width="100%" role="img" aria-label="A spring-arm boom retracting along its own line so the probe sphere rests against a wall instead of clipping through it" style="display:block">
  <rect x="382" y="40" width="46" height="222" fill="#39424f" stroke="#5b6675"/>
  <text x="405" y="280" fill="#9aa7b4" font-size="13" text-anchor="middle" font-family="sans-serif">wall</text>
  <line x1="110" y1="212" x2="600" y2="70" stroke="#9aa7b4" stroke-width="2" stroke-dasharray="6 6"/>
  <line x1="110" y1="212" x2="360" y2="140" stroke="#6ea8fe" stroke-width="3"/>
  <circle cx="110" cy="212" r="6" fill="#e6edf3"/>
  <text x="110" y="234" fill="#e6edf3" font-size="13" text-anchor="middle" font-family="sans-serif">pivot (player head)</text>
  <circle cx="600" cy="70" r="9" fill="none" stroke="#9aa7b4" stroke-width="2"/>
  <text x="600" y="52" fill="#9aa7b4" font-size="13" text-anchor="middle" font-family="sans-serif">desired (user zoom)</text>
  <circle cx="360" cy="140" r="22" fill="rgba(110,168,254,0.18)" stroke="#6ea8fe" stroke-width="2"/>
  <circle cx="360" cy="140" r="5" fill="#6ea8fe"/>
  <text x="300" y="104" fill="#6ea8fe" font-size="13" text-anchor="middle" font-family="sans-serif">camera + probe radius r</text>
  <text x="222" y="192" fill="#6ea8fe" font-size="13" font-family="sans-serif" transform="rotate(-16 222 192)">ℓ (clamped)</text>
</svg>
<figcaption style="padding:0.6rem 1rem;color:#9aa7b4;font-size:0.85rem;border-top:1px solid rgba(255,255,255,0.12);font-family:sans-serif">boom कैमरे को user की मनचाही zoom पर तब तक रखता है जब तक कोई रुकावट बीच में न आ जाए, फिर उसी रेखा के साथ खुद को खींच लेता है ताकि probe sphere near plane के बीच से घुसने के बजाय सतह से टिक जाए।</figcaption>
</figure>
<h2 id="एक-boom-जो-सिर्फ़-अपनी-लंबाई-का-मालिक-है" tabindex="-1">एक boom जो सिर्फ़ अपनी लंबाई का मालिक है <a class="header-anchor" href="#एक-boom-जो-सिर्फ़-अपनी-लंबाई-का-मालिक-है" aria-label="Permalink to &quot;एक boom जो सिर्फ़ अपनी लंबाई का मालिक है&quot;"></a></h2>
<p>जिस design नियम ने rig को छोटा रखा वह भाग 29 के कंट्रोलर काम से उधार लिया गया है: एक चीज़ का मालिक बनो, पूरी तरह, और बाकी सब से इनकार कर दो। rig boom की लंबाई का मालिक है और कुछ नहीं। Yaw, pitch, orbit की damping, touch और wheel gestures, यह सब OrbitControls के पास रहता है, जो इसे पहले से ही अच्छी तरह सुलझा देता है और जिसे दोबारा लिखने में हमारी कोई दिलचस्पी नहीं। तो rig एक camera controller नहीं है। यह एक post-process है जो orbit math के बाद चलता है और ठीक एक संख्या को सही करता है, pivot से कैमरे तक की दूरी।</p>
<p>वह फ़ैसला सुथरा लगता है और यह लगभग तुरंत टूट गया, क्योंकि OrbitControls जिस तरह सोचता है। हर update की शुरुआत में वह कैमरे की मौजूदा position पढ़ता है और उससे अपना orbit radius निकालता है। यह आम तौर पर अदृश्य रहता है। लेकिन जिस पल हमारा rig किसी दीवार से बचने के लिए कैमरे को छोटा करता है, अगले frame में OrbitControls उस छोटी की गई position को पढ़ता है, यह नतीजा निकालता है कि user ने ज़रूर zoom in किया होगा, और उस छोटे होने को user की मनचाही zoom में पका देता है। इसके कुछ frames और कैमरा प्लेयर के सिर पर ढह जाता है और वापस बाहर नहीं आता। इसका समाधान दो calls हैं जो orbit update को घेरती हैं और यही पूरा integration है। OrbitControls चलने से पहले, <code>beforeControls()</code> कैमरे को पिछले frame की पूरी, बिना-छोटी की गई दूरी पर वापस लाता है, ताकि orbit math हमेशा user की असली zoom पढ़े। OrbitControls चलने के बाद, <code>afterControls(dt)</code> उस ताज़ा orbit की गई मनचाही position को पढ़ता है, collision सुलझाता है, लंबाई को damp करता है, और कैमरे को वहाँ लिखता है जहाँ उसे असल में render होना चाहिए। user का इरादा और collision की सुधार कभी एक-दूसरे को नहीं छूते, और dolly ठीक उतना ही responsive रहता है जितना rig के मौजूद होने से पहले था। rig के लिए हमने जो headless test लिखा वह इसे बिल्कुल पिन कर देता है: boom को साठ frames तक एक दीवार में घुसाओ, दीवार साफ़ करो, और लंबाई collision की दूरी पर अटकने के बजाय user की दस मीटर की पूरी zoom पर वापस spring हो जाती है।</p>
<h2 id="एक-contract-कोई-भी-collider" tabindex="-1">एक contract, कोई भी collider <a class="header-anchor" href="#एक-contract-कोई-भी-collider" aria-label="Permalink to &quot;एक contract, कोई भी collider&quot;"></a></h2>
<p>rig कभी नहीं पूछता कि वर्ल्ड किस चीज़ से बना है। एक collider बस एक ऐसा object है जिसके पास एक <code>probe</code> method है, और rig उसे एक ray, एक अधिकतम दूरी, और कैमरे का probe radius देता है, और बदले में एक संख्या पाता है, वह सबसे दूर की दूरी जहाँ तक कैमरा उस collider के रोकने से पहले सफ़र कर सकता है। rig हर पंजीकृत collider से पूछता है और सबसे नज़दीकी hit लेता है। यही पूरा contract है, और यह वही चाल है जो character controller ने तब चली थी जब उसने locomotion को pluggable behaviors में बदला था। Terrain प्लग होता है, props प्लग होते हैं, building shells प्लग होते हैं, हर एक उसी <code>probe</code> के पीछे, और rig इन सब से अनजान रहता है। एक नई तरह की रुकावट जोड़ना मतलब एक list में एक collider जोड़ना है, कैमरा edit करना नहीं।</p>
<p>contract में एक बात अपनी कीमत वसूल करती है, और वह है probe radius। हम pivot से कैमरे तक एक पतली ray नहीं डालते, हम एक sphere डालते हैं जो इतना बड़ा हो कि कैमरे के near plane को समा सके। एक अकेली ray कैमरे के केंद्र को दीवार पर रोक देती है, लेकिन near plane की चौड़ाई होती है, इसलिए उसके कोने दीवार में पहले से दब चुके होते, इससे पहले कि केंद्र वाली ray कभी कोई hit रिपोर्ट करती। एक ray के बजाय एक छोटा sphere चलाना ही वह है जो हर shipping implementation करता है, Unreal इसे probe size के रूप में सामने रखता है, और यही उस कैमरे और उस कैमरे के बीच का फ़र्क है जो सतह से साफ़-साफ़ टिकता है बनाम वह जो स्क्रीन के किनारों पर आपको आर-पार देखने देता है।</p>
<p>हम उस radius का अंदाज़ा नहीं लगाते, हम उसे निकालते हैं। कैमरे से near plane का सबसे दूर का बिंदु उसके कोनों में से एक है, और उस तक की दूरी सीधे projection से निकल आती है। near plane <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="1.357ex" height="1.025ex" role="img" focusable="false" viewBox="0 -442 600 453" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D45B" d="M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>n</mi></math></mjx-assistive-mml></mjx-container> और vertical field of view <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.023ex;" xmlns="http://www.w3.org/2000/svg" width="1.061ex" height="1.618ex" role="img" focusable="false" viewBox="0 -705 469 715" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D703" d="M35 200Q35 302 74 415T180 610T319 704Q320 704 327 704T339 705Q393 701 423 656Q462 596 462 495Q462 380 417 261T302 66T168 -10H161Q125 -10 99 10T60 63T41 130T35 200ZM383 566Q383 668 330 668Q294 668 260 623T204 521T170 421T157 371Q206 370 254 370L351 371Q352 372 359 404T375 484T383 566ZM113 132Q113 26 166 26Q181 26 198 36T239 74T287 161T335 307L340 324H145Q145 321 136 286T120 208T113 132Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>θ</mi></math></mjx-assistive-mml></mjx-container> के साथ, half-height <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="14.408ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 6368.2 1000" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="210E" d="M137 683Q138 683 209 688T282 694Q294 694 294 685Q294 674 258 534Q220 386 220 383Q220 381 227 388Q288 442 357 442Q411 442 444 415T478 336Q478 285 440 178T402 50Q403 36 407 31T422 26Q450 26 474 56T513 138Q516 149 519 151T535 153Q555 153 555 145Q555 144 551 130Q535 71 500 33Q466 -10 419 -10H414Q367 -10 346 17T325 74Q325 90 361 192T398 345Q398 404 354 404H349Q266 404 205 306L198 293L164 158Q132 28 127 16Q114 -11 83 -11Q69 -11 59 -2T48 16Q48 30 121 320L195 616Q195 629 188 632T149 637H128Q122 643 122 645T124 664Q129 683 137 683Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(853.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(1909.6,0)"><path data-c="1D45B" d="M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(2676.2,0)"><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(389,0)" style="stroke-width: 3;"/><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(889,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(4121.2,0)"><path data-c="2061" d="" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(4121.2,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(4510.2,0)"><path data-c="1D703" d="M35 200Q35 302 74 415T180 610T319 704Q320 704 327 704T339 705Q393 701 423 656Q462 596 462 495Q462 380 417 261T302 66T168 -10H161Q125 -10 99 10T60 63T41 130T35 200ZM383 566Q383 668 330 668Q294 668 260 623T204 521T170 421T157 371Q206 370 254 370L351 371Q352 372 359 404T375 484T383 566ZM113 132Q113 26 166 26Q181 26 198 36T239 74T287 161T335 307L340 324H145Q145 321 136 286T120 208T113 132Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(4979.2,0)"><g data-mml-node="mo"><path data-c="2F" d="M423 750Q432 750 438 744T444 730Q444 725 271 248T92 -240Q85 -250 75 -250Q68 -250 62 -245T56 -231Q56 -221 230 257T407 740Q411 750 423 750Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mn" transform="translate(5479.2,0)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(5979.2,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>h</mi><mo>=</mo><mi>n</mi><mi>tan</mi><mo data-mjx-texclass="NONE">⁡</mo><mo stretchy="false">(</mo><mi>θ</mi><mrow data-mjx-texclass="ORD"><mo>/</mo></mrow><mn>2</mn><mo stretchy="false">)</mo></math></mjx-assistive-mml></mjx-container> है, half-width <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.439ex;" xmlns="http://www.w3.org/2000/svg" width="13.744ex" height="2.009ex" role="img" focusable="false" viewBox="0 -694 6075 888" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D464" d="M580 385Q580 406 599 424T641 443Q659 443 674 425T690 368Q690 339 671 253Q656 197 644 161T609 80T554 12T482 -11Q438 -11 404 5T355 48Q354 47 352 44Q311 -11 252 -11Q226 -11 202 -5T155 14T118 53T104 116Q104 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Q21 293 29 315T52 366T96 418T161 441Q204 441 227 416T250 358Q250 340 217 250T184 111Q184 65 205 46T258 26Q301 26 334 87L339 96V119Q339 122 339 128T340 136T341 143T342 152T345 165T348 182T354 206T362 238T373 281Q402 395 406 404Q419 431 449 431Q468 431 475 421T483 402Q483 389 454 274T422 142Q420 131 420 107V100Q420 85 423 71T442 42T487 26Q558 26 600 148Q609 171 620 213T632 273Q632 306 619 325T593 357T580 385Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(993.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(2049.6,0)"><path data-c="210E" d="M137 683Q138 683 209 688T282 694Q294 694 294 685Q294 674 258 534Q220 386 220 383Q220 381 227 388Q288 442 357 442Q411 442 444 415T478 336Q478 285 440 178T402 50Q403 36 407 31T422 26Q450 26 474 56T513 138Q516 149 519 151T535 153Q555 153 555 145Q555 144 551 130Q535 71 500 33Q466 -10 419 -10H414Q367 -10 346 17T325 74Q325 90 361 192T398 345Q398 404 354 404H349Q266 404 205 306L198 293L164 158Q132 28 127 16Q114 -11 83 -11Q69 -11 59 -2T48 16Q48 30 121 320L195 616Q195 629 188 632T149 637H128Q122 643 122 645T124 664Q129 683 137 683Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(2847.8,0)"><path data-c="22C5" d="M78 250Q78 274 95 292T138 310Q162 310 180 294T199 251Q199 226 182 208T139 190T96 207T78 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(3348,0)"><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" style="stroke-width: 3;"/><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" transform="translate(500,0)" style="stroke-width: 3;"/><path data-c="70" d="M36 -148H50Q89 -148 97 -134V-126Q97 -119 97 -107T97 -77T98 -38T98 6T98 55T98 106Q98 140 98 177T98 243T98 296T97 335T97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 61 434T98 436Q115 437 135 438T165 441T176 442H179V416L180 390L188 397Q247 441 326 441Q407 441 464 377T522 216Q522 115 457 52T310 -11Q242 -11 190 33L182 40V-45V-101Q182 -128 184 -134T195 -145Q216 -148 244 -148H260V-194H252L228 -193Q205 -192 178 -192T140 -191Q37 -191 28 -194H20V-148H36ZM424 218Q424 292 390 347T305 402Q234 402 182 337V98Q222 26 294 26Q345 26 384 80T424 218Z" transform="translate(894,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(1450,0)" style="stroke-width: 3;"/><path data-c="63" d="M370 305T349 305T313 320T297 358Q297 381 312 396Q317 401 317 402T307 404Q281 408 258 408Q209 408 178 376Q131 329 131 219Q131 137 162 90Q203 29 272 29Q313 29 338 55T374 117Q376 125 379 127T395 129H409Q415 123 415 120Q415 116 411 104T395 71T366 33T318 2T249 -11Q163 -11 99 53T34 214Q34 318 99 383T250 448T370 421T404 357Q404 334 387 320Z" transform="translate(1894,0)" style="stroke-width: 3;"/><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" transform="translate(2338,0)" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>w</mi><mo>=</mo><mi>h</mi><mo>⋅</mo><mtext>aspect</mtext></math></mjx-assistive-mml></mjx-container> है, और कोना यहाँ बैठता है</p>
<mjx-container tabindex="0" class="MathJax" jax="SVG" display="true" style="direction: ltr; display: block; text-align: center; margin: 1em 0; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.357ex;" xmlns="http://www.w3.org/2000/svg" width="22.335ex" height="2.878ex" role="img" focusable="false" viewBox="0 -1114.2 9872 1272" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D45F" d="M21 287Q22 290 23 295T28 317T38 348T53 381T73 411T99 433T132 442Q161 442 183 430T214 408T225 388Q227 382 228 382T236 389Q284 441 347 441H350Q398 441 422 400Q430 381 430 363Q430 333 417 315T391 292T366 288Q346 288 334 299T322 328Q322 376 378 392Q356 405 342 405Q286 405 239 331Q229 315 224 298T190 165Q156 25 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 114 189T154 366Q154 405 128 405Q107 405 92 377T68 316T57 280Q55 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" transform="translate(484,-150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mtext"><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(556,0)" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(1000,0)" style="stroke-width: 3;"/><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(1500,0)" style="stroke-width: 3;"/></g></g></g><g data-mml-node="mo" transform="translate(2149.6,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="msqrt" transform="translate(3205.4,0)"><g transform="translate(1020,0)"><g data-mml-node="msup"><g data-mml-node="mi"><path data-c="1D45B" d="M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(633,289) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(1258.8,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msup" transform="translate(2259,0)"><g data-mml-node="mi"><path data-c="1D464" d="M580 385Q580 406 599 424T641 443Q659 443 674 425T690 368Q690 339 671 253Q656 197 644 161T609 80T554 12T482 -11Q438 -11 404 5T355 48Q354 47 352 44Q311 -11 252 -11Q226 -11 202 -5T155 14T118 53T104 116Q104 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Q21 293 29 315T52 366T96 418T161 441Q204 441 227 416T250 358Q250 340 217 250T184 111Q184 65 205 46T258 26Q301 26 334 87L339 96V119Q339 122 339 128T340 136T341 143T342 152T345 165T348 182T354 206T362 238T373 281Q402 395 406 404Q419 431 449 431Q468 431 475 421T483 402Q483 389 454 274T422 142Q420 131 420 107V100Q420 85 423 71T442 42T487 26Q558 26 600 148Q609 171 620 213T632 273Q632 306 619 325T593 357T580 385Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(749,289) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(3633.8,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msup" transform="translate(4634,0)"><g data-mml-node="mi"><path data-c="210E" d="M137 683Q138 683 209 688T282 694Q294 694 294 685Q294 674 258 534Q220 386 220 383Q220 381 227 388Q288 442 357 442Q411 442 444 415T478 336Q478 285 440 178T402 50Q403 36 407 31T422 26Q450 26 474 56T513 138Q516 149 519 151T535 153Q555 153 555 145Q555 144 551 130Q535 71 500 33Q466 -10 419 -10H414Q367 -10 346 17T325 74Q325 90 361 192T398 345Q398 404 354 404H349Q266 404 205 306L198 293L164 158Q132 28 127 16Q114 -11 83 -11Q69 -11 59 -2T48 16Q48 30 121 320L195 616Q195 629 188 632T149 637H128Q122 643 122 645T124 664Q129 683 137 683Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(609,289) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g></g></g><g data-mml-node="mo" transform="translate(0,204.2)"><path data-c="221A" d="M263 249Q264 249 315 130T417 -108T470 -228L725 302Q981 837 982 839Q989 850 1001 850Q1008 850 1013 844T1020 832V826L741 243Q645 43 540 -176Q479 -303 469 -324T453 -348Q449 -350 436 -350L424 -349L315 -96Q206 156 205 156L171 130Q138 104 137 104L111 130L263 249Z" style="stroke-width: 3;"/></g><rect width="5646.5" height="60" x="1020" y="994.2"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="block" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; overflow: hidden; width: 100%;"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><msub><mi>r</mi><mrow data-mjx-texclass="ORD"><mtext>near</mtext></mrow></msub><mo>=</mo><msqrt><msup><mi>n</mi><mn>2</mn></msup><mo>+</mo><msup><mi>w</mi><mn>2</mn></msup><mo>+</mo><msup><mi>h</mi><mn>2</mn></msup></msqrt></math></mjx-assistive-mml></mjx-container><p>probe radius वही कोने की दूरी है, एक छोटे safety margin से गुणा, एक तय floor के साथ ताकि वह बहुत संकरे frustum पर कभी एक समझदार न्यूनतम से नीचे न गिरे। जब भी field of view, aspect ratio, या near plane बदलता है, radius दोबारा गणना होता है, ताकि एक window resize या एक ऐसी zoom जो projection को छूती है, चुपचाप probe को इतना छोटा न छोड़ दे कि वह उन कोनों को ढक न सके जिन्हें उसे बचाना है।</p>
<h2 id="वह-collider-जो-caves-के-बारे-में-जानता-है" tabindex="-1">वह collider जो caves के बारे में जानता है <a class="header-anchor" href="#वह-collider-जो-caves-के-बारे-में-जानता-है" aria-label="Permalink to &quot;वह collider जो caves के बारे में जानता है&quot;"></a></h2>
<p>terrain collider वह जगह है जहाँ यह दिलचस्प हो जाता है, क्योंकि हमारे engine में terrain एक heightmap नहीं है। भाग 7 से यह एक signed distance field रहा है, एक ऐसा function जो लौटाता है कि space में कोई भी बिंदु निकटतम ठोस सतह से कितनी दूर है और वह चट्टान के अंदर है या बाहर। धनात्मक मतलब हवा, ऋणात्मक मतलब चट्टान, और वही एक तथ्य यही वजह है कि हमारा कैमरा कुछ ऐसा कर सकता है जो एक heightmap कैमरा संरचनात्मक रूप से नहीं कर सकता। एक heightmap किसी x और z पर ज़मीन की ऊँचाई जानता है। उसके पास छत की कोई धारणा नहीं है, क्योंकि किसी भी बिंदु के ऊपर कभी सिर्फ़ एक ही सतह होती है। तो एक heightmap कैमरा आपको पहाड़ी में चलने से रोक सकता है, लेकिन उसे यह पता ही नहीं कि एक overhang का किनारा या एक cave की छत pivot के ऊपर लटक रही है, और वह दोनों के बीच से सीधे निकल जाता है। एक distance field तीन dimensions में हर सतह के बारे में जानता है, इसलिए वही probe जो कैमरे को एक पहाड़ी की ढलान पर रोकता है, उसे एक cave की छत पर भी एक भी special case के बिना रोक देता है।</p>
<figure style="margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12);border-radius:8px;overflow:hidden;background:#0d1117">
<svg viewBox="0 0 680 320" width="100%" role="img" aria-label="Under an overhang a heightmap lets the boom clip through the ceiling rock, while a signed distance field stops it at the ceiling underside" style="display:block">
  <path d="M680,320 L680,40 L250,40 L250,150 L430,150 L430,250 L250,250 L250,320 Z" fill="#39424f" stroke="#5b6675" stroke-width="1.5"/>
  <text x="340" y="205" fill="#9aa7b4" font-size="13" text-anchor="middle" font-family="sans-serif">cave</text>
  <text x="540" y="100" fill="#5b6675" font-size="13" text-anchor="middle" font-family="sans-serif">solid rock</text>
  <line x1="330" y1="212" x2="230" y2="60" stroke="#9aa7b4" stroke-width="2" stroke-dasharray="6 6"/>
  <line x1="290" y1="150" x2="250" y2="90" stroke="#f85149" stroke-width="4"/>
  <circle cx="330" cy="212" r="6" fill="#e6edf3"/>
  <text x="330" y="234" fill="#e6edf3" font-size="13" text-anchor="middle" font-family="sans-serif">player</text>
  <circle cx="230" cy="60" r="10" fill="none" stroke="#f85149" stroke-width="2"/>
  <text x="230" y="42" fill="#f85149" font-size="13" text-anchor="middle" font-family="sans-serif">heightmap: clips through ✗</text>
  <circle cx="305" cy="170" r="9" fill="rgba(86,211,100,0.2)" stroke="#56d364" stroke-width="2"/>
  <text x="420" y="172" fill="#56d364" font-size="13" text-anchor="middle" font-family="sans-serif">SDF: stops at ceiling ✓</text>
</svg>
<figcaption style="padding:0.6rem 1rem;color:#9aa7b4;font-size:0.85rem;border-top:1px solid rgba(255,255,255,0.12);font-family:sans-serif">एक heightmap हर column के लिए एक सतह संग्रहित करता है, इसलिए वह प्लेयर के ऊपर चट्टान के उस स्लैब को कभी नहीं देखता और boom को छत के बीच से ऊपर घुसने देता है। distance field उस स्लैब के अंदर ऋणात्मक है, इसलिए probe उससे संपर्क करता है और कैमरा cave की छत के ठीक नीचे रुक जाता है।</figcaption>
</figure>
<p>field के साथ probe को चलाना एक ऐसी तकनीक है जिसका एक नाम है और जिसके पीछे एक paper है। John Hart की <em>Sphere Tracing</em>, 1996 से, एक distance field के खिलाफ़ एक ray को march करने का मानक तरीका है, और चाल यह है कि field आपको सिर्फ़ यह नहीं बताता कि आपने किसी चीज़ से टकराया या नहीं, वह आपको एक सुरक्षित दूरी बताता है जितनी आप किसी चीज़ से टकराए बिना आगे बढ़ सकते हैं। तो छोटे-छोटे तय कदमों में रेंगने के बजाय, आप field को sample करते हैं, उतना आगे बढ़ते हैं जितनी ढील वह रिपोर्ट करता है, और दोहराते हैं, खुली हवा में लंबे डग भरते हुए और किसी सतह के पास पहुँचते ही छोटे, सावधान कदम लेते हुए।</p>
<p>हालाँकि एक पेच है जो हमारी terrain हम पर थोपती है। एक असली distance field निकटतम सतह तक की असल Euclidean दूरी रिपोर्ट करता है, और उस ढील के बराबर एक पूरा डग हमेशा सुरक्षित होता है। लेकिन जहाँ terrain अभी भी carved voxels के बजाय एक heightmap है, वह field जिसे हम सस्ते में sample कर सकते हैं वह असली distance नहीं है, वह vertical clearance है, सीधे नीचे ज़मीन तक का अंतर। किसी ढलान पर वह संख्या ज़्यादा बता देती है कि कैमरा असल में कितना दूर जा सकता है, क्योंकि निकटतम चट्टान बगल में है, सीधे नीचे नहीं। ईमानदार दूरी एक ऐसे factor से छोटी होती है जो gradient के साथ बढ़ता है, <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.628ex;" xmlns="http://www.w3.org/2000/svg" width="12.643ex" height="2.851ex" role="img" focusable="false" viewBox="0 -982.5 5588 1260" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msqrt"><g transform="translate(1020,0)"><g data-mml-node="mn"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(722.2,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(1722.4,0)"><path data-c="2016" d="M133 736Q138 750 153 750Q164 750 170 739Q172 735 172 250T170 -239Q164 -250 152 -250Q144 -250 138 -244L137 -243Q133 -241 133 -179T132 250Q132 731 133 736ZM329 739Q334 750 346 750Q353 750 361 744L362 743Q366 741 366 679T367 250T367 -178T362 -243L361 -244Q355 -250 347 -250Q335 -250 329 -239Q327 -235 327 250T329 739Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(2222.4,0)"><path data-c="2207" d="M46 676Q46 679 51 683H781Q786 679 786 676Q786 674 617 326T444 -26Q439 -33 416 -33T388 -26Q385 -22 216 326T46 676ZM697 596Q697 597 445 597T193 596Q195 591 319 336T445 80L697 596Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(3055.4,0)"><path data-c="210E" d="M137 683Q138 683 209 688T282 694Q294 694 294 685Q294 674 258 534Q220 386 220 383Q220 381 227 388Q288 442 357 442Q411 442 444 415T478 336Q478 285 440 178T402 50Q403 36 407 31T422 26Q450 26 474 56T513 138Q516 149 519 151T535 153Q555 153 555 145Q555 144 551 130Q535 71 500 33Q466 -10 419 -10H414Q367 -10 346 17T325 74Q325 90 361 192T398 345Q398 404 354 404H349Q266 404 205 306L198 293L164 158Q132 28 127 16Q114 -11 83 -11Q69 -11 59 -2T48 16Q48 30 121 320L195 616Q195 629 188 632T149 637H128Q122 643 122 645T124 664Q129 683 137 683Z" style="stroke-width: 3;"/></g><g data-mml-node="msup" transform="translate(3631.4,0)"><g data-mml-node="mo"><path data-c="2016" d="M133 736Q138 750 153 750Q164 750 170 739Q172 735 172 250T170 -239Q164 -250 152 -250Q144 -250 138 -244L137 -243Q133 -241 133 -179T132 250Q132 731 133 736ZM329 739Q334 750 346 750Q353 750 361 744L362 743Q366 741 366 679T367 250T367 -178T362 -243L361 -244Q355 -250 347 -250Q335 -250 329 -239Q327 -235 327 250T329 739Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(533,289) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g></g></g><g data-mml-node="mo" transform="translate(0,72.5)"><path data-c="221A" d="M263 249Q264 249 315 130T417 -108T470 -228L725 302Q981 837 982 839Q989 850 1001 850Q1008 850 1013 844T1020 832V826L741 243Q645 43 540 -176Q479 -303 469 -324T453 -348Q449 -350 436 -350L424 -349L315 -96Q206 156 205 156L171 130Q138 104 137 104L111 130L263 249Z" style="stroke-width: 3;"/></g><rect width="4568" height="60" x="1020" y="862.5"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><msqrt><mn>1</mn><mo>+</mo><mo data-mjx-texclass="OPEN" fence="false" stretchy="false">‖</mo><mi mathvariant="normal">∇</mi><mi>h</mi><msup><mo data-mjx-texclass="CLOSE" fence="false" stretchy="false">‖</mo><mn>2</mn></msup></msqrt></math></mjx-assistive-mml></mjx-container>, इसलिए रिपोर्ट की गई ढील के हिसाब से नापा गया एक डग आगे निकल जाता है और एक चोटी के साफ़ ऊपर से कूद सकता है। इसका समाधान under-relaxation है, रिपोर्ट की गई ढील के पूरे के बजाय सिर्फ़ एक अंश के हिसाब से आगे बढ़ना, जो लगभग साठ डिग्री की ढलान तक सुरक्षित रहता है और true-distance voxel क्षेत्रों पर कुछ अतिरिक्त samples के अलावा कुछ खर्च नहीं करता। हम इसे एक stride floor के साथ जोड़ते हैं, ताकि एक या दो cell मोटी cave की दीवार कभी साफ़ ऊपर से न लाँघी जाए, और एक सख़्त ceiling के साथ जो march को सस्ता रखता है। जब sphere आखिरकार सतह को छूता है तो एक छोटा bisection contact point को कस देता है, और कैमरा अपने ही radius जितना पीछे हटकर वहीं टिक जाता है।</p>
<p>लिखकर बताएँ तो, boom pivot <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.439ex;" xmlns="http://www.w3.org/2000/svg" width="1.446ex" height="1.457ex" role="img" focusable="false" viewBox="0 -450 639 644" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D429" d="M32 442L123 446Q214 450 215 450H221V409Q222 409 229 413T251 423T284 436T328 446T382 450Q480 450 540 388T600 223Q600 128 539 61T361 -6H354Q292 -6 236 28L227 34V-132H296V-194H287Q269 -191 163 -191Q56 -191 38 -194H29V-132H98V113V284Q98 330 97 348T93 370T83 376Q69 380 42 380H29V442H32ZM457 224Q457 303 427 349T350 395Q282 395 235 352L227 345V104L233 97Q274 45 337 45Q383 45 420 86T457 224Z" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mrow data-mjx-texclass="ORD"><mi mathvariant="bold">p</mi></mrow></math></mjx-assistive-mml></mjx-container> से unit दिशा <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.014ex;" xmlns="http://www.w3.org/2000/svg" width="1.446ex" height="1.584ex" role="img" focusable="false" viewBox="0 -694 639 700" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D41D" d="M351 686L442 690Q533 694 534 694H540V389Q540 327 540 253T539 163Q539 97 541 83T555 66Q569 62 596 62H609V31Q609 0 608 0Q588 0 510 -3T412 -6Q411 -6 411 16V38L401 31Q337 -6 265 -6Q159 -6 99 58T38 224Q38 265 51 303T92 375T165 429T272 449Q359 449 417 412V507V555Q417 597 415 607T402 620Q388 624 361 624H348V686H351ZM411 350Q362 399 291 399Q278 399 256 392T218 371Q195 351 189 320T182 238V221Q182 179 183 159T191 115T212 74Q241 46 288 46Q358 46 404 100L411 109V350Z" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mrow data-mjx-texclass="ORD"><mi mathvariant="bold">d</mi></mrow></math></mjx-assistive-mml></mjx-container> के साथ एक ray <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="13.518ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 5975 1000" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D42B" d="M405 293T374 293T324 312T305 361Q305 378 312 394Q315 397 315 399Q305 399 294 394T266 375T238 329T222 249Q221 241 221 149V62H308V0H298Q280 3 161 3Q47 3 38 0H29V62H98V210V303Q98 353 96 363T83 376Q69 380 42 380H29V442H32L118 446Q204 450 205 450H210V414L211 378Q247 449 315 449H321Q384 449 413 422T442 360Q442 332 424 313Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(474,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(863,0)"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(1224,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(1890.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(2946.6,0)"><g data-mml-node="mi"><path data-c="1D429" d="M32 442L123 446Q214 450 215 450H221V409Q222 409 229 413T251 423T284 436T328 446T382 450Q480 450 540 388T600 223Q600 128 539 61T361 -6H354Q292 -6 236 28L227 34V-132H296V-194H287Q269 -191 163 -191Q56 -191 38 -194H29V-132H98V113V284Q98 330 97 348T93 370T83 376Q69 380 42 380H29V442H32ZM457 224Q457 303 427 349T350 395Q282 395 235 352L227 345V104L233 97Q274 45 337 45Q383 45 420 86T457 224Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(3807.8,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(4808,0)"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z" style="stroke-width: 3;"/></g><g data-mml-node="mstyle" transform="translate(5169,0)"><g data-mml-node="mspace"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(5336,0)"><g data-mml-node="mi"><path data-c="1D41D" d="M351 686L442 690Q533 694 534 694H540V389Q540 327 540 253T539 163Q539 97 541 83T555 66Q569 62 596 62H609V31Q609 0 608 0Q588 0 510 -3T412 -6Q411 -6 411 16V38L401 31Q337 -6 265 -6Q159 -6 99 58T38 224Q38 265 51 303T92 375T165 429T272 449Q359 449 417 412V507V555Q417 597 415 607T402 620Q388 624 361 624H348V686H351ZM411 350Q362 399 291 399Q278 399 256 392T218 371Q195 351 189 320T182 238V221Q182 179 183 159T191 115T212 74Q241 46 288 46Q358 46 404 100L411 109V350Z" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mrow data-mjx-texclass="ORD"><mi mathvariant="bold">r</mi></mrow><mo stretchy="false">(</mo><mi>t</mi><mo stretchy="false">)</mo><mo>=</mo><mrow data-mjx-texclass="ORD"><mi mathvariant="bold">p</mi></mrow><mo>+</mo><mi>t</mi><mstyle scriptlevel="0"><mspace width="0.167em"/></mstyle><mrow data-mjx-texclass="ORD"><mi mathvariant="bold">d</mi></mrow></math></mjx-assistive-mml></mjx-container> है, और march field की ढील के एक under-relaxed अंश के हिसाब से contact तक आगे बढ़ता है, दोनों सिरों पर clamp किया हुआ:</p>
<mjx-container tabindex="0" class="MathJax" jax="SVG" display="true" style="direction: ltr; display: block; text-align: center; margin: 1em 0; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.791ex;" xmlns="http://www.w3.org/2000/svg" width="46.581ex" height="2.713ex" role="img" focusable="false" viewBox="0 -849.5 20588.6 1199" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" transform="translate(394,-150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D45B" d="M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(600,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(1378,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g></g></g><g data-mml-node="mo" transform="translate(2049.7,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(3105.5,0)"><g data-mml-node="mi"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(394,-150) scale(0.707)"><path data-c="1D45B" d="M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(4196,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(5196.2,0)"><path data-c="63" d="M370 305T349 305T313 320T297 358Q297 381 312 396Q317 401 317 402T307 404Q281 408 258 408Q209 408 178 376Q131 329 131 219Q131 137 162 90Q203 29 272 29Q313 29 338 55T374 117Q376 125 379 127T395 129H409Q415 123 415 120Q415 116 411 104T395 71T366 33T318 2T249 -11Q163 -11 99 53T34 214Q34 318 99 383T250 448T370 421T404 357Q404 334 387 320Z" style="stroke-width: 3;"/><path data-c="6C" d="M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z" transform="translate(444,0)" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(722,0)" style="stroke-width: 3;"/><path data-c="6D" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(1222,0)" style="stroke-width: 3;"/><path data-c="70" d="M36 -148H50Q89 -148 97 -134V-126Q97 -119 97 -107T97 -77T98 -38T98 6T98 55T98 106Q98 140 98 177T98 243T98 296T97 335T97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 61 434T98 436Q115 437 135 438T165 441T176 442H179V416L180 390L188 397Q247 441 326 441Q407 441 464 377T522 216Q522 115 457 52T310 -11Q242 -11 190 33L182 40V-45V-101Q182 -128 184 -134T195 -145Q216 -148 244 -148H260V-194H252L228 -193Q205 -192 178 -192T140 -191Q37 -191 28 -194H20V-148H36ZM424 218Q424 292 390 347T305 402Q234 402 182 337V98Q222 26 294 26Q345 26 384 80T424 218Z" transform="translate(2055,0)" style="stroke-width: 3;"/></g><g data-mml-node="mstyle" transform="translate(7807.2,0)"><g data-mml-node="mspace"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(7806.9,0)"><g data-mml-node="mo" transform="translate(0 -0.5)"><path data-c="28" d="M152 251Q152 646 388 850H416Q422 844 422 841Q422 837 403 816T357 753T302 649T255 482T236 250Q236 124 255 19T301 -147T356 -251T403 -315T422 -340Q422 -343 416 -349H388Q359 -325 332 -296T271 -213T212 -97T170 56T152 251Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mi" transform="translate(8264.9,0)"><path data-c="1D706" d="M166 673Q166 685 183 694H202Q292 691 316 644Q322 629 373 486T474 207T524 67Q531 47 537 34T546 15T551 6T555 2T556 -2T550 -11H482Q457 3 450 18T399 152L354 277L340 262Q327 246 293 207T236 141Q211 112 174 69Q123 9 111 -1T83 -12Q47 -12 47 20Q47 37 61 52T199 187Q229 216 266 252T321 306L338 322Q338 323 288 462T234 612Q214 657 183 657Q166 657 166 673Z" style="stroke-width: 3;"/></g><g data-mml-node="mstyle" transform="translate(8847.9,0)"><g data-mml-node="mspace"/></g><g data-mml-node="mo" transform="translate(9014.9,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(9403.9,0)"><path data-c="3A6" d="M312 622Q310 623 307 625T303 629T297 631T286 634T270 635T246 636T211 637H184V683H196Q220 680 361 680T526 683H538V637H511Q468 637 447 635T422 631T411 622V533L425 531Q525 519 595 466T665 342Q665 301 642 267T583 209T506 172T425 152L411 150V61Q417 55 421 53T447 48T511 46H538V0H526Q502 3 361 3T196 0H184V46H211Q231 46 245 46T270 47T286 48T297 51T303 54T307 57T312 61V150H310Q309 151 289 153T232 166T160 195Q149 201 136 210T103 238T69 284T56 342Q56 414 128 467T294 530Q309 532 310 533H312V622ZM170 342Q170 207 307 188H312V495H309Q301 495 282 491T231 469T186 423Q170 389 170 342ZM415 188Q487 199 519 236T551 342Q551 384 539 414T507 459T470 481T434 491T415 495H410V188H415Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(10125.9,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(10514.9,0)"><g data-mml-node="mi"><path data-c="1D42B" d="M405 293T374 293T324 312T305 361Q305 378 312 394Q315 397 315 399Q305 399 294 394T266 375T238 329T222 249Q221 241 221 149V62H308V0H298Q280 3 161 3Q47 3 38 0H29V62H98V210V303Q98 353 96 363T83 376Q69 380 42 380H29V442H32L118 446Q204 450 205 450H210V414L211 378Q247 449 315 449H321Q384 449 413 422T442 360Q442 332 424 313Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(10988.9,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(11377.9,0)"><g data-mml-node="mi"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(394,-150) scale(0.707)"><path data-c="1D45B" d="M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(12246.1,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(12635.1,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(13246.4,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(14246.6,0)"><path data-c="1D45F" d="M21 287Q22 290 23 295T28 317T38 348T53 381T73 411T99 433T132 442Q161 442 183 430T214 408T225 388Q227 382 228 382T236 389Q284 441 347 441H350Q398 441 422 400Q430 381 430 363Q430 333 417 315T391 292T366 288Q346 288 334 299T322 328Q322 376 378 392Q356 405 342 405Q286 405 239 331Q229 315 224 298T190 165Q156 25 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 114 189T154 366Q154 405 128 405Q107 405 92 377T68 316T57 280Q55 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(14697.6,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(15086.6,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="mstyle" transform="translate(15364.6,0)"><g data-mml-node="mspace"/></g><g data-mml-node="msub" transform="translate(15809.3,0)"><g data-mml-node="mi"><path data-c="1D460" d="M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" transform="translate(502,-150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mo"><path data-c="6D" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(833,0)" style="stroke-width: 3;"/><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(1111,0)" style="stroke-width: 3;"/></g></g></g><g data-mml-node="mo" transform="translate(17540,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="mstyle" transform="translate(17818,0)"><g data-mml-node="mspace"/></g><g data-mml-node="msub" transform="translate(18262.7,0)"><g data-mml-node="mi"><path data-c="1D460" d="M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" transform="translate(502,-150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mo"><path data-c="6D" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(833,0)" style="stroke-width: 3;"/><path data-c="78" d="M201 0Q189 3 102 3Q26 3 17 0H11V46H25Q48 47 67 52T96 61T121 78T139 96T160 122T180 150L226 210L168 288Q159 301 149 315T133 336T122 351T113 363T107 370T100 376T94 379T88 381T80 383Q74 383 44 385H16V431H23Q59 429 126 429Q219 429 229 431H237V385Q201 381 201 369Q201 367 211 353T239 315T268 274L272 270L297 304Q329 345 329 358Q329 364 327 369T322 376T317 380T310 384L307 385H302V431H309Q324 428 408 428Q487 428 493 431H499V385H492Q443 385 411 368Q394 360 377 341T312 257L296 236L358 151Q424 61 429 57T446 50Q464 46 499 46H516V0H510H502Q494 1 482 1T457 2T432 2T414 3Q403 3 377 3T327 1L304 0H295V46H298Q309 46 320 51T331 63Q331 65 291 120L250 175Q249 174 219 133T185 88Q181 83 181 74Q181 63 188 55T206 46Q208 46 208 23V0H201Z" transform="translate(1333,0)" style="stroke-width: 3;"/></g></g></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(20130.6,0)"><g data-mml-node="mo" transform="translate(0 -0.5)"><path data-c="29" d="M305 251Q305 -145 69 -349H56Q43 -349 39 -347T35 -338Q37 -333 60 -307T108 -239T160 -136T204 27T221 250T204 473T160 636T108 740T60 807T35 839Q35 850 50 850H56H69Q197 743 256 566Q305 425 305 251Z" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="block" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; overflow: hidden; width: 100%;"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><msub><mi>t</mi><mrow data-mjx-texclass="ORD"><mi>n</mi><mo>+</mo><mn>1</mn></mrow></msub><mo>=</mo><msub><mi>t</mi><mi>n</mi></msub><mo>+</mo><mi>clamp</mi><mstyle scriptlevel="0"><mspace width="-0.167em"/></mstyle><mrow data-mjx-texclass="ORD"><mo minsize="1.2em" maxsize="1.2em">(</mo></mrow><mi>λ</mi><mstyle scriptlevel="0"><mspace width="0.167em"/></mstyle><mo stretchy="false">(</mo><mi mathvariant="normal">Φ</mi><mo stretchy="false">(</mo><mrow data-mjx-texclass="ORD"><mi mathvariant="bold">r</mi></mrow><mo stretchy="false">(</mo><msub><mi>t</mi><mi>n</mi></msub><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>−</mo><mi>r</mi><mo stretchy="false">)</mo><mo>,</mo><mstyle scriptlevel="0"><mspace width="0.278em"/></mstyle><msub><mi>s</mi><mrow data-mjx-texclass="ORD"><mo data-mjx-texclass="OP" movablelimits="true">min</mo></mrow></msub><mo>,</mo><mstyle scriptlevel="0"><mspace width="0.278em"/></mstyle><msub><mi>s</mi><mrow data-mjx-texclass="ORD"><mo data-mjx-texclass="OP" movablelimits="true">max</mo></mrow></msub><mrow data-mjx-texclass="ORD"><mo minsize="1.2em" maxsize="1.2em">)</mo></mrow></math></mjx-assistive-mml></mjx-container><p>यहाँ <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="1.633ex" height="1.545ex" role="img" focusable="false" viewBox="0 -683 722 683" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="3A6" d="M312 622Q310 623 307 625T303 629T297 631T286 634T270 635T246 636T211 637H184V683H196Q220 680 361 680T526 683H538V637H511Q468 637 447 635T422 631T411 622V533L425 531Q525 519 595 466T665 342Q665 301 642 267T583 209T506 172T425 152L411 150V61Q417 55 421 53T447 48T511 46H538V0H526Q502 3 361 3T196 0H184V46H211Q231 46 245 46T270 47T286 48T297 51T303 54T307 57T312 61V150H310Q309 151 289 153T232 166T160 195Q149 201 136 210T103 238T69 284T56 342Q56 414 128 467T294 530Q309 532 310 533H312V622ZM170 342Q170 207 307 188H312V495H309Q301 495 282 491T231 469T186 423Q170 389 170 342ZM415 188Q487 199 519 236T551 342Q551 384 539 414T507 459T470 481T434 491T415 495H410V188H415Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi mathvariant="normal">Φ</mi></math></mjx-assistive-mml></mjx-container> signed distance है, हवा में धनात्मक और चट्टान में ऋणात्मक, <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="1.02ex" height="1.025ex" role="img" focusable="false" viewBox="0 -442 451 453" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D45F" d="M21 287Q22 290 23 295T28 317T38 348T53 381T73 411T99 433T132 442Q161 442 183 430T214 408T225 388Q227 382 228 382T236 389Q284 441 347 441H350Q398 441 422 400Q430 381 430 363Q430 333 417 315T391 292T366 288Q346 288 334 299T322 328Q322 376 378 392Q356 405 342 405Q286 405 239 331Q229 315 224 298T190 165Q156 25 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 114 189T154 366Q154 405 128 405Q107 405 92 377T68 316T57 280Q55 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>r</mi></math></mjx-assistive-mml></mjx-container> probe radius है, <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="8.862ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 3917.2 1000" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D706" d="M166 673Q166 685 183 694H202Q292 691 316 644Q322 629 373 486T474 207T524 67Q531 47 537 34T546 15T551 6T555 2T556 -2T550 -11H482Q457 3 450 18T399 152L354 277L340 262Q327 246 293 207T236 141Q211 112 174 69Q123 9 111 -1T83 -12Q47 -12 47 20Q47 37 61 52T199 187Q229 216 266 252T321 306L338 322Q338 323 288 462T234 612Q214 657 183 657Q166 657 166 673Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(860.8,0)"><path data-c="2208" d="M84 250Q84 372 166 450T360 539Q361 539 377 539T419 540T469 540H568Q583 532 583 520Q583 511 570 501L466 500Q355 499 329 494Q280 482 242 458T183 409T147 354T129 306T124 272V270H568Q583 262 583 250T568 230H124V228Q124 207 134 177T167 112T231 48T328 7Q355 1 466 0H570Q583 -10 583 -20Q583 -32 568 -40H471Q464 -40 446 -40T417 -41Q262 -41 172 45Q84 127 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(1805.6,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(2194.6,0)"><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(2694.6,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(3139.2,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(3639.2,0)"><path data-c="5D" d="M22 710V750H159V-250H22V-210H119V710H22Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>λ</mi><mo>∈</mo><mo stretchy="false">(</mo><mn>0</mn><mo>,</mo><mn>1</mn><mo stretchy="false">]</mo></math></mjx-assistive-mml></mjx-container> वह under-relaxation factor है जो ज़्यादा बताने वाले heightmap field को एक ढलान कूदने से रोकता है, और <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.439ex;" xmlns="http://www.w3.org/2000/svg" width="9.148ex" height="1.439ex" role="img" focusable="false" viewBox="0 -442 4043.3 636" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D460" d="M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" transform="translate(502,-150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mo"><path data-c="6D" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(833,0)" style="stroke-width: 3;"/><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(1111,0)" style="stroke-width: 3;"/></g></g></g><g data-mml-node="mo" transform="translate(1730.7,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(2175.4,0)"><g data-mml-node="mi"><path data-c="1D460" d="M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" transform="translate(502,-150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mo"><path data-c="6D" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(833,0)" style="stroke-width: 3;"/><path data-c="78" d="M201 0Q189 3 102 3Q26 3 17 0H11V46H25Q48 47 67 52T96 61T121 78T139 96T160 122T180 150L226 210L168 288Q159 301 149 315T133 336T122 351T113 363T107 370T100 376T94 379T88 381T80 383Q74 383 44 385H16V431H23Q59 429 126 429Q219 429 229 431H237V385Q201 381 201 369Q201 367 211 353T239 315T268 274L272 270L297 304Q329 345 329 358Q329 364 327 369T322 376T317 380T310 384L307 385H302V431H309Q324 428 408 428Q487 428 493 431H499V385H492Q443 385 411 368Q394 360 377 341T312 257L296 236L358 151Q424 61 429 57T446 50Q464 46 499 46H516V0H510H502Q494 1 482 1T457 2T432 2T414 3Q403 3 377 3T327 1L304 0H295V46H298Q309 46 320 51T331 63Q331 65 291 120L250 175Q249 174 219 133T185 88Q181 83 181 74Q181 63 188 55T206 46Q208 46 208 23V0H201Z" transform="translate(1333,0)" style="stroke-width: 3;"/></g></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>s</mi><mrow data-mjx-texclass="ORD"><mo data-mjx-texclass="OP" movablelimits="true">min</mo></mrow></msub><mo>,</mo><msub><mi>s</mi><mrow data-mjx-texclass="ORD"><mo data-mjx-texclass="OP" movablelimits="true">max</mo></mrow></msub></math></mjx-assistive-mml></mjx-container> वे step clamps हैं जो एक पतली दीवार को skip होने से और march को लंबा चलने से रोकते हैं। Contact पहला <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="0.817ex" height="1.441ex" role="img" focusable="false" viewBox="0 -626 361 637" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>t</mi></math></mjx-assistive-mml></mjx-container> है जहाँ <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="11.08ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 4897.6 1000" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="3A6" d="M312 622Q310 623 307 625T303 629T297 631T286 634T270 635T246 636T211 637H184V683H196Q220 680 361 680T526 683H538V637H511Q468 637 447 635T422 631T411 622V533L425 531Q525 519 595 466T665 342Q665 301 642 267T583 209T506 172T425 152L411 150V61Q417 55 421 53T447 48T511 46H538V0H526Q502 3 361 3T196 0H184V46H211Q231 46 245 46T270 47T286 48T297 51T303 54T307 57T312 61V150H310Q309 151 289 153T232 166T160 195Q149 201 136 210T103 238T69 284T56 342Q56 414 128 467T294 530Q309 532 310 533H312V622ZM170 342Q170 207 307 188H312V495H309Q301 495 282 491T231 469T186 423Q170 389 170 342ZM415 188Q487 199 519 236T551 342Q551 384 539 414T507 459T470 481T434 491T415 495H410V188H415Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(722,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(1111,0)"><g data-mml-node="mi"><path data-c="1D42B" d="M405 293T374 293T324 312T305 361Q305 378 312 394Q315 397 315 399Q305 399 294 394T266 375T238 329T222 249Q221 241 221 149V62H308V0H298Q280 3 161 3Q47 3 38 0H29V62H98V210V303Q98 353 96 363T83 376Q69 380 42 380H29V442H32L118 446Q204 450 205 450H210V414L211 378Q247 449 315 449H321Q384 449 413 422T442 360Q442 332 424 313Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(1585,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(1974,0)"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(2335,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(2724,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(3390.8,0)"><path data-c="2264" d="M674 636Q682 636 688 630T694 615T687 601Q686 600 417 472L151 346L399 228Q687 92 691 87Q694 81 694 76Q694 58 676 56H670L382 192Q92 329 90 331Q83 336 83 348Q84 359 96 365Q104 369 382 500T665 634Q669 636 674 636ZM84 -118Q84 -108 99 -98H678Q694 -104 694 -118Q694 -130 679 -138H98Q84 -131 84 -118Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(4446.6,0)"><path data-c="1D45F" d="M21 287Q22 290 23 295T28 317T38 348T53 381T73 411T99 433T132 442Q161 442 183 430T214 408T225 388Q227 382 228 382T236 389Q284 441 347 441H350Q398 441 422 400Q430 381 430 363Q430 333 417 315T391 292T366 288Q346 288 334 299T322 328Q322 376 378 392Q356 405 342 405Q286 405 239 331Q229 315 224 298T190 165Q156 25 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 114 189T154 366Q154 405 128 405Q107 405 92 377T68 316T57 280Q55 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi mathvariant="normal">Φ</mi><mo stretchy="false">(</mo><mrow data-mjx-texclass="ORD"><mi mathvariant="bold">r</mi></mrow><mo stretchy="false">(</mo><mi>t</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>≤</mo><mi>r</mi></math></mjx-assistive-mml></mjx-container>, मतलब sphere की सतह चट्टान तक पहुँच गई है, और कैमरा उस arc लंबाई पर रुकता है, अपने radius जितना कम।</p>
<p>collider एक और method एक safety net के रूप में रखता है, depenetration। Collision को सबसे पहले तो कैमरे को ठोस से बाहर रखना चाहिए, लेकिन कुछ हालात इसके पास से सरक जाते हैं, एक pivot जो एक ऐसी पतली दीवार के दोनों तरफ़ बँटा है कि boom उसके अंदर ही शुरू हो जाता है, एक cave जिसे terrain tools ने तब ताज़ा तराशा जब कैमरा उस चट्टान में बैठा था जो अब गायब है, एक building piece जो कैमरे के चारों ओर गिरा दिया गया। उनके लिए collider जाँचता है कि क्या कैमरे ने frame ठोस के अंदर खत्म किया, जहाँ <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="8.587ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 3795.6 1000" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="3A6" d="M312 622Q310 623 307 625T303 629T297 631T286 634T270 635T246 636T211 637H184V683H196Q220 680 361 680T526 683H538V637H511Q468 637 447 635T422 631T411 622V533L425 531Q525 519 595 466T665 342Q665 301 642 267T583 209T506 172T425 152L411 150V61Q417 55 421 53T447 48T511 46H538V0H526Q502 3 361 3T196 0H184V46H211Q231 46 245 46T270 47T286 48T297 51T303 54T307 57T312 61V150H310Q309 151 289 153T232 166T160 195Q149 201 136 210T103 238T69 284T56 342Q56 414 128 467T294 530Q309 532 310 533H312V622ZM170 342Q170 207 307 188H312V495H309Q301 495 282 491T231 469T186 423Q170 389 170 342ZM415 188Q487 199 519 236T551 342Q551 384 539 414T507 459T470 481T434 491T415 495H410V188H415Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(722,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(1111,0)"><g data-mml-node="mi"><path data-c="1D41C" d="M447 131H458Q478 131 478 117Q478 112 471 95T439 51T377 9Q330 -6 286 -6Q196 -6 135 35Q39 96 39 222Q39 324 101 384Q169 453 286 453Q359 453 411 431T464 353Q464 319 445 302T395 284Q360 284 343 305T325 353Q325 380 338 396H333Q317 398 295 398H292Q280 398 271 397T245 390T218 373T197 338T183 283Q182 275 182 231Q182 199 184 180T193 132T220 85T270 57Q289 50 317 50H326Q385 50 414 115Q419 127 423 129T447 131Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(1622,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(2288.8,0)"><path data-c="3C" d="M694 -11T694 -19T688 -33T678 -40Q671 -40 524 29T234 166L90 235Q83 240 83 250Q83 261 91 266Q664 540 678 540Q681 540 687 534T694 519T687 505Q686 504 417 376L151 250L417 124Q686 -4 687 -5Q694 -11 694 -19Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(3344.6,0)"><path data-c="1D45F" d="M21 287Q22 290 23 295T28 317T38 348T53 381T73 411T99 433T132 442Q161 442 183 430T214 408T225 388Q227 382 228 382T236 389Q284 441 347 441H350Q398 441 422 400Q430 381 430 363Q430 333 417 315T391 292T366 288Q346 288 334 299T322 328Q322 376 378 392Q356 405 342 405Q286 405 239 331Q229 315 224 298T190 165Q156 25 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 114 189T154 366Q154 405 128 405Q107 405 92 377T68 316T57 280Q55 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi mathvariant="normal">Φ</mi><mo stretchy="false">(</mo><mrow data-mjx-texclass="ORD"><mi mathvariant="bold">c</mi></mrow><mo stretchy="false">)</mo><mo>&lt;</mo><mi>r</mi></math></mjx-assistive-mml></mjx-container>, और अगर ऐसा हुआ, तो field के gradient को पढ़ता है, जो सीधे खुली हवा की तरफ़ इशारा करता है क्योंकि <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="1.633ex" height="1.545ex" role="img" focusable="false" viewBox="0 -683 722 683" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="3A6" d="M312 622Q310 623 307 625T303 629T297 631T286 634T270 635T246 636T211 637H184V683H196Q220 680 361 680T526 683H538V637H511Q468 637 447 635T422 631T411 622V533L425 531Q525 519 595 466T665 342Q665 301 642 267T583 209T506 172T425 152L411 150V61Q417 55 421 53T447 48T511 46H538V0H526Q502 3 361 3T196 0H184V46H211Q231 46 245 46T270 47T286 48T297 51T303 54T307 57T312 61V150H310Q309 151 289 153T232 166T160 195Q149 201 136 210T103 238T69 284T56 342Q56 414 128 467T294 530Q309 532 310 533H312V622ZM170 342Q170 207 307 188H312V495H309Q301 495 282 491T231 469T186 423Q170 389 170 342ZM415 188Q487 199 519 236T551 342Q551 384 539 414T507 459T470 481T434 491T415 495H410V188H415Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi mathvariant="normal">Φ</mi></math></mjx-assistive-mml></mjx-container> तब बढ़ता है जब आप चट्टान छोड़ते हैं, और कैमरे को उसके साथ बाहर कदम रखाता है:</p>
<mjx-container tabindex="0" class="MathJax" jax="SVG" display="true" style="direction: ltr; display: block; text-align: center; margin: 1em 0; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -2.172ex;" xmlns="http://www.w3.org/2000/svg" width="29.076ex" height="5.475ex" role="img" focusable="false" viewBox="0 -1460 12851.4 2420" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D41C" d="M447 131H458Q478 131 478 117Q478 112 471 95T439 51T377 9Q330 -6 286 -6Q196 -6 135 35Q39 96 39 222Q39 324 101 384Q169 453 286 453Q359 453 411 431T464 353Q464 319 445 302T395 284Q360 284 343 305T325 353Q325 380 338 396H333Q317 398 295 398H292Q280 398 271 397T245 390T218 373T197 338T183 283Q182 275 182 231Q182 199 184 180T193 132T220 85T270 57Q289 50 317 50H326Q385 50 414 115Q419 127 423 129T447 131Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(788.8,0)"><path data-c="2190" d="M944 261T944 250T929 230H165Q167 228 182 216T211 189T244 152T277 96T303 25Q308 7 308 0Q308 -11 288 -11Q281 -11 278 -11T272 -7T267 2T263 21Q245 94 195 151T73 236Q58 242 55 247Q55 254 59 257T73 264Q121 283 158 314T215 375T247 434T264 480L267 497Q269 503 270 505T275 509T288 511Q308 511 308 500Q308 493 303 475Q293 438 278 406T246 352T215 315T185 287T165 270H929Q944 261 944 250Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(2066.6,0)"><g data-mml-node="mi"><path data-c="1D41C" d="M447 131H458Q478 131 478 117Q478 112 471 95T439 51T377 9Q330 -6 286 -6Q196 -6 135 35Q39 96 39 222Q39 324 101 384Q169 453 286 453Q359 453 411 431T464 353Q464 319 445 302T395 284Q360 284 343 305T325 353Q325 380 338 396H333Q317 398 295 398H292Q280 398 271 397T245 390T218 373T197 338T183 283Q182 275 182 231Q182 199 184 180T193 132T220 85T270 57Q289 50 317 50H326Q385 50 414 115Q419 127 423 129T447 131Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(2799.8,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(3800,0)"><g data-mml-node="mo" transform="translate(0 -0.5)"><path data-c="28" d="M152 251Q152 646 388 850H416Q422 844 422 841Q422 837 403 816T357 753T302 649T255 482T236 250Q236 124 255 19T301 -147T356 -251T403 -315T422 -340Q422 -343 416 -349H388Q359 -325 332 -296T271 -213T212 -97T170 56T152 251Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mi" transform="translate(4258,0)"><path data-c="1D45F" d="M21 287Q22 290 23 295T28 317T38 348T53 381T73 411T99 433T132 442Q161 442 183 430T214 408T225 388Q227 382 228 382T236 389Q284 441 347 441H350Q398 441 422 400Q430 381 430 363Q430 333 417 315T391 292T366 288Q346 288 334 299T322 328Q322 376 378 392Q356 405 342 405Q286 405 239 331Q229 315 224 298T190 165Q156 25 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 114 189T154 366Q154 405 128 405Q107 405 92 377T68 316T57 280Q55 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(4931.2,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(5931.4,0)"><path data-c="3A6" d="M312 622Q310 623 307 625T303 629T297 631T286 634T270 635T246 636T211 637H184V683H196Q220 680 361 680T526 683H538V637H511Q468 637 447 635T422 631T411 622V533L425 531Q525 519 595 466T665 342Q665 301 642 267T583 209T506 172T425 152L411 150V61Q417 55 421 53T447 48T511 46H538V0H526Q502 3 361 3T196 0H184V46H211Q231 46 245 46T270 47T286 48T297 51T303 54T307 57T312 61V150H310Q309 151 289 153T232 166T160 195Q149 201 136 210T103 238T69 284T56 342Q56 414 128 467T294 530Q309 532 310 533H312V622ZM170 342Q170 207 307 188H312V495H309Q301 495 282 491T231 469T186 423Q170 389 170 342ZM415 188Q487 199 519 236T551 342Q551 384 539 414T507 459T470 481T434 491T415 495H410V188H415Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(6653.4,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(7042.4,0)"><g data-mml-node="mi"><path data-c="1D41C" d="M447 131H458Q478 131 478 117Q478 112 471 95T439 51T377 9Q330 -6 286 -6Q196 -6 135 35Q39 96 39 222Q39 324 101 384Q169 453 286 453Q359 453 411 431T464 353Q464 319 445 302T395 284Q360 284 343 305T325 353Q325 380 338 396H333Q317 398 295 398H292Q280 398 271 397T245 390T218 373T197 338T183 283Q182 275 182 231Q182 199 184 180T193 132T220 85T270 57Q289 50 317 50H326Q385 50 414 115Q419 127 423 129T447 131Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(7553.4,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(7942.4,0)"><g data-mml-node="mo" transform="translate(0 -0.5)"><path data-c="29" d="M305 251Q305 -145 69 -349H56Q43 -349 39 -347T35 -338Q37 -333 60 -307T108 -239T160 -136T204 27T221 250T204 473T160 636T108 740T60 807T35 839Q35 850 50 850H56H69Q197 743 256 566Q305 425 305 251Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mstyle" transform="translate(8400.4,0)"><g data-mml-node="mspace"/></g><g data-mml-node="mfrac" transform="translate(8567.4,0)"><g data-mml-node="mrow" transform="translate(720,710)"><g data-mml-node="mi"><path data-c="2207" d="M46 676Q46 679 51 683H781Q786 679 786 676Q786 674 617 326T444 -26Q439 -33 416 -33T388 -26Q385 -22 216 326T46 676ZM697 596Q697 597 445 597T193 596Q195 591 319 336T445 80L697 596Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(833,0)"><path data-c="3A6" d="M312 622Q310 623 307 625T303 629T297 631T286 634T270 635T246 636T211 637H184V683H196Q220 680 361 680T526 683H538V637H511Q468 637 447 635T422 631T411 622V533L425 531Q525 519 595 466T665 342Q665 301 642 267T583 209T506 172T425 152L411 150V61Q417 55 421 53T447 48T511 46H538V0H526Q502 3 361 3T196 0H184V46H211Q231 46 245 46T270 47T286 48T297 51T303 54T307 57T312 61V150H310Q309 151 289 153T232 166T160 195Q149 201 136 210T103 238T69 284T56 342Q56 414 128 467T294 530Q309 532 310 533H312V622ZM170 342Q170 207 307 188H312V495H309Q301 495 282 491T231 469T186 423Q170 389 170 342ZM415 188Q487 199 519 236T551 342Q551 384 539 414T507 459T470 481T434 491T415 495H410V188H415Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(1555,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(1944,0)"><g data-mml-node="mi"><path data-c="1D41C" d="M447 131H458Q478 131 478 117Q478 112 471 95T439 51T377 9Q330 -6 286 -6Q196 -6 135 35Q39 96 39 222Q39 324 101 384Q169 453 286 453Q359 453 411 431T464 353Q464 319 445 302T395 284Q360 284 343 305T325 353Q325 380 338 396H333Q317 398 295 398H292Q280 398 271 397T245 390T218 373T197 338T183 283Q182 275 182 231Q182 199 184 180T193 132T220 85T270 57Q289 50 317 50H326Q385 50 414 115Q419 127 423 129T447 131Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(2455,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mrow" transform="translate(220,-710)"><g data-mml-node="mo"><path data-c="2016" d="M133 736Q138 750 153 750Q164 750 170 739Q172 735 172 250T170 -239Q164 -250 152 -250Q144 -250 138 -244L137 -243Q133 -241 133 -179T132 250Q132 731 133 736ZM329 739Q334 750 346 750Q353 750 361 744L362 743Q366 741 366 679T367 250T367 -178T362 -243L361 -244Q355 -250 347 -250Q335 -250 329 -239Q327 -235 327 250T329 739Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(500,0)"><path data-c="2207" d="M46 676Q46 679 51 683H781Q786 679 786 676Q786 674 617 326T444 -26Q439 -33 416 -33T388 -26Q385 -22 216 326T46 676ZM697 596Q697 597 445 597T193 596Q195 591 319 336T445 80L697 596Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(1333,0)"><path data-c="3A6" d="M312 622Q310 623 307 625T303 629T297 631T286 634T270 635T246 636T211 637H184V683H196Q220 680 361 680T526 683H538V637H511Q468 637 447 635T422 631T411 622V533L425 531Q525 519 595 466T665 342Q665 301 642 267T583 209T506 172T425 152L411 150V61Q417 55 421 53T447 48T511 46H538V0H526Q502 3 361 3T196 0H184V46H211Q231 46 245 46T270 47T286 48T297 51T303 54T307 57T312 61V150H310Q309 151 289 153T232 166T160 195Q149 201 136 210T103 238T69 284T56 342Q56 414 128 467T294 530Q309 532 310 533H312V622ZM170 342Q170 207 307 188H312V495H309Q301 495 282 491T231 469T186 423Q170 389 170 342ZM415 188Q487 199 519 236T551 342Q551 384 539 414T507 459T470 481T434 491T415 495H410V188H415Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(2055,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(2444,0)"><g data-mml-node="mi"><path data-c="1D41C" d="M447 131H458Q478 131 478 117Q478 112 471 95T439 51T377 9Q330 -6 286 -6Q196 -6 135 35Q39 96 39 222Q39 324 101 384Q169 453 286 453Q359 453 411 431T464 353Q464 319 445 302T395 284Q360 284 343 305T325 353Q325 380 338 396H333Q317 398 295 398H292Q280 398 271 397T245 390T218 373T197 338T183 283Q182 275 182 231Q182 199 184 180T193 132T220 85T270 57Q289 50 317 50H326Q385 50 414 115Q419 127 423 129T447 131Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(2955,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(3344,0)"><path data-c="2016" d="M133 736Q138 750 153 750Q164 750 170 739Q172 735 172 250T170 -239Q164 -250 152 -250Q144 -250 138 -244L137 -243Q133 -241 133 -179T132 250Q132 731 133 736ZM329 739Q334 750 346 750Q353 750 361 744L362 743Q366 741 366 679T367 250T367 -178T362 -243L361 -244Q355 -250 347 -250Q335 -250 329 -239Q327 -235 327 250T329 739Z" style="stroke-width: 3;"/></g></g><rect width="4044" height="60" x="120" y="220"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="block" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; overflow: hidden; width: 100%;"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mrow data-mjx-texclass="ORD"><mi mathvariant="bold">c</mi></mrow><mo stretchy="false">←</mo><mrow data-mjx-texclass="ORD"><mi mathvariant="bold">c</mi></mrow><mo>+</mo><mrow data-mjx-texclass="ORD"><mo minsize="1.2em" maxsize="1.2em">(</mo></mrow><mi>r</mi><mo>−</mo><mi mathvariant="normal">Φ</mi><mo stretchy="false">(</mo><mrow data-mjx-texclass="ORD"><mi mathvariant="bold">c</mi></mrow><mo stretchy="false">)</mo><mrow data-mjx-texclass="ORD"><mo minsize="1.2em" maxsize="1.2em">)</mo></mrow><mstyle scriptlevel="0"><mspace width="0.167em"/></mstyle><mfrac><mrow><mi mathvariant="normal">∇</mi><mi mathvariant="normal">Φ</mi><mo stretchy="false">(</mo><mrow data-mjx-texclass="ORD"><mi mathvariant="bold">c</mi></mrow><mo stretchy="false">)</mo></mrow><mrow><mo data-mjx-texclass="OPEN" fence="false" stretchy="false">‖</mo><mi mathvariant="normal">∇</mi><mi mathvariant="normal">Φ</mi><mo stretchy="false">(</mo><mrow data-mjx-texclass="ORD"><mi mathvariant="bold">c</mi></mrow><mo stretchy="false">)</mo><mo data-mjx-texclass="CLOSE" fence="false" stretchy="false">‖</mo></mrow></mfrac></math></mjx-assistive-mml></mjx-container><p>उन कुछ iterations से यह <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="1.02ex" height="1.025ex" role="img" focusable="false" viewBox="0 -442 451 453" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D45F" d="M21 287Q22 290 23 295T28 317T38 348T53 381T73 411T99 433T132 442Q161 442 183 430T214 408T225 388Q227 382 228 382T236 389Q284 441 347 441H350Q398 441 422 400Q430 381 430 363Q430 333 417 315T391 292T366 288Q346 288 334 299T322 328Q322 376 378 392Q356 405 342 405Q286 405 239 331Q229 315 224 298T190 165Q156 25 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 114 189T154 366Q154 405 128 405Q107 405 92 377T68 316T57 280Q55 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>r</mi></math></mjx-assistive-mml></mjx-container>-isosurface पर converge हो जाता है, और यही वह चीज़ है जिसका मतलब है कि एक sculpting tool कैमरे के नीचे से ज़मीन खोद सकता है और view अगले frame पर रिकवर हो जाता है, काला होने के बजाय।</p>
<h2 id="अंदर-snap-होना-बाहर-easing-और-fence-posts-पर-न-झिझकना" tabindex="-1">अंदर snap होना, बाहर easing, और fence posts पर न झिझकना <a class="header-anchor" href="#अंदर-snap-होना-बाहर-easing-और-fence-posts-पर-न-झिझकना" aria-label="Permalink to &quot;अंदर snap होना, बाहर easing, और fence posts पर न झिझकना&quot;"></a></h2>
<p>एक boom जो हर frame बस collision की दूरी पर कूद जाता है, किसी boom न होने से भी बदतर है, क्योंकि वर्ल्ड पतली चीज़ों से भरा है जिनके पीछे कैमरा एक frame के लिए गुज़रता है, एक fence post, एक lamp, एक पेड़ का तना, और एक कैमरा जो हर एक से बचने के लिए झपटता है और वापस झपटता है, मतली पैदा करता है। Haigh-Hutchinson की किताब और Itay Keren का camera motion पर खूब पसंद किया गया talk दोनों एक ही अंतर्ज्ञान पर पहुँचते हैं, कि कैमरे को खतरों और जोखिम पर उससे तेज़ प्रतिक्रिया करनी चाहिए जितनी तेज़ी से वह उनसे आराम पाता है। तो damping जानबूझकर असममित है। जब कोई occluder दिखता है और boom को छोटा होने की ज़रूरत होती है, तो वह लगभग तुरंत अंदर snap हो जाता है, क्योंकि clipping का एक frame भद्दा होता है और प्लेयर एक तेज़ tuck को माफ़ कर देता है। जब occluder साफ़ हो जाता है और boom लंबा होना चाहता है, तो वह धीरे-धीरे बाहर ease होता है, और सिर्फ़ तब जब लगातार साफ़ रहने का एक छोटा dwell timer बीत चुका हो। वह dwell ही वह hysteresis है जो झिझक को खत्म कर देती है। कैमरे को एक पतले post के पास से तेज़ी से घुमाएँ और post कभी इतनी देर तक साफ़ नहीं रहता कि धीमी extension को trigger करे, इसलिए कैमरा उसके पास से ऐसे सरकता है जैसे वह वहाँ था ही नहीं, जो ठीक वही है जो आपकी आँख चाहती है। Cinemachine इसी विचार को collision में damping और collision से बाहर damping के अलग-अलग मानों के रूप में सामने रखता है, और असममितता ही वह हिस्सा है जो इसे एक spring के बजाय एक camera operator जैसा महसूस कराता है।</p>
<p>code में यह exponential smoothing की एक लाइन है जिसकी rate बदलाव के चिह्न पर switch होती है। अगर <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.045ex;" xmlns="http://www.w3.org/2000/svg" width="0.943ex" height="1.64ex" role="img" focusable="false" viewBox="0 -705 417 725" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="2113" d="M345 104T349 104T361 95T369 80T352 59Q268 -20 206 -20Q170 -20 146 3T113 53T99 104L94 129Q94 130 79 116T48 86T28 70Q22 70 15 79T7 94Q7 98 12 103T58 147L91 179V185Q91 186 91 191T92 200Q92 282 128 400T223 612T336 705Q397 705 397 636V627Q397 453 194 233Q185 223 180 218T174 211T171 208T165 201L163 186Q159 142 159 123Q159 17 208 17Q228 17 253 30T293 56T335 94Q345 104 349 104ZM360 634Q360 655 354 661T336 668Q328 668 322 666T302 645T272 592Q252 547 229 467T192 330L179 273Q179 272 186 280T204 300T221 322Q327 453 355 590Q360 612 360 634Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>ℓ</mi></math></mjx-assistive-mml></mjx-container> मौजूदा boom लंबाई है, <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.023ex;" xmlns="http://www.w3.org/2000/svg" width="1.197ex" height="1.02ex" role="img" focusable="false" viewBox="0 -441 529 451" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D44E" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>a</mi></math></mjx-assistive-mml></mjx-container> वह लंबाई है जिसकी इस frame collision इजाज़त देता है, और <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="2.701ex" height="1.645ex" role="img" focusable="false" viewBox="0 -716 1194 727" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="394" d="M51 0Q46 4 46 7Q46 9 215 357T388 709Q391 716 416 716Q439 716 444 709Q447 705 616 357T786 7Q786 4 781 0H51ZM507 344L384 596L137 92L383 91H630Q630 93 507 344Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(833,0)"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi mathvariant="normal">Δ</mi><mi>t</mi></math></mjx-assistive-mml></mjx-container> frame समय है, तो</p>
<mjx-container tabindex="0" class="MathJax" jax="SVG" display="true" style="direction: ltr; display: block; text-align: center; margin: 1em 0; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -2.149ex;" xmlns="http://www.w3.org/2000/svg" width="62.104ex" height="5.43ex" role="img" focusable="false" viewBox="0 -1450 27450 2400" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="2113" d="M345 104T349 104T361 95T369 80T352 59Q268 -20 206 -20Q170 -20 146 3T113 53T99 104L94 129Q94 130 79 116T48 86T28 70Q22 70 15 79T7 94Q7 98 12 103T58 147L91 179V185Q91 186 91 191T92 200Q92 282 128 400T223 612T336 705Q397 705 397 636V627Q397 453 194 233Q185 223 180 218T174 211T171 208T165 201L163 186Q159 142 159 123Q159 17 208 17Q228 17 253 30T293 56T335 94Q345 104 349 104ZM360 634Q360 655 354 661T336 668Q328 668 322 666T302 645T272 592Q252 547 229 467T192 330L179 273Q179 272 186 280T204 300T221 322Q327 453 355 590Q360 612 360 634Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(694.8,0)"><path data-c="2190" d="M944 261T944 250T929 230H165Q167 228 182 216T211 189T244 152T277 96T303 25Q308 7 308 0Q308 -11 288 -11Q281 -11 278 -11T272 -7T267 2T263 21Q245 94 195 151T73 236Q58 242 55 247Q55 254 59 257T73 264Q121 283 158 314T215 375T247 434T264 480L267 497Q269 503 270 505T275 509T288 511Q308 511 308 500Q308 493 303 475Q293 438 278 406T246 352T215 315T185 287T165 270H929Q944 261 944 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(1972.6,0)"><path data-c="2113" d="M345 104T349 104T361 95T369 80T352 59Q268 -20 206 -20Q170 -20 146 3T113 53T99 104L94 129Q94 130 79 116T48 86T28 70Q22 70 15 79T7 94Q7 98 12 103T58 147L91 179V185Q91 186 91 191T92 200Q92 282 128 400T223 612T336 705Q397 705 397 636V627Q397 453 194 233Q185 223 180 218T174 211T171 208T165 201L163 186Q159 142 159 123Q159 17 208 17Q228 17 253 30T293 56T335 94Q345 104 349 104ZM360 634Q360 655 354 661T336 668Q328 668 322 666T302 645T272 592Q252 547 229 467T192 330L179 273Q179 272 186 280T204 300T221 322Q327 453 355 590Q360 612 360 634Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(2611.8,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(3612,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(4001,0)"><path data-c="1D44E" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(4752.2,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(5752.4,0)"><path data-c="2113" d="M345 104T349 104T361 95T369 80T352 59Q268 -20 206 -20Q170 -20 146 3T113 53T99 104L94 129Q94 130 79 116T48 86T28 70Q22 70 15 79T7 94Q7 98 12 103T58 147L91 179V185Q91 186 91 191T92 200Q92 282 128 400T223 612T336 705Q397 705 397 636V627Q397 453 194 233Q185 223 180 218T174 211T171 208T165 201L163 186Q159 142 159 123Q159 17 208 17Q228 17 253 30T293 56T335 94Q345 104 349 104ZM360 634Q360 655 354 661T336 668Q328 668 322 666T302 645T272 592Q252 547 229 467T192 330L179 273Q179 272 186 280T204 300T221 322Q327 453 355 590Q360 612 360 634Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(6169.4,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(6558.4,0)"><g data-mml-node="mo" transform="translate(0 -0.5)"><path data-c="28" d="M152 251Q152 646 388 850H416Q422 844 422 841Q422 837 403 816T357 753T302 649T255 482T236 250Q236 124 255 19T301 -147T356 -251T403 -315T422 -340Q422 -343 416 -349H388Q359 -325 332 -296T271 -213T212 -97T170 56T152 251Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mn" transform="translate(7016.4,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(7738.7,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msup" transform="translate(8738.9,0)"><g data-mml-node="mi"><path data-c="1D452" d="M39 168Q39 225 58 272T107 350T174 402T244 433T307 442H310Q355 442 388 420T421 355Q421 265 310 237Q261 224 176 223Q139 223 138 221Q138 219 132 186T125 128Q125 81 146 54T209 26T302 45T394 111Q403 121 406 121Q410 121 419 112T429 98T420 82T390 55T344 24T281 -1T205 -11Q126 -11 83 42T39 168ZM373 353Q367 405 305 405Q272 405 244 391T199 357T170 316T154 280T149 261Q149 260 169 260Q282 260 327 284T373 353Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" transform="translate(499,413) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mo"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(778,0)"><path data-c="1D458" d="M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z" style="stroke-width: 3;"/></g><g data-mml-node="mstyle" transform="translate(1299,0) scale(1.414)"><g data-mml-node="mspace"/></g><g data-mml-node="mi" transform="translate(1535.2,0)"><path data-c="394" d="M51 0Q46 4 46 7Q46 9 215 357T388 709Q391 716 416 716Q439 716 444 709Q447 705 616 357T786 7Q786 4 781 0H51ZM507 344L384 596L137 92L383 91H630Q630 93 507 344Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(2368.2,0)"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z" style="stroke-width: 3;"/></g></g></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(11217.7,0)"><g data-mml-node="mo" transform="translate(0 -0.5)"><path data-c="29" d="M305 251Q305 -145 69 -349H56Q43 -349 39 -347T35 -338Q37 -333 60 -307T108 -239T160 -136T204 27T221 250T204 473T160 636T108 740T60 807T35 839Q35 850 50 850H56H69Q197 743 256 566Q305 425 305 251Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(11675.7,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="mstyle" transform="translate(11953.7,0)"><g data-mml-node="mspace"/></g><g data-mml-node="mi" transform="translate(14120.4,0)"><path data-c="1D458" d="M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(14919.2,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mrow" transform="translate(15974.9,0)"><g data-mml-node="mo" transform="translate(0 -0.5)"><path data-c="7B" d="M618 -943L612 -949H582L568 -943Q472 -903 411 -841T332 -703Q327 -682 327 -653T325 -350Q324 -28 323 -18Q317 24 301 61T264 124T221 171T179 205T147 225T132 234Q130 238 130 250Q130 255 130 258T131 264T132 267T134 269T139 272T144 275Q207 308 256 367Q310 436 323 519Q324 529 325 851Q326 1124 326 1154T332 1205Q369 1358 566 1443L582 1450H612L618 1444V1429Q618 1413 616 1411L608 1406Q599 1402 585 1393T552 1372T515 1343T479 1305T449 1257T429 1200Q425 1180 425 1152T423 851Q422 579 422 549T416 498Q407 459 388 424T346 364T297 318T250 284T214 264T197 254L188 251L205 242Q290 200 345 138T416 3Q421 -18 421 -48T423 -349Q423 -397 423 -472Q424 -677 428 -694Q429 -697 429 -699Q434 -722 443 -743T465 -782T491 -816T519 -845T548 -868T574 -886T595 -899T610 -908L616 -910Q618 -912 618 -928V-943Z" style="stroke-width: 3;"/></g><g data-mml-node="mtable" transform="translate(750,0)"><g data-mml-node="mtr" transform="translate(0,700)"><g data-mml-node="mtd"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D458" d="M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" transform="translate(554,-150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mtext"><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" style="stroke-width: 3;"/><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(278,0)" style="stroke-width: 3;"/></g></g></g></g><g data-mml-node="mtd" transform="translate(2625.8,0)"><g data-mml-node="mi"><path data-c="1D44E" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(806.8,0)"><path data-c="2264" d="M674 636Q682 636 688 630T694 615T687 601Q686 600 417 472L151 346L399 228Q687 92 691 87Q694 81 694 76Q694 58 676 56H670L382 192Q92 329 90 331Q83 336 83 348Q84 359 96 365Q104 369 382 500T665 634Q669 636 674 636ZM84 -118Q84 -108 99 -98H678Q694 -104 694 -118Q694 -130 679 -138H98Q84 -131 84 -118Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(1862.6,0)"><path data-c="2113" d="M345 104T349 104T361 95T369 80T352 59Q268 -20 206 -20Q170 -20 146 3T113 53T99 104L94 129Q94 130 79 116T48 86T28 70Q22 70 15 79T7 94Q7 98 12 103T58 147L91 179V185Q91 186 91 191T92 200Q92 282 128 400T223 612T336 705Q397 705 397 636V627Q397 453 194 233Q185 223 180 218T174 211T171 208T165 201L163 186Q159 142 159 123Q159 17 208 17Q228 17 253 30T293 56T335 94Q345 104 349 104ZM360 634Q360 655 354 661T336 668Q328 668 322 666T302 645T272 592Q252 547 229 467T192 330L179 273Q179 272 186 280T204 300T221 322Q327 453 355 590Q360 612 360 634Z" style="stroke-width: 3;"/></g></g></g><g data-mml-node="mtr" transform="translate(0,-700)"><g data-mml-node="mtd"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D458" d="M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" transform="translate(554,-150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mtext"><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z" style="stroke-width: 3;"/><path data-c="75" d="M383 58Q327 -10 256 -10H249Q124 -10 105 89Q104 96 103 226Q102 335 102 348T96 369Q86 385 36 385H25V408Q25 431 27 431L38 432Q48 433 67 434T105 436Q122 437 142 438T172 441T184 442H187V261Q188 77 190 64Q193 49 204 40Q224 26 264 26Q290 26 311 35T343 58T363 90T375 120T379 144Q379 145 379 161T380 201T380 248V315Q380 361 370 372T320 385H302V431Q304 431 378 436T457 442H464V264Q464 84 465 81Q468 61 479 55T524 46H542V0Q540 0 467 -5T390 -11H383V58Z" transform="translate(500,0)" style="stroke-width: 3;"/><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" transform="translate(1056,0)" style="stroke-width: 3;"/></g></g></g></g><g data-mml-node="mtd" transform="translate(2625.8,0)"><g data-mml-node="mi"><path data-c="1D44E" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(806.8,0)"><path data-c="3E" d="M84 520Q84 528 88 533T96 539L99 540Q106 540 253 471T544 334L687 265Q694 260 694 250T687 235Q685 233 395 96L107 -40H101Q83 -38 83 -20Q83 -19 83 -17Q82 -10 98 -1Q117 9 248 71Q326 108 378 132L626 250L378 368Q90 504 86 509Q84 513 84 520Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(1862.6,0)"><path data-c="2113" d="M345 104T349 104T361 95T369 80T352 59Q268 -20 206 -20Q170 -20 146 3T113 53T99 104L94 129Q94 130 79 116T48 86T28 70Q22 70 15 79T7 94Q7 98 12 103T58 147L91 179V185Q91 186 91 191T92 200Q92 282 128 400T223 612T336 705Q397 705 397 636V627Q397 453 194 233Q185 223 180 218T174 211T171 208T165 201L163 186Q159 142 159 123Q159 17 208 17Q228 17 253 30T293 56T335 94Q345 104 349 104ZM360 634Q360 655 354 661T336 668Q328 668 322 666T302 645T272 592Q252 547 229 467T192 330L179 273Q179 272 186 280T204 300T221 322Q327 453 355 590Q360 612 360 634Z" style="stroke-width: 3;"/></g></g></g></g><g data-mml-node="mo" transform="translate(5655.3,0) translate(0 250)"/></g><g data-mml-node="mo" transform="translate(21630.3,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="mstyle" transform="translate(21908.3,0)"><g data-mml-node="mspace"/></g><g data-mml-node="msub" transform="translate(23074.9,0)"><g data-mml-node="mi"><path data-c="1D458" d="M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" transform="translate(554,-150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mtext"><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" style="stroke-width: 3;"/><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(278,0)" style="stroke-width: 3;"/></g></g></g><g data-mml-node="mo" transform="translate(24546.4,0)"><path data-c="226B" d="M55 539T55 547T60 561T74 567Q81 567 207 498Q297 449 365 412Q633 265 636 261Q639 255 639 250Q639 241 626 232Q614 224 365 88Q83 -65 79 -66Q76 -67 73 -67Q65 -67 60 -61T55 -47Q55 -39 61 -33Q62 -33 95 -15T193 39T320 109L321 110H322L323 111H324L325 112L326 113H327L329 114H330L331 115H332L333 116L334 117H335L336 118H337L338 119H339L340 120L341 121H342L343 122H344L345 123H346L347 124L348 125H349L351 126H352L353 127H354L355 128L356 129H357L358 130H359L360 131H361L362 132L363 133H364L365 134H366L367 135H368L369 136H370L371 137L372 138H373L374 139H375L376 140L378 141L576 251Q63 530 62 533Q55 539 55 547ZM360 539T360 547T365 561T379 567Q386 567 512 498Q602 449 670 412Q938 265 941 261Q944 255 944 250Q944 241 931 232Q919 224 670 88Q388 -65 384 -66Q381 -67 378 -67Q370 -67 365 -61T360 -47Q360 -39 366 -33Q367 -33 400 -15T498 39T625 109L626 110H627L628 111H629L630 112L631 113H632L634 114H635L636 115H637L638 116L639 117H640L641 118H642L643 119H644L645 120L646 121H647L648 122H649L650 123H651L652 124L653 125H654L656 126H657L658 127H659L660 128L661 129H662L663 130H664L665 131H666L667 132L668 133H669L670 134H671L672 135H673L674 136H675L676 137L677 138H678L679 139H680L681 140L683 141L881 251Q368 530 367 533Q360 539 360 547Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(25824.2,0)"><g data-mml-node="mi"><path data-c="1D458" d="M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" transform="translate(554,-150) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mtext"><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z" style="stroke-width: 3;"/><path data-c="75" d="M383 58Q327 -10 256 -10H249Q124 -10 105 89Q104 96 103 226Q102 335 102 348T96 369Q86 385 36 385H25V408Q25 431 27 431L38 432Q48 433 67 434T105 436Q122 437 142 438T172 441T184 442H187V261Q188 77 190 64Q193 49 204 40Q224 26 264 26Q290 26 311 35T343 58T363 90T375 120T379 144Q379 145 379 161T380 201T380 248V315Q380 361 370 372T320 385H302V431Q304 431 378 436T457 442H464V264Q464 84 465 81Q468 61 479 55T524 46H542V0Q540 0 467 -5T390 -11H383V58Z" transform="translate(500,0)" style="stroke-width: 3;"/><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" transform="translate(1056,0)" style="stroke-width: 3;"/></g></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="block" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; overflow: hidden; width: 100%;"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mi>ℓ</mi><mo stretchy="false">←</mo><mi>ℓ</mi><mo>+</mo><mo stretchy="false">(</mo><mi>a</mi><mo>−</mo><mi>ℓ</mi><mo stretchy="false">)</mo><mrow data-mjx-texclass="ORD"><mo minsize="1.2em" maxsize="1.2em">(</mo></mrow><mn>1</mn><mo>−</mo><msup><mi>e</mi><mrow data-mjx-texclass="ORD"><mo>−</mo><mi>k</mi><mstyle scriptlevel="0"><mspace width="0.167em"/></mstyle><mi mathvariant="normal">Δ</mi><mi>t</mi></mrow></msup><mrow data-mjx-texclass="ORD"><mo minsize="1.2em" maxsize="1.2em">)</mo></mrow><mo>,</mo><mstyle scriptlevel="0"><mspace width="2em"/></mstyle><mi>k</mi><mo>=</mo><mrow data-mjx-texclass="INNER"><mo data-mjx-texclass="OPEN">{</mo><mtable columnalign="left left" columnspacing="1em" rowspacing="0.4em 0.2em"><mtr><mtd><msub><mi>k</mi><mrow data-mjx-texclass="ORD"><mtext>in</mtext></mrow></msub></mtd><mtd><mi>a</mi><mo>≤</mo><mi>ℓ</mi></mtd></mtr><mtr><mtd><msub><mi>k</mi><mrow data-mjx-texclass="ORD"><mtext>out</mtext></mrow></msub></mtd><mtd><mi>a</mi><mo>&gt;</mo><mi>ℓ</mi></mtd></mtr></mtable><mo data-mjx-texclass="CLOSE" fence="true" stretchy="true" symmetric="true"/></mrow><mo>,</mo><mstyle scriptlevel="0"><mspace width="1em"/></mstyle><msub><mi>k</mi><mrow data-mjx-texclass="ORD"><mtext>in</mtext></mrow></msub><mo>≫</mo><msub><mi>k</mi><mrow data-mjx-texclass="ORD"><mtext>out</mtext></mrow></msub></math></mjx-assistive-mml></mjx-container><p>और ease-out branch सिर्फ़ तब चलती है जब clearance dwell समय <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.029ex;" xmlns="http://www.w3.org/2000/svg" width="1.17ex" height="1.005ex" role="img" focusable="false" viewBox="0 -431 517 444" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D70F" d="M39 284Q18 284 18 294Q18 301 45 338T99 398Q134 425 164 429Q170 431 332 431Q492 431 497 429Q517 424 517 402Q517 388 508 376T485 360Q479 358 389 358T299 356Q298 355 283 274T251 109T233 20Q228 5 215 -4T186 -13Q153 -13 153 20V30L203 192Q214 228 227 272T248 336L254 357Q254 358 208 358Q206 358 197 358T183 359Q105 359 61 295Q56 287 53 286T39 284Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>τ</mi></math></mjx-assistive-mml></mjx-container> तक टिकी रहे। <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.186ex;" xmlns="http://www.w3.org/2000/svg" width="9.505ex" height="2.152ex" role="img" focusable="false" viewBox="0 -869.3 4201.3 951.3" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mn"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(722.2,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msup" transform="translate(1722.4,0)"><g data-mml-node="mi"><path data-c="1D452" d="M39 168Q39 225 58 272T107 350T174 402T244 433T307 442H310Q355 442 388 420T421 355Q421 265 310 237Q261 224 176 223Q139 223 138 221Q138 219 132 186T125 128Q125 81 146 54T209 26T302 45T394 111Q403 121 406 121Q410 121 419 112T429 98T420 82T390 55T344 24T281 -1T205 -11Q126 -11 83 42T39 168ZM373 353Q367 405 305 405Q272 405 244 391T199 357T170 316T154 280T149 261Q149 260 169 260Q282 260 327 284T373 353Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" transform="translate(499,363) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mo"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(778,0)"><path data-c="1D458" d="M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z" style="stroke-width: 3;"/></g><g data-mml-node="mstyle" transform="translate(1299,0) scale(1.414)"><g data-mml-node="mspace"/></g><g data-mml-node="mi" transform="translate(1535.2,0)"><path data-c="394" d="M51 0Q46 4 46 7Q46 9 215 357T388 709Q391 716 416 716Q439 716 444 709Q447 705 616 357T786 7Q786 4 781 0H51ZM507 344L384 596L137 92L383 91H630Q630 93 507 344Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(2368.2,0)"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z" style="stroke-width: 3;"/></g></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn><mo>−</mo><msup><mi>e</mi><mrow data-mjx-texclass="ORD"><mo>−</mo><mi>k</mi><mstyle scriptlevel="0"><mspace width="0.167em"/></mstyle><mi mathvariant="normal">Δ</mi><mi>t</mi></mrow></msup></math></mjx-assistive-mml></mjx-container> रूप सुथरा दिखने से कहीं ज़्यादा मायने रखता है। यह response time constant को frame rate की परवाह किए बिना <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="3.441ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 1521 1000" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mn"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(500,0)"><g data-mml-node="mo"><path data-c="2F" d="M423 750Q432 750 438 744T444 730Q444 725 271 248T92 -240Q85 -250 75 -250Q68 -250 62 -245T56 -231Q56 -221 230 257T407 740Q411 750 423 750Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mi" transform="translate(1000,0)"><path data-c="1D458" d="M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn><mrow data-mjx-texclass="ORD"><mo>/</mo></mrow><mi>k</mi></math></mjx-assistive-mml></mjx-container> पर तय कर देता है, इसलिए कैमरा 30 और 144 frames प्रति सेकंड पर एक जैसा महसूस होता है, जहाँ भोला constant-blend <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="16.286ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 7198.4 1000" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="2113" d="M345 104T349 104T361 95T369 80T352 59Q268 -20 206 -20Q170 -20 146 3T113 53T99 104L94 129Q94 130 79 116T48 86T28 70Q22 70 15 79T7 94Q7 98 12 103T58 147L91 179V185Q91 186 91 191T92 200Q92 282 128 400T223 612T336 705Q397 705 397 636V627Q397 453 194 233Q185 223 180 218T174 211T171 208T165 201L163 186Q159 142 159 123Q159 17 208 17Q228 17 253 30T293 56T335 94Q345 104 349 104ZM360 634Q360 655 354 661T336 668Q328 668 322 666T302 645T272 592Q252 547 229 467T192 330L179 273Q179 272 186 280T204 300T221 322Q327 453 355 590Q360 612 360 634Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(694.8,0)"><path data-c="2190" d="M944 261T944 250T929 230H165Q167 228 182 216T211 189T244 152T277 96T303 25Q308 7 308 0Q308 -11 288 -11Q281 -11 278 -11T272 -7T267 2T263 21Q245 94 195 151T73 236Q58 242 55 247Q55 254 59 257T73 264Q121 283 158 314T215 375T247 434T264 480L267 497Q269 503 270 505T275 509T288 511Q308 511 308 500Q308 493 303 475Q293 438 278 406T246 352T215 315T185 287T165 270H929Q944 261 944 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(1972.6,0)"><path data-c="2113" d="M345 104T349 104T361 95T369 80T352 59Q268 -20 206 -20Q170 -20 146 3T113 53T99 104L94 129Q94 130 79 116T48 86T28 70Q22 70 15 79T7 94Q7 98 12 103T58 147L91 179V185Q91 186 91 191T92 200Q92 282 128 400T223 612T336 705Q397 705 397 636V627Q397 453 194 233Q185 223 180 218T174 211T171 208T165 201L163 186Q159 142 159 123Q159 17 208 17Q228 17 253 30T293 56T335 94Q345 104 349 104ZM360 634Q360 655 354 661T336 668Q328 668 322 666T302 645T272 592Q252 547 229 467T192 330L179 273Q179 272 186 280T204 300T221 322Q327 453 355 590Q360 612 360 634Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(2611.8,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(3612,0)"><path data-c="1D6FC" d="M34 156Q34 270 120 356T309 442Q379 442 421 402T478 304Q484 275 485 237V208Q534 282 560 374Q564 388 566 390T582 393Q603 393 603 385Q603 376 594 346T558 261T497 161L486 147L487 123Q489 67 495 47T514 26Q528 28 540 37T557 60Q559 67 562 68T577 70Q597 70 597 62Q597 56 591 43Q579 19 556 5T512 -10H505Q438 -10 414 62L411 69L400 61Q390 53 370 41T325 18T267 -2T203 -11Q124 -11 79 39T34 156ZM208 26Q257 26 306 47T379 90L403 112Q401 255 396 290Q382 405 304 405Q235 405 183 332Q156 292 139 224T121 120Q121 71 146 49T208 26Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(4252,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(4641,0)"><path data-c="1D44E" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(5392.2,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(6392.4,0)"><path data-c="2113" d="M345 104T349 104T361 95T369 80T352 59Q268 -20 206 -20Q170 -20 146 3T113 53T99 104L94 129Q94 130 79 116T48 86T28 70Q22 70 15 79T7 94Q7 98 12 103T58 147L91 179V185Q91 186 91 191T92 200Q92 282 128 400T223 612T336 705Q397 705 397 636V627Q397 453 194 233Q185 223 180 218T174 211T171 208T165 201L163 186Q159 142 159 123Q159 17 208 17Q228 17 253 30T293 56T335 94Q345 104 349 104ZM360 634Q360 655 354 661T336 668Q328 668 322 666T302 645T272 592Q252 547 229 467T192 330L179 273Q179 272 186 280T204 300T221 322Q327 453 355 590Q360 612 360 634Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(6809.4,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>ℓ</mi><mo stretchy="false">←</mo><mi>ℓ</mi><mo>+</mo><mi>α</mi><mo stretchy="false">(</mo><mi>a</mi><mo>−</mo><mi>ℓ</mi><mo stretchy="false">)</mo></math></mjx-assistive-mml></mjx-container> एक तेज़ मशीन पर ज़्यादा तेज़ी से snap होता और एक धीमी मशीन पर लसलसा जाता।</p>
<p>आखिरी behavior उन तंग interiors के लिए है जिन्होंने यह पूरा भाग शुरू किया। जब boom इतना छोटा ढह जाता है कि कैमरा प्लेयर के ठीक ऊपर होता है, तो हम प्लेयर के अपने avatar को छिपा देते हैं और view को first person के पास बैठने देते हैं। यही Breath of the Wild एक तंग shrine में करता है और यही ज़्यादातर third-person games एक कोने में सहारा लेते हैं, क्योंकि विकल्प, एक कैमरा जो दीवार से सटा हुआ एक सिर के पिछले हिस्से को घूर रहा हो, बेकार है। rig इसके लिए एक अकेला flag सामने रखता है, और world loop उस flag को पढ़ता है और local avatar की दृश्यता को toggle करता है। एक मीटर boom से नीचे आप असल में first person में होते हैं, दीवारों का सम्मान होता है, और जिस पल आप जगह वाले किसी कमरे में पीछे हटते हैं avatar वापस fade in हो जाता है और boom बढ़ जाता है।</p>
<h2 id="आगे-क्या-प्लग-होता-है" tabindex="-1">आगे क्या प्लग होता है <a class="header-anchor" href="#आगे-क्या-प्लग-होता-है" aria-label="Permalink to &quot;आगे क्या प्लग होता है&quot;"></a></h2>
<p>terrain collider आज ship होता है और यही मुश्किल आधा है, क्योंकि terrain हर जगह है और एक distance field probe करने के लिए मुश्किल चीज़ है। authoring spikes के props और building shells आसान आधा हैं, और contract पहले से ही उनका इंतज़ार कर रहा है। एक दूसरा collider, एक raycast collider, pivot से कैमरे की तरफ़ meshes की एक list के खिलाफ़ cast करता है और निकटतम hit को उसी तरह रिपोर्ट करता है जैसे terrain collider करता है। सस्ता संस्करण एक अकेली ray cast करता है, जो तब तक ठीक है जब तक prop की गिनती न चढ़े, और upgrade यह है कि ray को three-mesh-bvh का इस्तेमाल करके एक swept sphere से बदल दें, Garrett Johnson की library जो एक mesh को एक bounding-volume hierarchy में लपेटती है ताकि spatial queries brute force के बजाय log time में चलें। किसी भी तरह rig नहीं बदलता। वह colliders की एक लंबी list से पूछता है और निकटतम hit लेता है, जो पहले contract और बाद में colliders बनाने का पूरा मक़सद है।</p>
<h2 id="इस-अध्याय-में-संदर्भित-तकनीक" tabindex="-1">इस अध्याय में संदर्भित तकनीक <a class="header-anchor" href="#इस-अध्याय-में-संदर्भित-तकनीक" aria-label="Permalink to &quot;इस अध्याय में संदर्भित तकनीक&quot;"></a></h2>
<p><strong>एक boom जो एक संख्या का मालिक है।</strong> camera rig OrbitControls के ऊपर एक post-process है, उसका विकल्प नहीं। यह boom की लंबाई का मालिक है और yaw, pitch, zoom, और gesture handling को उस orbit controller के पास छोड़ देता है जिस पर हम पहले से भरोसा करते थे। integration दो घेरने वाली calls हैं: <code>beforeControls()</code> पिछले frame की पूरी दूरी बहाल करता है ताकि orbit math user की असली zoom पढ़े, न कि एक collision की छोटाई को एक dolly-in समझे, और <code>afterControls(dt)</code> collision सुलझाता है और render की गई position लिखता है। उस जोड़ी के बिना कैमरा कुछ frames में प्लेयर पर ढह जाता है।</p>
<p><strong>एक pluggable collider contract।</strong> एक collider कोई भी ऐसा object है जिसके पास एक <code>probe</code> है जो जवाब देता है कि &quot;कैमरा pivot से इस ray के साथ कितना दूर सफ़र कर सकता है इससे पहले कि तुम उसे रोको।&quot; rig हर collider से पूछता है और निकटतम hit लेता है, इस बात से अनजान कि रुकावट terrain है, एक prop है, या एक दीवार है, जो वही एक-चीज़-का-मालिक अनुशासन है जो <a href="/hi/blog/2026-05-15-open-world-browser-part-29-pluggable-character.html">pluggable character controller</a> ने locomotion के लिए इस्तेमाल किया था। probe एक swept sphere है जो near plane को समाने जितना बड़ा है, एक पतली ray नहीं, इसलिए frustum के कोने कभी किसी ऐसी सतह को clip नहीं करते जिसे केंद्र वाली ray चूक जाती। इसका radius projection से निकाला जाता है, एक near-plane कोने तक की दूरी <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.212ex;" xmlns="http://www.w3.org/2000/svg" width="14.705ex" height="2.398ex" role="img" focusable="false" viewBox="0 -966.5 6499.5 1060" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msqrt"><g transform="translate(853,0)"><g data-mml-node="msup"><g data-mml-node="mi"><path data-c="1D45B" d="M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(633,289) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(1258.8,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msup" transform="translate(2259,0)"><g data-mml-node="mi"><path data-c="1D464" d="M580 385Q580 406 599 424T641 443Q659 443 674 425T690 368Q690 339 671 253Q656 197 644 161T609 80T554 12T482 -11Q438 -11 404 5T355 48Q354 47 352 44Q311 -11 252 -11Q226 -11 202 -5T155 14T118 53T104 116Q104 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Q21 293 29 315T52 366T96 418T161 441Q204 441 227 416T250 358Q250 340 217 250T184 111Q184 65 205 46T258 26Q301 26 334 87L339 96V119Q339 122 339 128T340 136T341 143T342 152T345 165T348 182T354 206T362 238T373 281Q402 395 406 404Q419 431 449 431Q468 431 475 421T483 402Q483 389 454 274T422 142Q420 131 420 107V100Q420 85 423 71T442 42T487 26Q558 26 600 148Q609 171 620 213T632 273Q632 306 619 325T593 357T580 385Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(749,289) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(3633.8,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msup" transform="translate(4634,0)"><g data-mml-node="mi"><path data-c="210E" d="M137 683Q138 683 209 688T282 694Q294 694 294 685Q294 674 258 534Q220 386 220 383Q220 381 227 388Q288 442 357 442Q411 442 444 415T478 336Q478 285 440 178T402 50Q403 36 407 31T422 26Q450 26 474 56T513 138Q516 149 519 151T535 153Q555 153 555 145Q555 144 551 130Q535 71 500 33Q466 -10 419 -10H414Q367 -10 346 17T325 74Q325 90 361 192T398 345Q398 404 354 404H349Q266 404 205 306L198 293L164 158Q132 28 127 16Q114 -11 83 -11Q69 -11 59 -2T48 16Q48 30 121 320L195 616Q195 629 188 632T149 637H128Q122 643 122 645T124 664Q129 683 137 683Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(609,289) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g></g></g><g data-mml-node="mo" transform="translate(0,106.5)"><path data-c="221A" d="M95 178Q89 178 81 186T72 200T103 230T169 280T207 309Q209 311 212 311H213Q219 311 227 294T281 177Q300 134 312 108L397 -77Q398 -77 501 136T707 565T814 786Q820 800 834 800Q841 800 846 794T853 782V776L620 293L385 -193Q381 -200 366 -200Q357 -200 354 -197Q352 -195 256 15L160 225L144 214Q129 202 113 190T95 178Z" style="stroke-width: 3;"/></g><rect width="5646.5" height="60" x="853" y="846.5"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><msqrt><msup><mi>n</mi><mn>2</mn></msup><mo>+</mo><msup><mi>w</mi><mn>2</mn></msup><mo>+</mo><msup><mi>h</mi><mn>2</mn></msup></msqrt></math></mjx-assistive-mml></mjx-container> एक safety margin से गुणा, और जब भी field of view, aspect, या near plane बदलता है तो दोबारा गणना होता है।</p>
<p><strong>एक signed-distance terrain probe जो overhangs और caves का सम्मान करता है।</strong> क्योंकि terrain एक heightmap के बजाय एक <a href="/hi/blog/2026-02-25-open-world-browser-part-07-marching-cubes.html">signed distance field</a> है, वही probe जो कैमरे को एक पहाड़ी की ढलान पर रोकता है उसे एक cave की छत पर भी रोकता है, वह case जिसे एक heightmap raycast संरचनात्मक रूप से नहीं देख सकता। march Hart-शैली का sphere tracing है, field जो ढील रिपोर्ट करता है उसके एक under-relaxed अंश के हिसाब से कदम बढ़ाते हुए और दोनों सिरों पर clamp किया हुआ, क्योंकि heightmap क्षेत्र असली distance के बजाय vertical clearance रिपोर्ट करते हैं और ज़्यादा बताते हैं कि कैमरा एक ढलान पर कितना दूर जा सकता है, इसलिए एक पूरा डग एक चोटी कूद जाता। एक gradient-संचालित depenetration pass वह safety net है जो view को रिकवर करता है जब कैमरे के नीचे से ज़मीन तराश दी जाती है।</p>
<p><strong>dwell timer के साथ असममित damping।</strong> boom तब तेज़ी से अंदर snap होता है जब कोई occluder दिखता है और एक बार साफ़ होने पर धीरे-धीरे बाहर ease होता है, और सिर्फ़ लगातार साफ़ रहने की एक छोटी खिड़की के बाद, ताकि एक fence post के पास से तेज़ी से गुज़रना कभी कैमरे को झपटाए नहीं। एक collapse threshold से नीचे rig near-first-person flag करता है और world loop local avatar को छिपा देता है, जो तंग interiors के लिए मानक सहारा है, दीवार में दबे एक कैमरे के बजाय।</p>
<h2 id="संदर्भ" tabindex="-1">संदर्भ <a class="header-anchor" href="#संदर्भ" aria-label="Permalink to &quot;संदर्भ&quot;"></a></h2>
<p>camera control को एक visibility constraint के रूप में ढालना Marc Christie और Patrick Olivier के <a href="https://people.irisa.fr/Marc.Christie/Publications/2008/CON08.html" target="_blank" rel="noreferrer"><em>Camera Control in Computer Graphics</em></a> (Computer Graphics Forum, 2008) से आता है। distance-field march John C. Hart का <a href="https://graphics.stanford.edu/courses/cs348b-20-spring-content/uploads/hart.pdf" target="_blank" rel="noreferrer"><em>Sphere Tracing: A Geometric Method for the Antialiased Ray Tracing of Implicit Surfaces</em></a> (The Visual Computer, 1996) है। spring-arm pattern और इसका probe-sphere collision Epic के <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/using-spring-arm-components-in-unreal-engine" target="_blank" rel="noreferrer">Spring Arm Component</a> और Unity के <a href="https://docs.unity3d.com/Packages/com.unity.cinemachine@3.1/manual/CinemachineDeoccluder.html" target="_blank" rel="noreferrer">Cinemachine Deoccluder</a> और <a href="https://docs.unity3d.com/Packages/com.unity.cinemachine@3.1/manual/CinemachineThirdPersonFollow.html" target="_blank" rel="noreferrer">Third Person Follow</a> में documented हैं। motion और damping का अंतर्ज्ञान Mark Haigh-Hutchinson की <em>Real-Time Cameras</em> (Morgan Kaufmann, 2009), और Itay Keren के <a href="https://www.gamedeveloper.com/design/scroll-back-the-theory-and-practice-of-cameras-in-side-scrollers" target="_blank" rel="noreferrer"><em>Scroll Back: The Theory and Practice of Cameras in Side-Scrollers</em></a> (GDC 2015) से है। mesh-collider upgrade path Garrett Johnson का <a href="https://github.com/gkjohnson/three-mesh-bvh" target="_blank" rel="noreferrer">three-mesh-bvh</a> है।</p>
<hr>
<p>30 में से भाग 30।
पिछला: <a href="/hi/blog/2026-05-15-open-world-browser-part-29-pluggable-character.html">भाग 29 - एक कंट्रोलर, कोई भी बॉडी</a>
सीरीज़ गाइड: <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">/hi/blog/2026-02-25-open-world-browser-series-guide</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ब्राउज़र में एक ओपन वर्ल्ड बनाना, भाग 29: एक कंट्रोलर, कोई भी बॉडी]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-05-15-open-world-browser-part-29-pluggable-character</link>
            <guid>https://app.cinevva.com/hi/blog/2026-05-15-open-world-browser-part-29-pluggable-character</guid>
            <pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[स्पाइक 58 एक कैरेक्टर कंट्रोलर बनाता है जहाँ physics engine को चलने, तैरने या ग्लाइड करने के बारे में कुछ भी नहीं पता। हर behavior एक pluggable कंट्रोलर है, वही engine प्लेयर, एक सवारी करने लायक घोड़े और एक स्वायत्त NPC को चलाता है, और पूरी चीज़ Node में headless चलती है। स्पाइक 59 बिना किसी कंट्रोलर को छुए उस पर एक retargeted avatar लटका देता है, और स्पाइक 60 एक Synty पैक लटका देता है जिसे retargeting की ज़रूरत ही नहीं, एक ऐसे clip-picker के पीछे जिसे आप unit test कर सकते हैं।]]></description>
            <content:encoded><![CDATA[<h1 id="ब्राउज़र-में-एक-ओपन-वर्ल्ड-बनाना-भाग-29-एक-कंट्रोलर-कोई-भी-बॉडी" tabindex="-1">ब्राउज़र में एक ओपन वर्ल्ड बनाना, भाग 29: एक कंट्रोलर, कोई भी बॉडी <a class="header-anchor" href="#ब्राउज़र-में-एक-ओपन-वर्ल्ड-बनाना-भाग-29-एक-कंट्रोलर-कोई-भी-बॉडी" aria-label="Permalink to &quot;ब्राउज़र में एक ओपन वर्ल्ड बनाना, भाग 29: एक कंट्रोलर, कोई भी बॉडी&quot;"></a></h1>
<p><em><a href="/hi/about.html">Oleg Sidorkin</a> द्वारा, Cinevva के CTO और सह-संस्थापक</em></p>
<p>यहाँ नए हैं? <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">सीरीज़ गाइड</a> का इस्तेमाल करें। यह बताती है कि स्पाइक क्या होता है और सभी भागों को लिंक करती है।</p>
<p><a href="/hi/blog/2026-05-14-open-world-browser-part-28-grass-and-occlusion.html">भाग 28</a> ने घास और occlusion को कवर किया। अट्ठाईस भागों ने खड़े होने लायक एक वर्ल्ड बनाया: ऐसी terrain जिसे आप पढ़ सकते हैं, ऐसा पानी जिसमें आप तैर सकते हैं, ऐसी foliage जो क्षितिज तक टिकी रहती है, एक ऐसा server जो याद रखता है कि आपने क्या बदला। यह भाग उस चीज़ के बारे में है जो इस सबके बीच से होकर गुज़रती है, और यह पूरे engine का फल है, क्योंकि लक्ष्य एक प्लेयर कंट्रोलर नहीं है। यह एक ऐसा कंट्रोलर है जिसे इस बात की परवाह नहीं कि वह कौन सी बॉडी चला रहा है, उसके animations कहाँ से आए, या स्टीयरिंग पर कोई इंसान है या कोई AI। स्पाइक 58 movement को एक physics engine के ऊपर pluggable behaviors के एक stack के रूप में बनाता है जिसे locomotion के बारे में कुछ भी नहीं पता, फिर तीन अलग-अलग बॉडीज़ को उसकी एक ही कॉपी के ज़रिए चलाकर architecture को सिद्ध करता है। स्पाइक 59 उस कंट्रोलर की एक भी लाइन बदले बिना उस पर एक असली retargeted avatar लटका देता है। स्पाइक 60 एक अलग animation पैक लटका देता है जिसे retargeting की ज़रूरत ही नहीं, और clip चुनने वाले logic को बाहर खींचकर ऐसी चीज़ में बदल देता है जिसे आप सचमुच test कर सकते हैं।</p>
<h2 id="एक-physics-engine-जिसे-चलने-के-बारे-में-कुछ-नहीं-पता" tabindex="-1">एक physics engine जिसे चलने के बारे में कुछ नहीं पता <a class="header-anchor" href="#एक-physics-engine-जिसे-चलने-के-बारे-में-कुछ-नहीं-पता" aria-label="Permalink to &quot;एक physics engine जिसे चलने के बारे में कुछ नहीं पता&quot;"></a></h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/58-pluggable-character/" title="Spike 58 Pluggable Character" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/58-pluggable-character/" target="_blank">Spike 58 को नए टैब में खोलें ↗</a> · <a href="/blog/spike-source?spike=58-pluggable-character">सोर्स देखें</a></p>
<p>डिज़ाइन का नियम सख्त है और यही पूरी बात है: capsule engine के पास कोई locomotion नहीं है। न walk, न run, न jump, न friction, न top-speed cap, यहाँ तक कि न gravity। यह बस एक kinematic capsule को terrain के सापेक्ष integrate करता है और इससे ज़्यादा कुछ नहीं। हर locomotion behavior, walk, slide, glide, climb, swim, crouch, stamina, engine के साथ रजिस्टर किए गए एक स्वतंत्र कंट्रोलर में रहता है। हर frame पर engine हर कंट्रोलर को tick करता है, हर एक से पूछता है कि क्या वह control चाहता है, और सबसे ऊँची priority वाले दावेदार को velocity लिखने देता है। Walk का कोई खास दर्जा नहीं है। यह बस सबसे कम priority वाला कंट्रोलर है जो हमेशा हाँ कहता है, इसलिए जब और कुछ नहीं चलता तो यही default है। एक कंट्रोलर छह छोटे functions का बना होता है: एक <code>tick</code> जो हर frame पर अपनी internal state को अपडेट करता है, तब भी जब वह active नहीं होता, एक pure <code>wantsControl</code> predicate जो frame पर दावा करता है, एक <code>applyForces</code> जिसे सिर्फ़ विजेता चलाता है और जो velocity लिखता है और अगर चाहे तो अपनी gravity लगाता है, साथ ही वैकल्पिक <code>onEnter</code>, <code>onExit</code>, और <code>stateName</code>। Swim अपने <code>applyForces</code> से <code>ownsCollision: true</code> लौटाता है ताकि terrain handling अपने हाथ में ले ले, क्योंकि वरना उसका buoyancy spring engine के foot-snap से लड़ता।</p>
<p>वे चीज़ें भी जो locomotion नहीं हैं, फिर भी उस contract से होकर रिसती हैं, और यही उस अगले विचार की वजह बना। architecture को सार्थक बनाने वाला हिस्सा channels हैं। एक पुराने single-channel डिज़ाइन में सब कुछ एक ही arbitration से होकर गुज़रता था, जिसका मतलब था कि एक stamina tracker या एक crouch stance को locomotion होने का दिखावा करना पड़ता था और फिर सिर्फ़ अपनी bookkeeping चलाने के लिए <code>wantsControl</code> के false लौटाने वाले एक hack से control से इनकार करना पड़ता था। यह fix कंट्रोलर्स को नामित channels में बाँट देता है जो स्वतंत्र रूप से arbitrate करते हैं और एक तय क्रम में लागू होते हैं: पहले resource, फिर stance, फिर locomotion। Resource पहले चलता है क्योंकि उसके writes, जैसे stamina decay, बाकी द्वारा पढ़े जाते हैं। Stance दूसरे नंबर पर चलता है क्योंकि crouch द्वारा capsule की height घटाना तब लागू होना चाहिए जब walk उसे पढ़कर top speed cap करे, उससे पहले। Locomotion आखिर में चलता है और per-frame velocity write उसके पास है। तो एक stamina observer और एक crouch modifier और एक active swim कंट्रोलर सब साफ़-साफ़ साथ रहते हैं, हर एक अपने channel में, और किसी कंट्रोलर को अपने बारे में झूठ नहीं बोलना पड़ता। डेमो इस सबको एक नंगे capsule से visualize करता है जो active कंट्रोलर के हिसाब से रंग बदलता है, ताकि आप arbitration होते देख सकें: एक खड़ी ढलान पर green walk नारंगी हो जाता है जैसे ही slide ले लेता है, झील में cyan हो जाता है जैसे swim जीतता है, हवा में cream हो जाता है जब आप glide टैप करते हैं।</p>
<h2 id="एक-engine-तीन-बॉडीज़" tabindex="-1">एक engine, तीन बॉडीज़ <a class="header-anchor" href="#एक-engine-तीन-बॉडीज़" aria-label="Permalink to &quot;एक engine, तीन बॉडीज़&quot;"></a></h2>
<p>&quot;कोई locomotion नहीं&quot; का असली test प्लेयर नहीं है। यह है कि क्या वही engine, बिना छुए, कुछ ऐसा चला सकता है जो प्लेयर है ही नहीं। <code>createCapsuleEngine</code> एक pure factory है जिसमें कोई module-level state नहीं, कोई singletons नहीं, और कोई per-instance side effects नहीं, इसलिए स्पाइक इसे तीन बार instantiate करता है। प्लेयर पूरे कंट्रोलर सेट वाला एक instance है। एक सवारी करने लायक घोड़ा दूसरा instance है जो सिर्फ़ एक walk कंट्रोलर रजिस्टर करता है, जो इस पूरे विचार को शब्दशः साकार करता है: एक बॉडी की movement की शब्दावली बस वही कंट्रोलर्स हैं जो आपने रजिस्टर किए, इसलिए घोड़ा समतल पर तेज़ है और शारीरिक रूप से न चढ़ सकता है, न तैर सकता है, न glide कर सकता है, क्योंकि वे कंट्रोलर्स कभी जोड़े ही नहीं गए। एक स्वायत्त NPC तीसरा instance है, जिसे प्लेयर के साथ-साथ हर frame पर tick किया जाता है, एक wander कंट्रोलर से चलाया जाता है जो अपना खुद का input बनाता है ताकि बॉडी खुद को steer करे, keyboard पर कोई हाथ नहीं। engine को कभी पता नहीं चलता कि उसकी एक बॉडी घोड़ा है या दूसरी AI-चालित है। वे सब अलग-अलग कंट्रोलर सूचियों वाला वही capsule integrator हैं।</p>
<p>Mounting वह एक हिस्सा है जो जानबूझकर engine के बाहर रहता है। प्लेयर और घोड़े के बीच control अदला-बदली का मतलब है दो engines में तालमेल बिठाना, और एक कंट्रोलर एक engine के अंदर चलता है और उस सीमा के पार नहीं देख सकता, इसलिए mount logic host स्तर पर बैठता है: यह एक छोटी state machine है जो तय करती है कि इस frame में कौन सा engine step किया जाए, दूसरे को फ्रीज़ कर देती है, सवार को तीन-चौथाई सेकंड के एक smoothstep के साथ काठी पर बैठा देती है, और camera को बताती है कि किस बॉडी को track करना है। engine factory को इसके बारे में कभी कुछ नहीं सुनना पड़ता। architecture यही लकीर खींचता है और बनाए रखता है। एक बॉडी से जुड़े behaviors कंट्रोलर्स हैं; बॉडीज़ के बीच तालमेल host का काम है, और उन्हें अलग रखना ही वह वजह है कि एक चौथी या चालीसवीं बॉडी की कोई नई लागत नहीं होगी।</p>
<h2 id="बिना-ब्राउज़र-के-tested" tabindex="-1">बिना ब्राउज़र के tested <a class="header-anchor" href="#बिना-ब्राउज़र-के-tested" aria-label="Permalink to &quot;बिना ब्राउज़र के tested&quot;"></a></h2>
<p>क्योंकि engine न किसी <code>window</code> तक पहुँचता है, न किसी <code>document</code> तक, और न Three.js तक, पूरी चीज़ headless चलती है। स्पाइक एक Node harness के साथ आता है जो terrain interface को mock करता है, scripted input के साथ engine को frame दर frame चलाता है, और परिणामी state पर assert करता है, ताकि वे regressions जिन्हें play-testing से पकड़ना दर्दनाक है, इसके बजाय एक script में पकड़ी जाएँ: jump-and-land transition, swim में घुसने और निकलने की thresholds, surface के समतल होने पर climb का auto-clear होना, stamina के घटने की दरें। वही input और timestep sequence दो बार feed करना और byte-identical output state की जाँच करना engine को deterministic साबित करता है, जो वह गुण है जिस पर एक networked build आखिरकार टिकेगी। harness ने एक regression पकड़ी जो याद रखने लायक है: walkable ज़मीन से एक ऐसी ढलान पर कदम रखना जो walk से ज़्यादा खड़ी थी, पहले slide कंट्रोलर को engage कर देता था और प्लेयर को वापस पहाड़ी पर उछाल देता था। इसका fix एक descent gate था। Sliding तभी शुरू होता है जब capsule सचमुच ढलान पर गिर रहा हो, इसलिए एक खड़ी सतह में horizontally चलना अब saaf-suthre तरीके से रुक जाता है बजाय slide करने के, और वह test जो &quot;एक non-walkable ढलान में चलना प्लेयर को रोकता है&quot; पर assert करता है, इसे fix रखता है।</p>
<h2 id="कंट्रोलर्स-को-छुए-बिना-एक-असली-avatar-plug-करना" tabindex="-1">कंट्रोलर्स को छुए बिना एक असली avatar plug करना <a class="header-anchor" href="#कंट्रोलर्स-को-छुए-बिना-एक-असली-avatar-plug-करना" aria-label="Permalink to &quot;कंट्रोलर्स को छुए बिना एक असली avatar plug करना&quot;"></a></h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/59-pluggable-with-avatar/" title="Spike 59 Pluggable With Avatar" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/59-pluggable-with-avatar/" target="_blank">Spike 59 को नए टैब में खोलें ↗</a> · <a href="/blog/spike-source?spike=59-pluggable-with-avatar">सोर्स देखें</a></p>
<p>स्पाइक 59 इस बात का test है कि क्या कंट्रोलर परत सचमुच बॉडी से decoupled है। यह रंगीन capsule को एक असली skinned कैरेक्टर से बदल देता है, 3MIKE FBX rig जिस पर Quaternius Universal Animation Library clips retargeted हैं, और कंट्रोलर्स बिल्कुल नहीं बदलते। सीवन एक अकेला string है। हर कंट्रोलर पहले से ही <code>stateName</code> के ज़रिए एक state नाम रिपोर्ट करता है, idle, walk, run, jump, fall, land, slide, glide, swim, swimIdle, और avatar परत उस नाम को एक alias table के ज़रिए एक retargeted clip से map करती है और switch पर crossfade करती है। Walk grounded plus vertical velocity plus horizontal speed से अपनी sub-state खुद dynamically चुनता है, इसलिए एक अकेला walk कंट्रोलर idle, walk, run, jump, fall, और land चलाता है, और avatar बस रिपोर्ट किए गए नाम का अनुसरण करता है। क्योंकि यह स्पाइक single-player है, avatar पुराने networked स्पाइक्स से wire-integer indirection और multi-character abstraction को छोड़ देता है और state नाम को सीधे एक clip से map करता है। इसका सबूत यह है कि capsule से rigged इंसान तक का पूरा visual upgrade locomotion code की शून्य लाइनें छूता है, जो ठीक वही है जो एक pluggable कंट्रोलर से मिलना चाहिए।</p>
<h2 id="एक-पैक-जिसे-retargeting-की-ज़रूरत-नहीं-और-एक-picker-जिसे-आप-test-कर-सकते-हैं" tabindex="-1">एक पैक जिसे retargeting की ज़रूरत नहीं, और एक picker जिसे आप test कर सकते हैं <a class="header-anchor" href="#एक-पैक-जिसे-retargeting-की-ज़रूरत-नहीं-और-एक-picker-जिसे-आप-test-कर-सकते-हैं" aria-label="Permalink to &quot;एक पैक जिसे retargeting की ज़रूरत नहीं, और एक picker जिसे आप test कर सकते हैं&quot;"></a></h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/60-polygon-animations/" title="Spike 60 Polygon Animations" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/60-polygon-animations/" target="_blank">Spike 60 को नए टैब में खोलें ↗</a> · <a href="/blog/spike-source?spike=60-polygon-animations">सोर्स देखें</a></p>
<p>स्पाइक 60 एक तीसरी बॉडी plug करता है, Synty का POLYGON Base Locomotion पैक, और loader लगभग कुछ भी नहीं है। हर clip एक standalone FBX के रूप में आता है जो उसी Synty skeleton की एक embedded कॉपी plus एक baked animation साथ लाता है, और क्योंकि कैरेक्टर rig और हर clip समान bone नाम इस्तेमाल करते हैं, आप clip को <code>fbx.animations[0]</code> से उठाते हैं और बिना किसी retargeting library के सीधे कैरेक्टर के mixer पर चला देते हैं। Three.js animation track targets को object identity के बजाय bone नाम से resolve करता है, इसलिए matching rig के सापेक्ष बनाया गया एक Synty या Mixamo-शैली का पैक बस काम कर जाता है। यह पिछले स्पाइक के UAL path के साथ जानबूझकर किया गया विरोधाभास है, जिसे भारी-भरकम retargeting की ज़रूरत है क्योंकि source clips और target rig अलग-अलग skeletons के सापेक्ष बनाए गए थे। वही कंट्रोलर, वही state-name सीवन, उसके पीछे दो पूरी तरह अलग animation pipelines।</p>
<p>स्पाइक 60 का दूसरा आधा हिस्सा clip चुनने वाले logic को testable बनाना है। कौन सा clip चलाना है यह चुनना judgment thresholds से भरा है, और वह logic avatar परत के अंदर FBXLoader और DOM के बगल में दफ़न था जहाँ इसे exercise नहीं किया जा सकता था। स्पाइक picker को pure functions में निकालता है जो न Three.js को छूते हैं न window को: वे एक सादा player record (velocity, horizontal speed, facing, grounded, ground normal, impact velocity) और एक clip-action stand-in लेते हैं, और एक clip alias string लौटाते हैं। इससे thresholds नामित, asserted constants के रूप में रह पाते हैं। Jump walk कंट्रोलर की असली sprint threshold से aligned speed buckets के हिसाब से walking, running, और sprinting variants में बँट जाता है; landings impact velocity के हिसाब से soft, medium, और hard में बँट जाती हैं; uphill और downhill clip variants एक slope-projection dot product से fire होते हैं जिसमें लगभग सात डिग्री से नीचे एक flat-clip deadzone होता है; एक idle-to-locomotion bridge हमेशा आगे की ओर resolve करता है ताकि एक standing start कभी किसी clip को उल्टा न चलाए; और एक stop bridge एक न्यूनतम time-in-loop से gated है, क्योंकि Synty के foot-phase stop clips में लगभग एक सेकंड का authored deceleration होता है जो उस step पर चिपकाए जाने पर हास्यास्पद लगता है जो प्लेयर ने मुश्किल से लिया। एक छोटा state debouncer fall state को कुछ frames के लिए रोके रखता है ताकि एक सीवन के पार एक frame के लिए ज़मीन का संपर्क खोने पर animation झिलमिलाए नहीं। उस सबको rendering shell से बाहर खींचने का मतलब है कि नियमों को बिना GPU के unit test किया जा सकता है, वही headless अनुशासन जो engine को खुद स्पाइक 58 में मिला, जो locomotion के उस अनुभव के बीच का फ़र्क है जिसे आप अंदाज़ा लगाकर tune करते हैं और उस locomotion अनुभव के बीच जिसे आप तय कर सकते हैं।</p>
<h2 id="इस-अध्याय-में-संदर्भित-तकनीक" tabindex="-1">इस अध्याय में संदर्भित तकनीक <a class="header-anchor" href="#इस-अध्याय-में-संदर्भित-तकनीक" aria-label="Permalink to &quot;इस अध्याय में संदर्भित तकनीक&quot;"></a></h2>
<p><strong>एक locomotion-रहित physics engine।</strong> capsule engine एक kinematic body को terrain के सापेक्ष integrate करता है और इसके पास कोई walk, run, jump, friction, speed cap, या gravity नहीं है। हर behavior एक रजिस्टर किया गया कंट्रोलर है जो <code>tick</code>, <code>wantsControl</code>, <code>applyForces</code>, और वैकल्पिक <code>onEnter</code>/<code>onExit</code>/<code>stateName</code> expose करता है। Walk बस सबसे कम priority वाला हमेशा-हाँ default है, और एक कंट्रोलर terrain handling अपने हाथ में लेने के लिए <code>ownsCollision: true</code> लौटा सकता है (swim लौटाता है, ताकि उसका buoyancy spring foot-snap से न लड़े)।</p>
<p><strong>स्वतंत्र arbitration channels।</strong> कंट्रोलर्स नामित channels (resource, stance, locomotion) में रजिस्टर होते हैं जो अलग-अलग arbitrate करते हैं और एक तय क्रम में लागू होते हैं, इसलिए stamina जैसे observers और crouch जैसे modifiers active locomotion के साथ साथ रहते हैं, बजाय control का दिखावा करके उससे इनकार करने के। Resource के writes (stamina) stance और locomotion द्वारा पढ़े जाते हैं; stance के writes (crouch capsule height) locomotion के speed cap द्वारा पढ़े जाते हैं; locomotion आखिर में चलता है और velocity write उसके पास है।</p>
<p><strong>एक factory, कई बॉडीज़।</strong> <code>createCapsuleEngine</code> एक pure factory है जिसमें कोई singletons नहीं, इसलिए वही engine प्लेयर, एक walk-only सवारी करने लायक घोड़े, और synthetic input से खिलाए गए एक खुद-steer करने वाले NPC को चलाता है। एक बॉडी की movement शब्दावली ठीक उसका रजिस्टर किया गया कंट्रोलर सेट है, इसलिए घोड़ा चढ़ या तैर नहीं सकता क्योंकि वे कंट्रोलर्स कभी जोड़े ही नहीं गए। Mounting host स्तर पर रहता है, किसी कंट्रोलर में नहीं, क्योंकि यह दो engines में तालमेल बिठाता है जो एक-दूसरे के पार नहीं देख सकते। देखें <a href="/hi/guides/landscape-generation-browser.html#gpu-driven-lod-with-webgpu">GPU-driven LOD</a>।</p>
<p><strong>Headless, deterministic testing।</strong> engine न किसी <code>window</code>, <code>document</code>, या Three.js को छूता है, इसलिए एक Node harness इसे frame दर frame चलाता है और jump-and-land, swim thresholds, climb auto-clear, और stamina drain पर assert करता है। समान input दो बार replay करना और समान output की जाँच करना determinism साबित करता है, और एक regression test उस descent gate को pin करता है जो एक खड़ी सतह में एक horizontal walk को प्लेयर को पीछे की ओर slide करने से रोकता है।</p>
<p><strong>Testable picker के साथ body-agnostic avatar binding।</strong> कंट्रोलर्स एक state-name string रिपोर्ट करते हैं और visual परत उसे एक clip से map करती है, इसलिए एक capsule को एक retargeted 3MIKE + UAL avatar से बदलना locomotion code की शून्य लाइनें छूता है। Synty POLYGON clips rig के साथ bone नाम साझा करते हैं और बिना retargeting के चलते हैं (Three.js tracks को bone नाम से bind करता है), UAL path की भारी-भरकम retargeting के उलट। clip picker को jump speed buckets, landing severity, slope-projection variants, एक हमेशा-आगे idle bridge, एक stop-bridge न्यूनतम-समय गार्ड, और एक fall-state debouncer के लिए नामित constants वाले pure functions में निकाला गया है, इसलिए locomotion का अनुभव अंदाज़े के बजाय unit-testable है।</p>
<hr>
<p>भाग 29, कुल 30 में से।
पिछला: <a href="/hi/blog/2026-05-14-open-world-browser-part-28-grass-and-occlusion.html">भाग 28 - क्षितिज तक घास, और ऐसी ज़मीन जो खुद को छिपाती है</a>
अगला: <a href="/hi/blog/2026-06-04-open-world-browser-part-30-collision-aware-camera.html">भाग 30 - एक camera जो दीवारों का सम्मान करती है</a>
सीरीज़ गाइड: <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">/hi/blog/2026-02-25-open-world-browser-series-guide</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Browser में open world बनाना, भाग 28: क्षितिज तक घास, और ऐसी ज़मीन जो खुद को छिपा ले]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-05-14-open-world-browser-part-28-grass-and-occlusion</link>
            <guid>https://app.cinevva.com/hi/blog/2026-05-14-open-world-browser-part-28-grass-and-occlusion</guid>
            <pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Spike 56 आधे मिलियन घास के गुच्छों को हरे confetti के बजाय एक मैदान की तरह दिखाता है, एक compute kernel और एक cross-quad तरकीब के साथ। Spike 57 यह जांचने के चार तरीके bench करता है कि कोई पहाड़ी क्या छिपा रही है, और पाता है कि accelerated रास्ता ही geometrically सही रास्ता भी है।]]></description>
            <content:encoded><![CDATA[<h1 id="browser-में-open-world-बनाना-भाग-28-क्षितिज-तक-घास-और-ऐसी-ज़मीन-जो-खुद-को-छिपा-ले" tabindex="-1">Browser में open world बनाना, भाग 28: क्षितिज तक घास, और ऐसी ज़मीन जो खुद को छिपा ले <a class="header-anchor" href="#browser-में-open-world-बनाना-भाग-28-क्षितिज-तक-घास-और-ऐसी-ज़मीन-जो-खुद-को-छिपा-ले" aria-label="Permalink to &quot;Browser में open world बनाना, भाग 28: क्षितिज तक घास, और ऐसी ज़मीन जो खुद को छिपा ले&quot;"></a></h1>
<p><em>लेखक <a href="/hi/about.html">Oleg Sidorkin</a>, Cinevva के CTO और सह-संस्थापक</em></p>
<p>यहां नए हैं? <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">series guide</a> का इस्तेमाल करें। यह बताती है कि spike क्या होता है और सभी भागों को जोड़ती है।</p>
<p><a href="/hi/blog/2026-05-13-open-world-browser-part-27-island-and-terrain.html">भाग 27</a> ने island बनाया और उसे ऐसी ज़मीन दी जो tiled न दिखे। यह भाग उन दो चीज़ों को कवर करता है जो terrain को खाली के बजाय आबाद महसूस कराती हैं। Spike 56 घास है, वह सतह की बारीकी जो एक textured ढलान को ऐसी जगह बना देती है जहां से आप गुज़रना चाहें, और समस्या यह है कि एक मैदान को बिखरी लकीरों के बजाय एक मैदान की तरह दिखाया जाए। Spike 57 ज़्यादा draw करने का उलटा है: यह उस चीज़ को न draw करने के बारे में है जो कोई पहाड़ी पहले से ही छिपा रही है, और दिलचस्प नतीजा यह है कि इसे जांचने का तेज़ तरीका सही तरीका भी निकला।</p>
<h2 id="घास-जो-मैदान-की-तरह-दिखे-confetti-की-तरह-नहीं" tabindex="-1">घास जो मैदान की तरह दिखे, confetti की तरह नहीं <a class="header-anchor" href="#घास-जो-मैदान-की-तरह-दिखे-confetti-की-तरह-नहीं" aria-label="Permalink to &quot;घास जो मैदान की तरह दिखे, confetti की तरह नहीं&quot;"></a></h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/56-grass/" title="Spike 56 Grass" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/56-grass/" target="_blank">Spike 56 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=56-grass">View source</a></p>
<p>मूल फैसला geometric है। एक अकेली पतली नुकीली पत्ती ज़्यादातर camera कोणों से sub-pixel होती है, इसलिए आधे मिलियन सपाट पत्तियां एक मैदान के बजाय बिखरे हुए हरे confetti की तरह दिखती हैं। हल है एक cross-quad गुच्छा: तीन नुकीले quads जो local up axis के चारों ओर साठ डिग्री के अंतर पर घुमाए गए हैं, ताकि किसी भी viewing दिशा से कम से कम एक quad camera के लगभग लंबवत बैठे और हर instance वास्तविक screen क्षेत्र में लगभग तीन पत्ती-चौड़ाई को ढके। यही हरे लकीरें देखने और घास देखने के बीच का फर्क है।</p>
<p>एक WebGPU compute kernel हर गुच्छे को init पर एक बार रखता है। यह instance index को पांच decorrelated random streams में hash करता है, patch के अंदर एक XZ position चुनता है, उसी FBM से ground height sample करता है जिसे CPU ground mesh इस्तेमाल करता है (एक TSL port जिसमें sign-preserving mod है ताकि values बिल्कुल मेल खाएं और पत्तियां सतह पर बैठें न कि ऊपर तैरती रहें), एक central-difference normal लेता है, और हर गुच्छे की एक width, height और hue तय करता है। render की तरफ एक TSL vertex graph है जो instance matrix को पूरी तरह bypass करता है और सीधे clip space में लिखता है: यह unit cross-quad को scale करता है, Rodrigues' formula से local up को ground normal पर घुमाता है, और गुच्छे की position पर translate करता है। Distance LOD बिना किसी culling pass के मुफ्त में मिलता है, क्योंकि vertex graph गुच्छे की height को <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="38.925ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 17204.8 1000" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mn"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(722.2,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(1722.4,0)"><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" style="stroke-width: 3;"/><path data-c="6D" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(394,0)" style="stroke-width: 3;"/><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z" transform="translate(1227,0)" style="stroke-width: 3;"/><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z" transform="translate(1727,0)" style="stroke-width: 3;"/><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" transform="translate(2227,0)" style="stroke-width: 3;"/><path data-c="68" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 124T102 167T103 217T103 272T103 329Q103 366 103 407T103 482T102 542T102 586T102 603Q99 622 88 628T43 637H25V660Q25 683 27 683L37 684Q47 685 66 686T103 688Q120 689 140 690T170 693T181 694H184V367Q244 442 328 442Q451 442 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(2616,0)" style="stroke-width: 3;"/><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" transform="translate(3172,0)" style="stroke-width: 3;"/><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" transform="translate(3566,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(3955,0)" style="stroke-width: 3;"/><path data-c="70" d="M36 -148H50Q89 -148 97 -134V-126Q97 -119 97 -107T97 -77T98 -38T98 6T98 55T98 106Q98 140 98 177T98 243T98 296T97 335T97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 61 434T98 436Q115 437 135 438T165 441T176 442H179V416L180 390L188 397Q247 441 326 441Q407 441 464 377T522 216Q522 115 457 52T310 -11Q242 -11 190 33L182 40V-45V-101Q182 -128 184 -134T195 -145Q216 -148 244 -148H260V-194H252L228 -193Q205 -192 178 -192T140 -191Q37 -191 28 -194H20V-148H36ZM424 218Q424 292 390 347T305 402Q234 402 182 337V98Q222 26 294 26Q345 26 384 80T424 218Z" transform="translate(4399,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(6677.4,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(7066.4,0)"><path data-c="66" d="M273 0Q255 3 146 3Q43 3 34 0H26V46H42Q70 46 91 49Q99 52 103 60Q104 62 104 224V385H33V431H104V497L105 564L107 574Q126 639 171 668T266 704Q267 704 275 704T289 705Q330 702 351 679T372 627Q372 604 358 590T321 576T284 590T270 627Q270 647 288 667H284Q280 668 273 668Q245 668 223 647T189 592Q183 572 182 497V431H293V385H185V225Q185 63 186 61T189 57T194 54T199 51T206 49T213 48T222 47T231 47T241 46T251 46H282V0H273Z" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(306,0)" style="stroke-width: 3;"/><path data-c="64" d="M376 495Q376 511 376 535T377 568Q377 613 367 624T316 637H298V660Q298 683 300 683L310 684Q320 685 339 686T376 688Q393 689 413 690T443 693T454 694H457V390Q457 84 458 81Q461 61 472 55T517 46H535V0Q533 0 459 -5T380 -11H373V44L365 37Q307 -11 235 -11Q158 -11 96 50T34 215Q34 315 97 378T244 442Q319 442 376 393V495ZM373 342Q328 405 260 405Q211 405 173 369Q146 341 139 305T131 211Q131 155 138 120T173 59Q203 26 251 26Q322 26 373 103V342Z" transform="translate(806,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(1362,0)" style="stroke-width: 3;"/><path data-c="4E" d="M42 46Q74 48 94 56T118 69T128 86V634H124Q114 637 52 637H25V683H232L235 680Q237 679 322 554T493 303L578 178V598Q572 608 568 613T544 627T492 637H475V683H483Q498 680 600 680Q706 680 715 683H724V637H707Q634 633 622 598L621 302V6L614 0H600Q585 0 582 3T481 150T282 443T171 605V345L172 86Q183 50 257 46H274V0H265Q250 3 150 3Q48 3 33 0H25V46H42Z" transform="translate(1806,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(2556,0)" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(3000,0)" style="stroke-width: 3;"/><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(3500,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(10958.4,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(11403.1,0)"><path data-c="66" d="M273 0Q255 3 146 3Q43 3 34 0H26V46H42Q70 46 91 49Q99 52 103 60Q104 62 104 224V385H33V431H104V497L105 564L107 574Q126 639 171 668T266 704Q267 704 275 704T289 705Q330 702 351 679T372 627Q372 604 358 590T321 576T284 590T270 627Q270 647 288 667H284Q280 668 273 668Q245 668 223 647T189 592Q183 572 182 497V431H293V385H185V225Q185 63 186 61T189 57T194 54T199 51T206 49T213 48T222 47T231 47T241 46T251 46H282V0H273Z" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(306,0)" style="stroke-width: 3;"/><path data-c="64" d="M376 495Q376 511 376 535T377 568Q377 613 367 624T316 637H298V660Q298 683 300 683L310 684Q320 685 339 686T376 688Q393 689 413 690T443 693T454 694H457V390Q457 84 458 81Q461 61 472 55T517 46H535V0Q533 0 459 -5T380 -11H373V44L365 37Q307 -11 235 -11Q158 -11 96 50T34 215Q34 315 97 378T244 442Q319 442 376 393V495ZM373 342Q328 405 260 405Q211 405 173 369Q146 341 139 305T131 211Q131 155 138 120T173 59Q203 26 251 26Q322 26 373 103V342Z" transform="translate(806,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(1362,0)" style="stroke-width: 3;"/><path data-c="46" d="M128 619Q121 626 117 628T101 631T58 634H25V680H582V676Q584 670 596 560T610 444V440H570V444Q563 493 561 501Q555 538 543 563T516 601T477 622T431 631T374 633H334H286Q252 633 244 631T233 621Q232 619 232 490V363H284Q287 363 303 363T327 364T349 367T372 373T389 385Q407 403 410 459V480H450V200H410V221Q407 276 389 296Q381 303 371 307T348 313T327 316T303 317T284 317H232V189L233 61Q240 54 245 52T270 48T333 46H360V0H348Q324 3 182 3Q51 3 36 0H25V46H58Q100 47 109 49T128 61V619Z" transform="translate(1806,0)" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(2459,0)" style="stroke-width: 3;"/><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(2959,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(14754.1,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(15198.8,0)"><path data-c="64" d="M376 495Q376 511 376 535T377 568Q377 613 367 624T316 637H298V660Q298 683 300 683L310 684Q320 685 339 686T376 688Q393 689 413 690T443 693T454 694H457V390Q457 84 458 81Q461 61 472 55T517 46H535V0Q533 0 459 -5T380 -11H373V44L365 37Q307 -11 235 -11Q158 -11 96 50T34 215Q34 315 97 378T244 442Q319 442 376 393V495ZM373 342Q328 405 260 405Q211 405 173 369Q146 341 139 305T131 211Q131 155 138 120T173 59Q203 26 251 26Q322 26 373 103V342Z" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(556,0)" style="stroke-width: 3;"/><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" transform="translate(834,0)" style="stroke-width: 3;"/><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" transform="translate(1228,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(16815.8,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn><mo>−</mo><mtext>smoothstep</mtext><mo stretchy="false">(</mo><mtext>fadeNear</mtext><mo>,</mo><mtext>fadeFar</mtext><mo>,</mo><mtext>dist</mtext><mo stretchy="false">)</mo></math></mjx-assistive-mml></mjx-container> से गुणा करता है, इसलिए दूर के गुच्छे शून्य height तक सपाट हो जाते हैं और fill पर खर्च होना बंद कर देते हैं। हवा गुच्छे के world XZ और time पर sin और cos के दो octaves हैं, जो horizontally लगाई जाती है और height fraction से gated होती है ताकि आधार जगह पर टिका रहे जबकि सिरे हिलें, और एक नन्हा camera-aware झुकाव हर गुच्छे को देखने वाले की ओर झुकाता है ताकि वे सपाट cards की तरह दिखने के बजाय perspectivally खुलें।</p>
<p>रंग का नुस्खा NedMakesGames के Breath of the Wild URP shader से लिया गया है: flat shading जिसमें पत्ती का रंग height fraction के साथ एक root tone से tip tone तक का lerp है, जहां root और tip tones खुद हर गुच्छे की hue value से दो palettes के बीच lerp होते हैं। इससे वह चितकबरा दो-रंगी रूप मिलता है जो असली BotW घास के मैदान का होता है। Diffuse सूरज के सामने ground normal को एक ambient floor के साथ इस्तेमाल करता है, क्योंकि cross-quad के per-quad normals एक stylized रूप के लिए अलग-अलग shade करने को लेकर बहुत noisy हैं। पूरा मैदान एक draw है, जो पूरी तरह GPU पर रखा और animate किया गया है।</p>
<h2 id="कोई-पहाड़ी-क्या-छिपा-रही-है-उसे-cull-करने-के-चार-तरीके" tabindex="-1">कोई पहाड़ी क्या छिपा रही है, उसे cull करने के चार तरीके <a class="header-anchor" href="#कोई-पहाड़ी-क्या-छिपा-रही-है-उसे-cull-करने-के-चार-तरीके" aria-label="Permalink to &quot;कोई पहाड़ी क्या छिपा रही है, उसे cull करने के चार तरीके&quot;"></a></h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/57-terrain-occlusion/" title="Spike 57 Terrain Occlusion" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/57-terrain-occlusion/" target="_blank">Spike 57 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=57-terrain-occlusion">View source</a></p>
<p>Spike 57 उसी procedural world पर चार culling रास्ते bench करता है जिसे production client stream करता है, vertically 1.8x scale किया हुआ ताकि पहाड़ियां सचमुच foliage को occlude करें। T0 केवल distance पर है, उससे मेल खाता हुआ जो shipping chunk visibility पहले से करती है। T1 frustum culling जोड़ता है, सबसे बड़ी सस्ती जीत, जो view cone के बाहर की हर चीज़ हटा देती है। T2 एक terrain-aware horizon test जोड़ता है: आंख से हर instance तक एक ray march करो और उसे reject कर दो अगर heightmap रास्ते में कहीं भी ray से ऊपर उठती है, ताकि किसी ridge के पीछे का पेड़ cull हो जाए भले ही वह frustum के अंदर हो। T3 वही horizon test रखता है पर उसे एक max-height pyramid से accelerate करता है, और T4 पूरे distance-plus-frustum-plus-horizon test को एक TSL compute kernel में port करता है जो हर instance के लिए एक visibility scale लिखता है जिसे foliage material पढ़कर छिपे हुए vertices को collapse करता है। एक two-frame stay-visible counter उस single-frame झिलमिलाहट को smooth करता है जब camera हल्का हिलने पर कोई sample point किसी texel के ठीक अंदर या बाहर गिरता है, जिसे जानबूझकर छोटा रखा गया है क्योंकि इससे लंबा कुछ भी algorithmic bugs को ठीक करने के बजाय छिपा देता है।</p>
<p>pyramid वही जगह है जहां spike अपनी कीमत वसूल करता है, और सबक यह है कि test को उससे मिलाओ जो वास्तव में screen पर है। rendered terrain एक triangle mesh है जिसके vertices एक तय दो-मीटर grid पर हैं, और vertices के बीच rasterizer linearly interpolate करता है, इसलिए किसी भी rectangle के अंदर असली rendered height उसके अंदर के vertices का max है, कभी भी उनके बीच का continuous noise peak नहीं। अगर occlusion pyramid noise को किसी बारीक grid पर sample करे, तो उसे ऐसे phantom peaks मिलते हैं जो mesh कभी दिखाती ही नहीं और वह उन rays को block करने लगती है जिनके आर-पार camera साफ देख सकता है। इसलिए pyramid के base texels बिल्कुल vertex grid पर बैठते हैं, हर एक अपने चार कोने vertices का max store करता है, और ऊपरी levels पाठ्यपुस्तक जैसे 2x2 max reductions हैं, जो इसे rendered mesh के संबंध में exact बनाता है। per-step ray test के लिए code जानबूझकर mesh को bilinear interpolation से point-sample करता है, pyramid से query करने के बजाय, क्योंकि एक sub-texel AABB query पूरे texel का max लौटाती है और तीखी ridges पर height को कई मीटर बढ़ा देती है, और यही वह over-occlusion है जो दिखने वाले props को छिपा देगी।</p>
<p>चौंकाने वाला नतीजा यह है कि T2, brute-force reference, ही गलत वाला है। क्योंकि T2 सीधे continuous noise को point-sample करता है, यह mesh vertices के बीच के ऐसे peaks पकड़ लेता है जो render नहीं होते, इसलिए यह थोड़ा over-occlude करता है और उस foliage को छिपा देता है जिसे player सचमुच देख सकता है। pyramid रास्ता दोनों है, तेज़ भी, chunk-level tests के लिए <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="8.764ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 3873.7 1000" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D442" d="M740 435Q740 320 676 213T511 42T304 -22Q207 -22 138 35T51 201Q50 209 50 244Q50 346 98 438T227 601Q351 704 476 704Q514 704 524 703Q621 689 680 617T740 435ZM637 476Q637 565 591 615T476 665Q396 665 322 605Q242 542 200 428T157 216Q157 126 200 73T314 19Q404 19 485 98T608 313Q637 408 637 476Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(763,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(1152,0)"><path data-c="6C" d="M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z" style="stroke-width: 3;"/><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z" transform="translate(278,0)" style="stroke-width: 3;"/><path data-c="67" d="M329 409Q373 453 429 453Q459 453 472 434T485 396Q485 382 476 371T449 360Q416 360 412 390Q410 404 415 411Q415 412 416 414V415Q388 412 363 393Q355 388 355 386Q355 385 359 381T368 369T379 351T388 325T392 292Q392 230 343 187T222 143Q172 143 123 171Q112 153 112 133Q112 98 138 81Q147 75 155 75T227 73Q311 72 335 67Q396 58 431 26Q470 -13 470 -72Q470 -139 392 -175Q332 -206 250 -206Q167 -206 107 -175Q29 -140 29 -75Q29 -39 50 -15T92 18L103 24Q67 55 67 108Q67 155 96 193Q52 237 52 292Q52 355 102 398T223 442Q274 442 318 416L329 409ZM299 343Q294 371 273 387T221 404Q192 404 171 388T145 343Q142 326 142 292Q142 248 149 227T179 192Q196 182 222 182Q244 182 260 189T283 207T294 227T299 242Q302 258 302 292T299 343ZM403 -75Q403 -50 389 -34T348 -11T299 -2T245 0H218Q151 0 138 -6Q118 -15 107 -34T95 -74Q95 -84 101 -97T122 -127T170 -155T250 -167Q319 -167 361 -139T403 -75Z" transform="translate(778,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(2430,0)"><path data-c="2061" d="" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(2596.7,0)"><path data-c="1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(3484.7,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>O</mi><mo stretchy="false">(</mo><mi>log</mi><mo data-mjx-texclass="NONE">⁡</mo><mi>N</mi><mo stretchy="false">)</mo></math></mjx-assistive-mml></mjx-container> AABB reduction की वजह से, और geometrically ज़्यादा सही भी, क्योंकि यह केवल वही heights लौटा सकता है जिन्हें mesh सचमुच दिखाती है। यही spike का पूरा मतलब है: accelerated structure कोई quality समझौता नहीं है जिसे आप speed के लिए मान लेते हैं, यह वह version है जो हकीकत से मेल खाता है। Chunk culling हर chunk पर एक पांच-बिंदु test चलाता है (chunk की max height पर चार ऊपरी कोने और केंद्र) और हर chunk के अपने footprint को occluder set से बाहर रखता है ताकि कोई chunk खुद को कभी occlude न करे। अनुशंसित production रास्ता T4 है: instance metadata और height field को storage buffers में push करो और एक compute shader में indirect draw के साथ वही loop चलाओ, क्योंकि renderer वैसे भी WebGPU की ओर बढ़ रहा है।</p>
<h2 id="इस-अध्याय-में-संदर्भित-technology" tabindex="-1">इस अध्याय में संदर्भित technology <a class="header-anchor" href="#इस-अध्याय-में-संदर्भित-technology" aria-label="Permalink to &quot;इस अध्याय में संदर्भित technology&quot;"></a></h2>
<p><strong>Cross-quad GPU घास।</strong> हर गुच्छे में साठ डिग्री के अंतर पर घुमाए गए तीन नुकीले quads किसी भी कोण से एक लगभग-लंबवत quad की गारंटी देते हैं, ताकि आधा मिलियन instances एक मैदान की तरह दिखें न कि sub-pixel confetti। एक compute kernel हर गुच्छे को रखता है (FBM ground height उसी sign-preserving mod से sample की गई जो CPU mesh इस्तेमाल करता है, central-difference normal, हर गुच्छे की size और hue), और एक TSL vertex graph instance matrix को bypass करके scale, normal पर Rodrigues-rotate, translate, और height-gated हवा लगाता है। Distance LOD मुफ्त है: गुच्छे <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="38.925ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 17204.8 1000" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mn"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(722.2,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(1722.4,0)"><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" style="stroke-width: 3;"/><path data-c="6D" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(394,0)" style="stroke-width: 3;"/><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z" transform="translate(1227,0)" style="stroke-width: 3;"/><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z" transform="translate(1727,0)" style="stroke-width: 3;"/><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" transform="translate(2227,0)" style="stroke-width: 3;"/><path data-c="68" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 124T102 167T103 217T103 272T103 329Q103 366 103 407T103 482T102 542T102 586T102 603Q99 622 88 628T43 637H25V660Q25 683 27 683L37 684Q47 685 66 686T103 688Q120 689 140 690T170 693T181 694H184V367Q244 442 328 442Q451 442 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(2616,0)" style="stroke-width: 3;"/><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" transform="translate(3172,0)" style="stroke-width: 3;"/><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" transform="translate(3566,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(3955,0)" style="stroke-width: 3;"/><path data-c="70" d="M36 -148H50Q89 -148 97 -134V-126Q97 -119 97 -107T97 -77T98 -38T98 6T98 55T98 106Q98 140 98 177T98 243T98 296T97 335T97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 61 434T98 436Q115 437 135 438T165 441T176 442H179V416L180 390L188 397Q247 441 326 441Q407 441 464 377T522 216Q522 115 457 52T310 -11Q242 -11 190 33L182 40V-45V-101Q182 -128 184 -134T195 -145Q216 -148 244 -148H260V-194H252L228 -193Q205 -192 178 -192T140 -191Q37 -191 28 -194H20V-148H36ZM424 218Q424 292 390 347T305 402Q234 402 182 337V98Q222 26 294 26Q345 26 384 80T424 218Z" transform="translate(4399,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(6677.4,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(7066.4,0)"><path data-c="66" d="M273 0Q255 3 146 3Q43 3 34 0H26V46H42Q70 46 91 49Q99 52 103 60Q104 62 104 224V385H33V431H104V497L105 564L107 574Q126 639 171 668T266 704Q267 704 275 704T289 705Q330 702 351 679T372 627Q372 604 358 590T321 576T284 590T270 627Q270 647 288 667H284Q280 668 273 668Q245 668 223 647T189 592Q183 572 182 497V431H293V385H185V225Q185 63 186 61T189 57T194 54T199 51T206 49T213 48T222 47T231 47T241 46T251 46H282V0H273Z" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(306,0)" style="stroke-width: 3;"/><path data-c="64" d="M376 495Q376 511 376 535T377 568Q377 613 367 624T316 637H298V660Q298 683 300 683L310 684Q320 685 339 686T376 688Q393 689 413 690T443 693T454 694H457V390Q457 84 458 81Q461 61 472 55T517 46H535V0Q533 0 459 -5T380 -11H373V44L365 37Q307 -11 235 -11Q158 -11 96 50T34 215Q34 315 97 378T244 442Q319 442 376 393V495ZM373 342Q328 405 260 405Q211 405 173 369Q146 341 139 305T131 211Q131 155 138 120T173 59Q203 26 251 26Q322 26 373 103V342Z" transform="translate(806,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(1362,0)" style="stroke-width: 3;"/><path data-c="4E" d="M42 46Q74 48 94 56T118 69T128 86V634H124Q114 637 52 637H25V683H232L235 680Q237 679 322 554T493 303L578 178V598Q572 608 568 613T544 627T492 637H475V683H483Q498 680 600 680Q706 680 715 683H724V637H707Q634 633 622 598L621 302V6L614 0H600Q585 0 582 3T481 150T282 443T171 605V345L172 86Q183 50 257 46H274V0H265Q250 3 150 3Q48 3 33 0H25V46H42Z" transform="translate(1806,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(2556,0)" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(3000,0)" style="stroke-width: 3;"/><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(3500,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(10958.4,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(11403.1,0)"><path data-c="66" d="M273 0Q255 3 146 3Q43 3 34 0H26V46H42Q70 46 91 49Q99 52 103 60Q104 62 104 224V385H33V431H104V497L105 564L107 574Q126 639 171 668T266 704Q267 704 275 704T289 705Q330 702 351 679T372 627Q372 604 358 590T321 576T284 590T270 627Q270 647 288 667H284Q280 668 273 668Q245 668 223 647T189 592Q183 572 182 497V431H293V385H185V225Q185 63 186 61T189 57T194 54T199 51T206 49T213 48T222 47T231 47T241 46T251 46H282V0H273Z" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(306,0)" style="stroke-width: 3;"/><path data-c="64" d="M376 495Q376 511 376 535T377 568Q377 613 367 624T316 637H298V660Q298 683 300 683L310 684Q320 685 339 686T376 688Q393 689 413 690T443 693T454 694H457V390Q457 84 458 81Q461 61 472 55T517 46H535V0Q533 0 459 -5T380 -11H373V44L365 37Q307 -11 235 -11Q158 -11 96 50T34 215Q34 315 97 378T244 442Q319 442 376 393V495ZM373 342Q328 405 260 405Q211 405 173 369Q146 341 139 305T131 211Q131 155 138 120T173 59Q203 26 251 26Q322 26 373 103V342Z" transform="translate(806,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(1362,0)" style="stroke-width: 3;"/><path data-c="46" d="M128 619Q121 626 117 628T101 631T58 634H25V680H582V676Q584 670 596 560T610 444V440H570V444Q563 493 561 501Q555 538 543 563T516 601T477 622T431 631T374 633H334H286Q252 633 244 631T233 621Q232 619 232 490V363H284Q287 363 303 363T327 364T349 367T372 373T389 385Q407 403 410 459V480H450V200H410V221Q407 276 389 296Q381 303 371 307T348 313T327 316T303 317T284 317H232V189L233 61Q240 54 245 52T270 48T333 46H360V0H348Q324 3 182 3Q51 3 36 0H25V46H58Q100 47 109 49T128 61V619Z" transform="translate(1806,0)" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(2459,0)" style="stroke-width: 3;"/><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(2959,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(14754.1,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(15198.8,0)"><path data-c="64" d="M376 495Q376 511 376 535T377 568Q377 613 367 624T316 637H298V660Q298 683 300 683L310 684Q320 685 339 686T376 688Q393 689 413 690T443 693T454 694H457V390Q457 84 458 81Q461 61 472 55T517 46H535V0Q533 0 459 -5T380 -11H373V44L365 37Q307 -11 235 -11Q158 -11 96 50T34 215Q34 315 97 378T244 442Q319 442 376 393V495ZM373 342Q328 405 260 405Q211 405 173 369Q146 341 139 305T131 211Q131 155 138 120T173 59Q203 26 251 26Q322 26 373 103V342Z" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(556,0)" style="stroke-width: 3;"/><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" transform="translate(834,0)" style="stroke-width: 3;"/><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" transform="translate(1228,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(16815.8,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn><mo>−</mo><mtext>smoothstep</mtext><mo stretchy="false">(</mo><mtext>fadeNear</mtext><mo>,</mo><mtext>fadeFar</mtext><mo>,</mo><mtext>dist</mtext><mo stretchy="false">)</mo></math></mjx-assistive-mml></mjx-container> से शून्य height तक collapse हो जाते हैं। रंग NedMakesGames के BotW नुस्खे का अनुसरण करता है, दो hue-mixed palettes पर एक root-to-tip gradient। देखें <a href="/hi/guides/landscape-generation-browser.html#gpu-driven-lod-with-webgpu">GPU-driven LOD</a>।</p>
<p><strong>Terrain horizon occlusion culling।</strong> production world पर चार bench किए गए रास्ते: distance, साथ में frustum, साथ में एक heightmap ray test जो किसी ridge के पीछे के instances को reject करता है, साथ में एक max-height pyramid जो इसे accelerate करता है, साथ में एक TSL compute port। pyramid उसी exact दो-मीटर vertex grid पर sample करता है जिस पर mesh tessellate करता है (base texel = चार कोने vertices का max, ऊपर की ओर 2x2 max-reduce), इसलिए यह केवल वही heights लौटाता है जिन्हें rasterizer सचमुच दिखाता है।</p>
<p><strong>Accelerated और सही, कोई सौदा नहीं।</strong> Continuous noise को point-sample करना (brute-force T2 रास्ता) mesh vertices के बीच ऐसे peaks ढूंढ लेता है जो कभी render नहीं होते, दिखने वाले foliage को over-occlude करता है। vertex-grid pyramid दोनों है, तेज़ (<mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="8.764ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 3873.7 1000" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D442" d="M740 435Q740 320 676 213T511 42T304 -22Q207 -22 138 35T51 201Q50 209 50 244Q50 346 98 438T227 601Q351 704 476 704Q514 704 524 703Q621 689 680 617T740 435ZM637 476Q637 565 591 615T476 665Q396 665 322 605Q242 542 200 428T157 216Q157 126 200 73T314 19Q404 19 485 98T608 313Q637 408 637 476Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(763,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(1152,0)"><path data-c="6C" d="M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z" style="stroke-width: 3;"/><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z" transform="translate(278,0)" style="stroke-width: 3;"/><path data-c="67" d="M329 409Q373 453 429 453Q459 453 472 434T485 396Q485 382 476 371T449 360Q416 360 412 390Q410 404 415 411Q415 412 416 414V415Q388 412 363 393Q355 388 355 386Q355 385 359 381T368 369T379 351T388 325T392 292Q392 230 343 187T222 143Q172 143 123 171Q112 153 112 133Q112 98 138 81Q147 75 155 75T227 73Q311 72 335 67Q396 58 431 26Q470 -13 470 -72Q470 -139 392 -175Q332 -206 250 -206Q167 -206 107 -175Q29 -140 29 -75Q29 -39 50 -15T92 18L103 24Q67 55 67 108Q67 155 96 193Q52 237 52 292Q52 355 102 398T223 442Q274 442 318 416L329 409ZM299 343Q294 371 273 387T221 404Q192 404 171 388T145 343Q142 326 142 292Q142 248 149 227T179 192Q196 182 222 182Q244 182 260 189T283 207T294 227T299 242Q302 258 302 292T299 343ZM403 -75Q403 -50 389 -34T348 -11T299 -2T245 0H218Q151 0 138 -6Q118 -15 107 -34T95 -74Q95 -84 101 -97T122 -127T170 -155T250 -167Q319 -167 361 -139T403 -75Z" transform="translate(778,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(2430,0)"><path data-c="2061" d="" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(2596.7,0)"><path data-c="1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(3484.7,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>O</mi><mo stretchy="false">(</mo><mi>log</mi><mo data-mjx-texclass="NONE">⁡</mo><mi>N</mi><mo stretchy="false">)</mo></math></mjx-assistive-mml></mjx-container> AABB reduction) और geometrically exact, इसलिए per-step ray tests pyramid के per-texel max से query करने के बजाय mesh को bilinear-sample करते हैं, जो तीखी ridges पर heights को मीटरों बढ़ा देता। Chunk culling एक पांच-बिंदु test इस्तेमाल करता है और हर chunk के अपने footprint को बाहर रखता है ताकि वह खुद को कभी self-occlude न करे। production रास्ता metadata और height field को storage buffers में push करता है, indirect draw के साथ एक compute-shader cull के लिए।</p>
<hr>
<p>भाग 28, कुल 29 में से।
पिछला: <a href="/hi/blog/2026-05-13-open-world-browser-part-27-island-and-terrain.html">भाग 27 - noise से बना एक island, ऐसी ज़मीन जो ज़मीन जैसी दिखे</a>
अगला: <a href="/hi/blog/2026-05-15-open-world-browser-part-29-pluggable-character.html">भाग 29 - एक controller, कोई भी body</a>
Series guide: <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">/hi/blog/2026-02-25-open-world-browser-series-guide</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Browser में open world बनाना, भाग 27: noise से बना एक island, ऐसी ज़मीन जो ज़मीन जैसी दिखे]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-05-13-open-world-browser-part-27-island-and-terrain</link>
            <guid>https://app.cinevva.com/hi/blog/2026-05-13-open-world-browser-part-27-island-and-terrain</guid>
            <pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Spike 54 अकेले noise से एक भरोसेमंद island उगाता है: एक radial falloff से shape दिए गए domain-warped FBM, फिर hydraulic erosion जो असली drainage काटता है, फिर elevation और moisture से तय किए गए biomes. Spike 55 texture की सबसे पुरानी समस्या को ठीक करता है, यानी वह tile जो दोहराता रहता है, चार sampling modes और उस एक मोड के साथ जो सचमुच जीतता है.]]></description>
            <content:encoded><![CDATA[<h1 id="browser-में-open-world-बनाना-भाग-27-noise-से-बना-एक-island-ऐसी-ज़मीन-जो-ज़मीन-जैसी-दिखे" tabindex="-1">Browser में open world बनाना, भाग 27: noise से बना एक island, ऐसी ज़मीन जो ज़मीन जैसी दिखे <a class="header-anchor" href="#browser-में-open-world-बनाना-भाग-27-noise-से-बना-एक-island-ऐसी-ज़मीन-जो-ज़मीन-जैसी-दिखे" aria-label="Permalink to &quot;Browser में open world बनाना, भाग 27: noise से बना एक island, ऐसी ज़मीन जो ज़मीन जैसी दिखे&quot;"></a></h1>
<p><em>लेखक <a href="/hi/about.html">Oleg Sidorkin</a>, Cinevva के CTO और सह-संस्थापक</em></p>
<p>यहां नए हैं? <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">series guide</a> का इस्तेमाल करें। यह बताती है कि spike क्या होता है और सभी भागों को जोड़ती है।</p>
<p><a href="/hi/blog/2026-05-12-open-world-browser-part-26-water.html">भाग 26</a> ने world पर पानी रखा। यह भाग उसके नीचे की ज़मीन बनाता है, दो चरणों में जो इस बात का अक्स हैं कि कोई असली जगह कैसे बनती है। Spike 54 खुद terrain है: हाथ से नहीं गढ़ा गया बल्कि noise से उगाया गया, फिर तब तक मौसम और कटाव झेलता रहा जब तक उसमें वैसी drainage और coastline न आ गई जैसी किसी ऐसी जगह की होती है जहां सचमुच पानी बहा हो। Spike 55 उस terrain की त्वचा है: उस समस्या को हल करना जो लगभग हर procedural ज़मीन को हरा देती है, यानी कि एक tiled texture tiled ही दिखती है। दोनों मिलकर एक सवाल का जवाब देते हैं, क्या कोई creator बिना किसी artist के छुए एक भरोसेमंद island और ऐसी ज़मीन पा सकता है जो ज़मीन जैसी पढ़ी जाए, और जवाब है हां, बशर्ते आप सही recipes की नकल करें।</p>
<h2 id="एक-coastline-जो-अकेला-noise-आपको-नहीं-देगा" tabindex="-1">एक coastline जो अकेला noise आपको नहीं देगा <a class="header-anchor" href="#एक-coastline-जो-अकेला-noise-आपको-नहीं-देगा" aria-label="Permalink to &quot;एक coastline जो अकेला noise आपको नहीं देगा&quot;"></a></h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/54-procgen-island/" title="Spike 54 Procedural Island" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/54-procgen-island/" target="_blank">Spike 54 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=54-procgen-island">Source देखें</a></p>
<p>Heightmap, Red Blob Games की recipes का अनुसरण करता है, जो छोटे-छोटे transforms का एक ढेर हैं और हर एक raw noise की किसी खास खामी को ठीक करता है। Fractional Brownian motion, Perlin noise के कई octaves को जोड़ता है ताकि terrain में चौड़ी पहाड़ियां और बारीक detail दोनों हों, लेकिन सादा FBM नरम और grid के साथ संरेखित दिखता है, इसलिए sample point को पहले domain-warp किया जाता है: आप हर coordinate को एक और noise field से खिसकाते हैं, <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="19.194ex" height="2.283ex" role="img" focusable="false" viewBox="0 -759 8483.9 1009" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msup"><g data-mml-node="mi"><path data-c="1D45D" d="M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(536,363) scale(0.707)"><path data-c="2032" d="M79 43Q73 43 52 49T30 61Q30 68 85 293T146 528Q161 560 198 560Q218 560 240 545T262 501Q262 496 260 486Q259 479 173 263T84 45T79 43Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(1058.2,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(2114,0)"><path data-c="1D45D" d="M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(2839.2,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(3839.5,0)"><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" style="stroke-width: 3;"/><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z" transform="translate(556,0)" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(1056,0)" style="stroke-width: 3;"/><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" transform="translate(1334,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(1728,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(6011.5,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(6400.5,0)"><path data-c="1D45D" d="M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(6903.5,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(7514.7,0)"><path data-c="22C5" d="M78 250Q78 274 95 292T138 310Q162 310 180 294T199 251Q199 226 182 208T139 190T96 207T78 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(8014.9,0)"><path data-c="1D460" d="M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><msup><mi>p</mi><mo data-mjx-alternate="1">′</mo></msup><mo>=</mo><mi>p</mi><mo>+</mo><mtext>noise</mtext><mo stretchy="false">(</mo><mi>p</mi><mo stretchy="false">)</mo><mo>⋅</mo><mi>s</mi></math></mjx-assistive-mml></mjx-container>, जो ridges को axis पर बंधे होने के बजाय कुछ organic रूप में मोड़ देता है। फिर redistribution, elevation को एक power <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="2.453ex" height="1.956ex" role="img" focusable="false" viewBox="0 -853.7 1084.4 864.7" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msup"><g data-mml-node="mi"><path data-c="1D452" d="M39 168Q39 225 58 272T107 350T174 402T244 433T307 442H310Q355 442 388 420T421 355Q421 265 310 237Q261 224 176 223Q139 223 138 221Q138 219 132 186T125 128Q125 81 146 54T209 26T302 45T394 111Q403 121 406 121Q410 121 419 112T429 98T420 82T390 55T344 24T281 -1T205 -11Q126 -11 83 42T39 168ZM373 353Q367 405 305 405Q272 405 244 391T199 357T170 316T154 280T149 261Q149 260 169 260Q282 260 327 284T373 353Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" transform="translate(499,363) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mstyle" transform="scale(1.414)"><g data-mml-node="mspace"/></g><g data-mml-node="mi" transform="translate(236.2,0)"><path data-c="1D458" d="M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z" style="stroke-width: 3;"/></g></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><msup><mi>e</mi><mrow data-mjx-texclass="ORD"><mstyle scriptlevel="0"><mspace width="0.167em"/></mstyle><mi>k</mi></mrow></msup></math></mjx-assistive-mml></mjx-container> तक उठाना, midtones को नीचे धकेलता है ताकि world में सपाट घाटियां और तीखी चोटियां हों, बजाय इसके कि सब कुछ एक ही हल्की ढलान पर बैठा रहे। वह हिस्सा जो इसे अंतहीन पहाड़ियों के बजाय एक island बनाता है, वह है radial falloff: केंद्र से euclidean दूरी निकालें, <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -1.467ex;" xmlns="http://www.w3.org/2000/svg" width="21.741ex" height="4.208ex" role="img" focusable="false" viewBox="0 -1211.5 9609.7 1860" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(797.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(1853.6,0)"><path data-c="6D" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(833,0)" style="stroke-width: 3;"/><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(1111,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(3520.6,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(3909.6,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(4409.6,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="msqrt" transform="translate(4854.2,0)"><g transform="translate(1020,0)"><g data-mml-node="msubsup"><g data-mml-node="mi"><path data-c="1D45B" d="M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(633,289) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(633,-247) scale(0.707)"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(1309.7,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msubsup" transform="translate(2309.9,0)"><g data-mml-node="mi"><path data-c="1D45B" d="M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(633,289) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(633,-247) scale(0.707)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g></g></g><g data-mml-node="mo" transform="translate(0,1.5)"><path data-c="221A" d="M1001 1150Q1017 1150 1020 1132Q1020 1127 741 244L460 -643Q453 -650 436 -650H424Q423 -647 423 -645T421 -640T419 -631T415 -617T408 -594T399 -560T385 -512T367 -448T343 -364T312 -259L203 119L138 41L111 67L212 188L264 248L472 -474L983 1140Q988 1150 1001 1150Z" style="stroke-width: 3;"/></g><rect width="3346.5" height="60" x="1020" y="1091.5"/></g><g data-mml-node="mo" transform="translate(9220.7,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>d</mi><mo>=</mo><mo data-mjx-texclass="OP" movablelimits="true">min</mo><mo stretchy="false">(</mo><mn>1</mn><mo>,</mo><msqrt><msubsup><mi>n</mi><mi>x</mi><mn>2</mn></msubsup><mo>+</mo><msubsup><mi>n</mi><mi>y</mi><mn>2</mn></msubsup></msqrt><mo stretchy="false">)</mo></math></mjx-assistive-mml></mjx-container>, और elevation को <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.186ex;" xmlns="http://www.w3.org/2000/svg" width="5.073ex" height="1.756ex" role="img" focusable="false" viewBox="0 -694 2242.4 776" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mn"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(722.2,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(1722.4,0)"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn><mo>−</mo><mi>d</mi></math></mjx-assistive-mml></mjx-container> की ओर blend करें ताकि terrain किनारों पर समुद्र में उतर जाए। एक दूसरा स्वतंत्र noise field एक moisture map बन जाता है, जो shape के लिए कुछ नहीं करता मगर बाद में biome चरण को feed करता है।</p>
<p>इससे आपको एक shape मिल जाता है, लेकिन वह noise का shape है। इसमें कोई नदियां नहीं हैं, पानी से कटी कोई घाटियां नहीं, कोई sediment fans नहीं, क्योंकि इस पर कभी कुछ बहा ही नहीं। इसका हल है hydraulic erosion, जो Sebastian Lague के MIT-licensed implementation से port किया गया है। हज़ारों पानी की बूंदें यादृच्छिक जगहों पर पैदा होती हैं और ढलान से नीचे लुढ़कती हैं, हर एक के पास inertia होता है ताकि वह तीखे समकोण मोड़ न ले, तेज़ होने पर sediment उठाती है और धीमी होने या जमा होने पर उसे जमा करती है, साथ ही एक पहले से गणना किया गया circular brush हर erosion घटना को एक छोटे radius में फैला देता है ताकि कटाव एक pixel की खरोंच के बजाय smooth रहे, और evaporation जो बूंद को उसके जीवनकाल में retire कर देता है। पर्याप्त बूंदें चलाओ और terrain वह चीज़ उगा लेता है जिसे noise नकली नहीं बना सकता: ऐसी drainage networks जो मिलती हैं, घाटियां जो नीचे की ओर चौड़ी होती जाती हैं, और सपाट जगहें जहां sediment बैठ गया।</p>
<h2 id="gpu-पर-erosion-और-नदियां-जो-जानती-हैं-कि-वे-कहां-हैं" tabindex="-1">GPU पर erosion, और नदियां जो जानती हैं कि वे कहां हैं <a class="header-anchor" href="#gpu-पर-erosion-और-नदियां-जो-जानती-हैं-कि-वे-कहां-हैं" aria-label="Permalink to &quot;GPU पर erosion, और नदियां जो जानती हैं कि वे कहां हैं&quot;"></a></h2>
<p>CPU erosion सही है मगर धीमा, इसलिए spike इसे एक WebGPU compute shader में भी port करता है, और दिलचस्प हिस्सा यह है कि GPU atomics आप पर क्या मजबूर कर देते हैं। Heights को fixed-point <code>i32</code> के रूप में दस लाख के scale पर store किया जाता है, क्योंकि WGSL में floats पर atomic add नहीं है, और हज़ारों बूंदों के लिए एक ही cell से बिना races के समानांतर sediment जमा करने और हटाने का इकलौता तरीका integers पर <code>atomicAdd</code> और <code>atomicSub</code> है। Fixed-point round-trip का मतलब है कि भारी समानांतर drag के तहत कोई cell कभी-कभार थोड़ा negative हो सकता है, जो हानिरहित है और readback पर clamp कर दिया जाता है। CPU version हर cell के लिए एक brush table पहले से गणना करता है, मगर <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.05ex;" xmlns="http://www.w3.org/2000/svg" width="5.513ex" height="2.005ex" role="img" focusable="false" viewBox="0 -864 2436.6 886" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msup"><g data-mml-node="mn"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(500,0)" style="stroke-width: 3;"/><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(1000,0)" style="stroke-width: 3;"/><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" transform="translate(1500,0)" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(2033,393.1) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><msup><mn>1001</mn><mn>2</mn></msup></math></mjx-assistive-mml></mjx-container> grid पर वह table लगभग 100 MB का होता है, इसलिए GPU port इसके बजाय हर बूंद के brush को मौके पर ही फिर से गणना करता है, थोड़े arithmetic के बदले बहुत सारी memory की बचत करता है। बूंदों की शुरुआती positions अब भी CPU से एक Mulberry32 generator के ज़रिए आती हैं ताकि runs deterministic रहें।</p>
<p>दो और passes मौसम-कटाव झेले terrain को एक पढ़ने योग्य map में बदल देते हैं। Drainage, Red Blob D8 flow-accumulation method इस्तेमाल करता है: हर cell पर बारिश की एक इकाई डालो, सभी cells को elevation के घटते क्रम में sort करो, और हर cell का जमा पानी उसके इकलौते सबसे नीचे वाले पड़ोसी को पास कर दो, ताकि पानी प्राकृतिक घाटियों के साथ ढेर हो जाए, और जिस भी cell का accumulation एक threshold पार करता है उसे river चिह्नित कर दिया जाता है। पेच यह है कि एक eroded heightmap में pits होते हैं, यानी ऐसी स्थानीय गहराइयां जिनसे नीचे की ओर कोई निकास नहीं, और pit में घुसता पानी बस रुक जाता है, जिससे accumulation टूट जाता है। इसलिए drainage चलने से पहले Planchon-Darboux pit filling हर pit को उसके सबसे नीचे वाले पड़ोसी से ज़रा ऊपर तक उठा देता है, <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.466ex;" xmlns="http://www.w3.org/2000/svg" width="17.709ex" height="2.036ex" role="img" focusable="false" viewBox="0 -694 7827.4 900" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mtext"><path data-c="6D" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(833,0)" style="stroke-width: 3;"/><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(1111,0)" style="stroke-width: 3;"/><path data-c="4E" d="M42 46Q74 48 94 56T118 69T128 86V634H124Q114 637 52 637H25V683H232L235 680Q237 679 322 554T493 303L578 178V598Q572 608 568 613T544 627T492 637H475V683H483Q498 680 600 680Q706 680 715 683H724V637H707Q634 633 622 598L621 302V6L614 0H600Q585 0 582 3T481 150T282 443T171 605V345L172 86Q183 50 257 46H274V0H265Q250 3 150 3Q48 3 33 0H25V46H42Z" transform="translate(1667,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(2417,0)" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(2861,0)" style="stroke-width: 3;"/><path data-c="67" d="M329 409Q373 453 429 453Q459 453 472 434T485 396Q485 382 476 371T449 360Q416 360 412 390Q410 404 415 411Q415 412 416 414V415Q388 412 363 393Q355 388 355 386Q355 385 359 381T368 369T379 351T388 325T392 292Q392 230 343 187T222 143Q172 143 123 171Q112 153 112 133Q112 98 138 81Q147 75 155 75T227 73Q311 72 335 67Q396 58 431 26Q470 -13 470 -72Q470 -139 392 -175Q332 -206 250 -206Q167 -206 107 -175Q29 -140 29 -75Q29 -39 50 -15T92 18L103 24Q67 55 67 108Q67 155 96 193Q52 237 52 292Q52 355 102 398T223 442Q274 442 318 416L329 409ZM299 343Q294 371 273 387T221 404Q192 404 171 388T145 343Q142 326 142 292Q142 248 149 227T179 192Q196 182 222 182Q244 182 260 189T283 207T294 227T299 242Q302 258 302 292T299 343ZM403 -75Q403 -50 389 -34T348 -11T299 -2T245 0H218Q151 0 138 -6Q118 -15 107 -34T95 -74Q95 -84 101 -97T122 -127T170 -155T250 -167Q319 -167 361 -139T403 -75Z" transform="translate(3139,0)" style="stroke-width: 3;"/><path data-c="68" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 124T102 167T103 217T103 272T103 329Q103 366 103 407T103 482T102 542T102 586T102 603Q99 622 88 628T43 637H25V660Q25 683 27 683L37 684Q47 685 66 686T103 688Q120 689 140 690T170 693T181 694H184V367Q244 442 328 442Q451 442 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(3639,0)" style="stroke-width: 3;"/><path data-c="62" d="M307 -11Q234 -11 168 55L158 37Q156 34 153 28T147 17T143 10L138 1L118 0H98V298Q98 599 97 603Q94 622 83 628T38 637H20V660Q20 683 22 683L32 684Q42 685 61 686T98 688Q115 689 135 690T165 693T176 694H179V543Q179 391 180 391L183 394Q186 397 192 401T207 411T228 421T254 431T286 439T323 442Q401 442 461 379T522 216Q522 115 458 52T307 -11ZM182 98Q182 97 187 90T196 79T206 67T218 55T233 44T250 35T271 29T295 26Q330 26 363 46T412 113Q424 148 424 212Q424 287 412 323Q385 405 300 405Q270 405 239 390T188 347L182 339V98Z" transform="translate(4195,0)" style="stroke-width: 3;"/><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z" transform="translate(4751,0)" style="stroke-width: 3;"/><path data-c="75" d="M383 58Q327 -10 256 -10H249Q124 -10 105 89Q104 96 103 226Q102 335 102 348T96 369Q86 385 36 385H25V408Q25 431 27 431L38 432Q48 433 67 434T105 436Q122 437 142 438T172 441T184 442H187V261Q188 77 190 64Q193 49 204 40Q224 26 264 26Q290 26 311 35T343 58T363 90T375 120T379 144Q379 145 379 161T380 201T380 248V315Q380 361 370 372T320 385H302V431Q304 431 378 436T457 442H464V264Q464 84 465 81Q468 61 479 55T524 46H542V0Q540 0 467 -5T390 -11H383V58Z" transform="translate(5251,0)" style="stroke-width: 3;"/><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(5807,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(6421.2,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(7421.4,0)"><path data-c="1D716" d="M227 -11Q149 -11 95 41T40 174Q40 262 87 322Q121 367 173 396T287 430Q289 431 329 431H367Q382 426 382 411Q382 385 341 385H325H312Q191 385 154 277L150 265H327Q340 256 340 246Q340 228 320 219H138V217Q128 187 128 143Q128 77 160 52T231 26Q258 26 284 36T326 57T343 68Q350 68 354 58T358 39Q358 36 357 35Q354 31 337 21T289 0T227 -11Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mtext>minNeighbour</mtext><mo>+</mo><mi>ϵ</mi></math></mjx-assistive-mml></mjx-container>, बीस से कम passes तक iterate करते हुए जब तक हर cell के पास निकलने की कोई जगह न हो। आख़िर में biomes Red Blob तरीके से तय किए जाते हैं, elevation बनाम moisture पर एक two-axis lookup ताकि एक ऊंचा-और-सूखा cell rock बन जाए जबकि एक नीचा-और-गीला cell marsh, और उसके ऊपर slope-aware overrides: तीखी ढलानें moisture की परवाह किए बिना rock पर मजबूर हो जाती हैं, waterline band beach बन जाता है, और सबसे ऊंची elevations snow ले लेती हैं। नतीजा एक ऐसा island है जिसे आप एक नज़र में पढ़ सकते हैं, दो noise seeds से शुरू से आख़िर तक generate किया गया।</p>
<h2 id="वह-tile-जो-दोहराना-बंद-नहीं-करता" tabindex="-1">वह tile जो दोहराना बंद नहीं करता <a class="header-anchor" href="#वह-tile-जो-दोहराना-बंद-नहीं-करता" aria-label="Permalink to &quot;वह tile जो दोहराना बंद नहीं करता&quot;"></a></h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/55-terrain-shading/" title="Spike 55 Terrain Shading" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/55-terrain-shading/" target="_blank">Spike 55 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=55-terrain-shading">Source देखें</a></p>
<p>एक terrain को ऐसे material की ज़रूरत होती है जो एक ऐसी texture से किलोमीटरों को ढके जो कुछ ही मीटर चौड़ी है, और जिस पल आप एक tile को ज़मीन ढकने के लिए बड़ा करते हैं, आंख दोहराव पर अटक जाती है। Spike 55 एक ही geometry और lighting पर चार sampling modes का एक A/B bench है, ताकि इकलौता चर यही रहे कि texture कैसे पढ़ी जाती है। Baseline है <code>plain</code>: scaled UV पर एक sample, जो हर कुछ मीटर पर साफ़ tile करता है और सिर्फ़ इसलिए मौजूद है ताकि उसे हराया जा सके। मुफ़्त PBR layers Poly Haven से उनके CDN के ज़रिए आती हैं, diffuse के साथ packed ARM map (ambient occlusion, roughness, metalness) के साथ एक GL normal, सब CC0, anisotropy 8 और mipmaps के साथ load किए गए।</p>
<p>दिलचस्प तीन, repeat पर अलग-अलग हमले हैं। <code>hex-linear</code> mode, Heitz-Neyret triangle grid है: surface पर एक तिरछी triangular lattice बिछाओ, और हर fragment एक triangle के अंदर बैठता है जिसके तीनों vertices एक-एक यादृच्छिक रूप से खिसका हुआ tap लेते हैं, barycentric weights से blend किया जाता है ताकि पड़ोसी क्षेत्र texture के अलग-अलग हिस्सों को sample करें और बड़े पैमाने की tiling घुल जाए। मगर तीन taps का सादा linear blend triangle के किनारों पर उनके रंगों का औसत निकाल देता है, जिससे एक दिखाई देने वाला triangular pattern बच जाता है, ठीक वही artifact जिससे spike 48 टकराया था। <code>hex-vp</code> mode उसी 2018 के paper से प्रकाशित fix है: barycentric sum के बाद, texture के mean color को घटाओ, squared weights के sum के inverse square root से rescale करो ताकि variance स्थिर रहे, फिर mean को वापस जोड़ दो। इससे blend भर में contrast स्थिर रहता है ताकि triangles गायब हो जाएं, यही वजह है कि material हर load की गई texture का 1-by-1 readback करता है ताकि पहले से उसके mean color का अंदाज़ा लगा सके। चौथा mode, <code>iq-untiled</code>, Inigo Quilez की Texture Repetition technique 3 है: एक low-frequency variation pattern से blend किए गए दो offset taps, तीन के बजाय बस दो samples और शुरू से कोई triangle structure नहीं, सस्ता विकल्प जो टिका रहता है।</p>
<p>किसी भी mode के ऊपर एक वैकल्पिक triplanar projection बैठता है, यही वह चीज़ है जो उसी material को बिना खींचे एक cliff पर लपेटने देती है। एक UV के बजाय, shader तीन world-axis projections को sample करता है, X की ओर वाली surfaces YZ plane पढ़ती हैं, Y, ZX पढ़ता है, Z, XY पढ़ता है, और इन्हें <code>abs(normalWorld)</code> से blend करता है जिसे चार और आठ के बीच एक sharpening power तक उठाया जाता है ताकि 45-डिग्री की ढलान तीनों projections को घोलकर लुगदी न बना दे। Bench इस अदला-बदली को साफ़ कर देता है: variance-preserving hex blending गुणवत्ता का विजेता है और Quilez का two-tap performance के लिहाज़ से सजग वाला, और दोनों plain को इतने बड़े अंतर से हराते हैं कि किसी creator को कभी plain tile ship नहीं करनी चाहिए।</p>
<h2 id="इस-अध्याय-में-बताई-गई-technology" tabindex="-1">इस अध्याय में बताई गई technology <a class="header-anchor" href="#इस-अध्याय-में-बताई-गई-technology" aria-label="Permalink to &quot;इस अध्याय में बताई गई technology&quot;"></a></h2>
<p><strong>Recipe-stacked heightmap generation.</strong> Red Blob Games की recipes raw noise को terrain में बुनती हैं: organic ridges के लिए domain-warped FBM (<mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="19.194ex" height="2.283ex" role="img" focusable="false" viewBox="0 -759 8483.9 1009" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msup"><g data-mml-node="mi"><path data-c="1D45D" d="M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(536,363) scale(0.707)"><path data-c="2032" d="M79 43Q73 43 52 49T30 61Q30 68 85 293T146 528Q161 560 198 560Q218 560 240 545T262 501Q262 496 260 486Q259 479 173 263T84 45T79 43Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(1058.2,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(2114,0)"><path data-c="1D45D" d="M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(2839.2,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(3839.5,0)"><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" style="stroke-width: 3;"/><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z" transform="translate(556,0)" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(1056,0)" style="stroke-width: 3;"/><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" transform="translate(1334,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(1728,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(6011.5,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(6400.5,0)"><path data-c="1D45D" d="M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(6903.5,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(7514.7,0)"><path data-c="22C5" d="M78 250Q78 274 95 292T138 310Q162 310 180 294T199 251Q199 226 182 208T139 190T96 207T78 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(8014.9,0)"><path data-c="1D460" d="M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><msup><mi>p</mi><mo data-mjx-alternate="1">′</mo></msup><mo>=</mo><mi>p</mi><mo>+</mo><mtext>noise</mtext><mo stretchy="false">(</mo><mi>p</mi><mo stretchy="false">)</mo><mo>⋅</mo><mi>s</mi></math></mjx-assistive-mml></mjx-container>), सपाट घाटियों और तीखी चोटियों के लिए <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="2.453ex" height="1.956ex" role="img" focusable="false" viewBox="0 -853.7 1084.4 864.7" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msup"><g data-mml-node="mi"><path data-c="1D452" d="M39 168Q39 225 58 272T107 350T174 402T244 433T307 442H310Q355 442 388 420T421 355Q421 265 310 237Q261 224 176 223Q139 223 138 221Q138 219 132 186T125 128Q125 81 146 54T209 26T302 45T394 111Q403 121 406 121Q410 121 419 112T429 98T420 82T390 55T344 24T281 -1T205 -11Q126 -11 83 42T39 168ZM373 353Q367 405 305 405Q272 405 244 391T199 357T170 316T154 280T149 261Q149 260 169 260Q282 260 327 284T373 353Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" transform="translate(499,363) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mstyle" transform="scale(1.414)"><g data-mml-node="mspace"/></g><g data-mml-node="mi" transform="translate(236.2,0)"><path data-c="1D458" d="M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z" style="stroke-width: 3;"/></g></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><msup><mi>e</mi><mrow data-mjx-texclass="ORD"><mstyle scriptlevel="0"><mspace width="0.167em"/></mstyle><mi>k</mi></mrow></msup></math></mjx-assistive-mml></mjx-container> redistribution, और किनारों को समुद्र में उतारकर island बनाने के लिए <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.186ex;" xmlns="http://www.w3.org/2000/svg" width="5.073ex" height="1.756ex" role="img" focusable="false" viewBox="0 -694 2242.4 776" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mn"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(722.2,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(1722.4,0)"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn><mo>−</mo><mi>d</mi></math></mjx-assistive-mml></mjx-container> की ओर blend किया गया euclidean radial falloff। एक दूसरा noise field biome assignment के लिए moisture map है। देखें <a href="/hi/guides/landscape-generation-browser.html">landscape generation</a>।</p>
<p><strong>Hydraulic erosion, CPU और GPU.</strong> Sebastian Lague का droplet model (inertia, carrying capacity, एक पहले से गणना किया गया circular deposit brush, evaporation) असली drainage काटता है जिसे noise नकली नहीं बना सकता। WebGPU compute port heights को दस लाख के scale पर fixed-point <code>i32</code> के रूप में store करता है ताकि बूंदें एक ही cell को समानांतर रूप से <code>atomicAdd</code>/<code>atomicSub</code> कर सकें, <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.05ex;" xmlns="http://www.w3.org/2000/svg" width="5.513ex" height="2.005ex" role="img" focusable="false" viewBox="0 -864 2436.6 886" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msup"><g data-mml-node="mn"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(500,0)" style="stroke-width: 3;"/><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(1000,0)" style="stroke-width: 3;"/><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" transform="translate(1500,0)" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(2033,393.1) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><msup><mn>1001</mn><mn>2</mn></msup></math></mjx-assistive-mml></mjx-container> पर ~100 MB की table से बचने के लिए हर बूंद के brush को मौके पर फिर से गणना करता है, और शुरुआती positions को एक deterministic Mulberry32 generator से seed करता है।</p>
<p><strong>Pit filling के साथ D8 drainage.</strong> Red Blob D8 flow accumulation हर cell पर बारिश की एक इकाई डालता है, cells को घटते elevation के क्रम में sort करता है, और हर cell का पानी उसके सबसे नीचे वाले पड़ोसी को पास करता है, एक threshold से ऊपर वाली नदियों को चिह्नित करते हुए। Planchon-Darboux pit filling पहले हर स्थानीय गहराई को <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.466ex;" xmlns="http://www.w3.org/2000/svg" width="17.709ex" height="2.036ex" role="img" focusable="false" viewBox="0 -694 7827.4 900" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mtext"><path data-c="6D" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(833,0)" style="stroke-width: 3;"/><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(1111,0)" style="stroke-width: 3;"/><path data-c="4E" d="M42 46Q74 48 94 56T118 69T128 86V634H124Q114 637 52 637H25V683H232L235 680Q237 679 322 554T493 303L578 178V598Q572 608 568 613T544 627T492 637H475V683H483Q498 680 600 680Q706 680 715 683H724V637H707Q634 633 622 598L621 302V6L614 0H600Q585 0 582 3T481 150T282 443T171 605V345L172 86Q183 50 257 46H274V0H265Q250 3 150 3Q48 3 33 0H25V46H42Z" transform="translate(1667,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(2417,0)" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(2861,0)" style="stroke-width: 3;"/><path data-c="67" d="M329 409Q373 453 429 453Q459 453 472 434T485 396Q485 382 476 371T449 360Q416 360 412 390Q410 404 415 411Q415 412 416 414V415Q388 412 363 393Q355 388 355 386Q355 385 359 381T368 369T379 351T388 325T392 292Q392 230 343 187T222 143Q172 143 123 171Q112 153 112 133Q112 98 138 81Q147 75 155 75T227 73Q311 72 335 67Q396 58 431 26Q470 -13 470 -72Q470 -139 392 -175Q332 -206 250 -206Q167 -206 107 -175Q29 -140 29 -75Q29 -39 50 -15T92 18L103 24Q67 55 67 108Q67 155 96 193Q52 237 52 292Q52 355 102 398T223 442Q274 442 318 416L329 409ZM299 343Q294 371 273 387T221 404Q192 404 171 388T145 343Q142 326 142 292Q142 248 149 227T179 192Q196 182 222 182Q244 182 260 189T283 207T294 227T299 242Q302 258 302 292T299 343ZM403 -75Q403 -50 389 -34T348 -11T299 -2T245 0H218Q151 0 138 -6Q118 -15 107 -34T95 -74Q95 -84 101 -97T122 -127T170 -155T250 -167Q319 -167 361 -139T403 -75Z" transform="translate(3139,0)" style="stroke-width: 3;"/><path data-c="68" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 124T102 167T103 217T103 272T103 329Q103 366 103 407T103 482T102 542T102 586T102 603Q99 622 88 628T43 637H25V660Q25 683 27 683L37 684Q47 685 66 686T103 688Q120 689 140 690T170 693T181 694H184V367Q244 442 328 442Q451 442 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(3639,0)" style="stroke-width: 3;"/><path data-c="62" d="M307 -11Q234 -11 168 55L158 37Q156 34 153 28T147 17T143 10L138 1L118 0H98V298Q98 599 97 603Q94 622 83 628T38 637H20V660Q20 683 22 683L32 684Q42 685 61 686T98 688Q115 689 135 690T165 693T176 694H179V543Q179 391 180 391L183 394Q186 397 192 401T207 411T228 421T254 431T286 439T323 442Q401 442 461 379T522 216Q522 115 458 52T307 -11ZM182 98Q182 97 187 90T196 79T206 67T218 55T233 44T250 35T271 29T295 26Q330 26 363 46T412 113Q424 148 424 212Q424 287 412 323Q385 405 300 405Q270 405 239 390T188 347L182 339V98Z" transform="translate(4195,0)" style="stroke-width: 3;"/><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z" transform="translate(4751,0)" style="stroke-width: 3;"/><path data-c="75" d="M383 58Q327 -10 256 -10H249Q124 -10 105 89Q104 96 103 226Q102 335 102 348T96 369Q86 385 36 385H25V408Q25 431 27 431L38 432Q48 433 67 434T105 436Q122 437 142 438T172 441T184 442H187V261Q188 77 190 64Q193 49 204 40Q224 26 264 26Q290 26 311 35T343 58T363 90T375 120T379 144Q379 145 379 161T380 201T380 248V315Q380 361 370 372T320 385H302V431Q304 431 378 436T457 442H464V264Q464 84 465 81Q468 61 479 55T524 46H542V0Q540 0 467 -5T390 -11H383V58Z" transform="translate(5251,0)" style="stroke-width: 3;"/><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(5807,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(6421.2,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(7421.4,0)"><path data-c="1D716" d="M227 -11Q149 -11 95 41T40 174Q40 262 87 322Q121 367 173 396T287 430Q289 431 329 431H367Q382 426 382 411Q382 385 341 385H325H312Q191 385 154 277L150 265H327Q340 256 340 246Q340 228 320 219H138V217Q128 187 128 143Q128 77 160 52T231 26Q258 26 284 36T326 57T343 68Q350 68 354 58T358 39Q358 36 357 35Q354 31 337 21T289 0T227 -11Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mtext>minNeighbour</mtext><mo>+</mo><mi>ϵ</mi></math></mjx-assistive-mml></mjx-container> तक उठाता है (बीस से कम passes तक iterate करते हुए) ताकि पानी कभी फंसे नहीं और accumulation जुड़ा रहे। एक two-axis elevation-by-moisture lookup biomes तय करता है, slope overrides के साथ जो cliffs पर rock, waterline पर beach, और चोटियों पर snow मजबूर करते हैं।</p>
<p><strong>Texture tiling को चार तरीकों से तोड़ना.</strong> एक जैसी geometry और lighting पर: <code>plain</code> (एक tap, साफ़ tile करता है), <code>hex-linear</code> (Heitz-Neyret triangle grid, linear blend एक triangle pattern छोड़ देता है), <code>hex-vp</code> (EGSR 2018 §3.3 variance-preserving fix जो mean घटाता है, squared weights के inverse-sqrt से rescale करता है, और mean को फिर से जोड़ता है, हर texture के लिए एक 1×1 mean readback चाहिए), और <code>iq-untiled</code> (Inigo Quilez two-tap technique 3)। Triplanar projection तीन world-axis planes को sample करता है जिन्हें <code>abs(normalWorld)</code> से 4-8 की power तक blend किया जाता है ताकि cliffs न खिंचें। variance-preserving गुणवत्ता पर जीतता है, two-tap लागत पर। देखें <a href="/hi/guides/landscape-generation-browser.html#terrain-materials">terrain materials</a>।</p>
<hr>
<p>29 में से भाग 27।
पिछला: <a href="/hi/blog/2026-05-12-open-world-browser-part-26-water.html">भाग 26 - पानी बनाने के तीन तरीके</a>
अगला: <a href="/hi/blog/2026-05-14-open-world-browser-part-28-grass-and-occlusion.html">भाग 28 - क्षितिज तक घास, और ऐसी ज़मीन जो खुद को छुपा लेती है</a>
Series guide: <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">/hi/blog/2026-02-25-open-world-browser-series-guide</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Browser में open world बनाना, भाग 26: पानी बनाने के तीन तरीके]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-05-12-open-world-browser-part-26-water</link>
            <guid>https://app.cinevva.com/hi/blog/2026-05-12-open-world-browser-part-26-water</guid>
            <pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Spike 51 ने screen-space reflection वाला पानी बनाया और अपनी बुनियादी दीवार से टकरा गया: यह उस चीज़ को reflect नहीं कर सकता जिसे camera ने कभी देखा ही नहीं। Spike 52 ने planar mirror अपनाया, वही pattern जो हर शिप होने वाला game इस्तेमाल करता है, और एक ऐसा bug खत्म किया जो dark reflections को खा जाता था। Spike 53 ने एक production water library डालकर देखा कि 'पूरा हो चुका' कैसा दिखता है।]]></description>
            <content:encoded><![CDATA[<h1 id="browser-में-open-world-बनाना-भाग-26-पानी-बनाने-के-तीन-तरीके" tabindex="-1">Browser में open world बनाना, भाग 26: पानी बनाने के तीन तरीके <a class="header-anchor" href="#browser-में-open-world-बनाना-भाग-26-पानी-बनाने-के-तीन-तरीके" aria-label="Permalink to &quot;Browser में open world बनाना, भाग 26: पानी बनाने के तीन तरीके&quot;"></a></h1>
<p><em>लेखक <a href="/hi/about.html">Oleg Sidorkin</a>, Cinevva के CTO और सह-संस्थापक</em></p>
<p>यहां नए हैं? <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">सीरीज़ गाइड</a> इस्तेमाल करें। यह बताता है कि spike क्या है और सारे भागों को link करता है।</p>
<p><a href="/hi/blog/2026-05-10-open-world-browser-part-25-universal-characters.html">भाग 25</a> ने avatars को कपड़े पहनाए। यह भाग पानी के बारे में है, और इसमें तीन spike हैं क्योंकि पानी वही surface है जहां एक सस्ता shortcut और सही जवाब screenshot में बिलकुल एक जैसे दिखते हैं और motion में पूरी तरह अलग। Spike 51 reflection को screen-space तरीके से बनाता है, वो लुभावना तरीका, और सीधे अपनी built-in सीमा से टकरा जाता है। Spike 52 उस method पर switch करता है जिसे हर शिप होने वाला game असल में इस्तेमाल करता है। Spike 53 एक तैयार water library डालकर देखता है कि &quot;done&quot; हमसे कितनी दूर है। तीनों एक ही refraction layer share करते हैं, इसलिए पहले दो के बीच सिर्फ एक चीज़ बदलती है: reflection कैसे compute होता है।</p>
<h2 id="उसी-screen-से-reflection-जो-आपके-पास-पहले-से-है" tabindex="-1">उसी screen से reflection जो आपके पास पहले से है <a class="header-anchor" href="#उसी-screen-से-reflection-जो-आपके-पास-पहले-से-है" aria-label="Permalink to &quot;उसी screen से reflection जो आपके पास पहले से है&quot;"></a></h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/51-water-ssr-caustics/" title="Spike 51 Water SSR" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/51-water-ssr-caustics/" target="_blank">Spike 51 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=51-water-ssr-caustics">Source देखें</a></p>
<p>Screen-space reflection उसी frame को दोबारा इस्तेमाल करता है जिसे आप पहले ही render कर चुके हैं। हर water pixel के लिए, आप view ray को surface से reflect करते हैं, उस reflected ray को depth buffer के आर-पार march कराते हैं, और जब ray किसी record की गई surface के पीछे से गुज़रता है तो आपको मिल गया कि पानी क्या reflect करता है, सीधे color buffer से sample किया हुआ। यह port three.js की <code>SSRNode</code> line को line-by-line follow करता है, जो खुद lettier के SSR primer को follow करती है। March screen space में एक DDA walk है: ray के start और end को pixel coordinates में project करें और जो भी axis लंबा हो उसके साथ step करें, हर pixel पर एक tap। हर step पर reflected ray की depth को perspective-correct interpolation चाहिए, <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -1.238ex;" xmlns="http://www.w3.org/2000/svg" width="14.984ex" height="3.195ex" role="img" focusable="false" viewBox="0 -864.9 6622.8 1412" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mfrac"><g data-mml-node="mn" transform="translate(3134.6,394) scale(0.707)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g><g data-mml-node="mrow" transform="translate(220,-370.3) scale(0.707)"><g data-mml-node="mn"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(500,0)"><g data-mml-node="mo"><path data-c="2F" d="M423 750Q432 750 438 744T444 730Q444 725 271 248T92 -240Q85 -250 75 -250Q68 -250 62 -245T56 -231Q56 -221 230 257T407 740Q411 750 423 750Z" style="stroke-width: 3;"/></g></g><g data-mml-node="msub" transform="translate(1000,0)"><g data-mml-node="mi"><path data-c="1D467" d="M347 338Q337 338 294 349T231 360Q211 360 197 356T174 346T162 335T155 324L153 320Q150 317 138 317Q117 317 117 325Q117 330 120 339Q133 378 163 406T229 440Q241 442 246 442Q271 442 291 425T329 392T367 375Q389 375 411 408T434 441Q435 442 449 442H462Q468 436 468 434Q468 430 463 420T449 399T432 377T418 358L411 349Q368 298 275 214T160 106L148 94L163 93Q185 93 227 82T290 71Q328 71 360 90T402 140Q406 149 409 151T424 153Q443 153 443 143Q443 138 442 134Q425 72 376 31T278 -11Q252 -11 232 6T193 40T155 57Q111 57 76 -3Q70 -11 59 -11H54H41Q35 -5 35 -2Q35 13 93 84Q132 129 225 214T340 322Q352 338 347 338Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(498,-150) scale(0.707)"><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(1901.6,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(2679.6,0)"><path data-c="1D460" d="M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z" style="stroke-width: 3;"/></g><g data-mml-node="mstyle" transform="translate(3148.6,0) scale(1.414)"><g data-mml-node="mspace"/></g><g data-mml-node="mo" transform="translate(3384.7,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(3773.7,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(4273.7,0)"><g data-mml-node="mo"><path data-c="2F" d="M423 750Q432 750 438 744T444 730Q444 725 271 248T92 -240Q85 -250 75 -250Q68 -250 62 -245T56 -231Q56 -221 230 257T407 740Q411 750 423 750Z" style="stroke-width: 3;"/></g></g><g data-mml-node="msub" transform="translate(4773.7,0)"><g data-mml-node="mi"><path data-c="1D467" d="M347 338Q337 338 294 349T231 360Q211 360 197 356T174 346T162 335T155 324L153 320Q150 317 138 317Q117 317 117 325Q117 330 120 339Q133 378 163 406T229 440Q241 442 246 442Q271 442 291 425T329 392T367 375Q389 375 411 408T434 441Q435 442 449 442H462Q468 436 468 434Q468 430 463 420T449 399T432 377T418 358L411 349Q368 298 275 214T160 106L148 94L163 93Q185 93 227 82T290 71Q328 71 360 90T402 140Q406 149 409 151T424 153Q443 153 443 143Q443 138 442 134Q425 72 376 31T278 -11Q252 -11 232 6T193 40T155 57Q111 57 76 -3Q70 -11 59 -11H54H41Q35 -5 35 -2Q35 13 93 84Q132 129 225 214T340 322Q352 338 347 338Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(498,-150) scale(0.707)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(5675.3,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(6453.3,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(6953.3,0)"><g data-mml-node="mo"><path data-c="2F" d="M423 750Q432 750 438 744T444 730Q444 725 271 248T92 -240Q85 -250 75 -250Q68 -250 62 -245T56 -231Q56 -221 230 257T407 740Q411 750 423 750Z" style="stroke-width: 3;"/></g></g><g data-mml-node="msub" transform="translate(7453.3,0)"><g data-mml-node="mi"><path data-c="1D467" d="M347 338Q337 338 294 349T231 360Q211 360 197 356T174 346T162 335T155 324L153 320Q150 317 138 317Q117 317 117 325Q117 330 120 339Q133 378 163 406T229 440Q241 442 246 442Q271 442 291 425T329 392T367 375Q389 375 411 408T434 441Q435 442 449 442H462Q468 436 468 434Q468 430 463 420T449 399T432 377T418 358L411 349Q368 298 275 214T160 106L148 94L163 93Q185 93 227 82T290 71Q328 71 360 90T402 140Q406 149 409 151T424 153Q443 153 443 143Q443 138 442 134Q425 72 376 31T278 -11Q252 -11 232 6T193 40T155 57Q111 57 76 -3Q70 -11 59 -11H54H41Q35 -5 35 -2Q35 13 93 84Q132 129 225 214T340 322Q352 338 347 338Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(498,-150) scale(0.707)"><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(8354.8,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g></g><rect width="6382.8" height="60" x="120" y="220"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mfrac><mn>1</mn><mrow><mn>1</mn><mrow data-mjx-texclass="ORD"><mo>/</mo></mrow><msub><mi>z</mi><mn>0</mn></msub><mo>+</mo><mi>s</mi><mstyle scriptlevel="0"><mspace width="0.167em"/></mstyle><mo stretchy="false">(</mo><mn>1</mn><mrow data-mjx-texclass="ORD"><mo>/</mo></mrow><msub><mi>z</mi><mn>1</mn></msub><mo>−</mo><mn>1</mn><mrow data-mjx-texclass="ORD"><mo>/</mo></mrow><msub><mi>z</mi><mn>0</mn></msub><mo stretchy="false">)</mo></mrow></mfrac></math></mjx-assistive-mml></mjx-container>, क्योंकि view-Z को linearly interpolate करना सीधे-सीधे गलत है और गलत जगह पर hits पैदा करता है।</p>
<p>दो चीज़ें इसे slideshow की जगह इस्तेमाल करने लायक बनाती हैं। Coarse march 64 steps पर capped है, क्योंकि एक लंबा ray जो हज़ार pixels के पार project होता है वरना हर fragment के लिए सैकड़ों iterations चला देता, और दस लाख-fragment वाला water plane गुणा सैकड़ों iterations गुणा कुछ texture samples एक 30 fps scene है। Quality उस cap के अंदर effective stride को control करती है, iteration count को नहीं। और चूंकि एक capped coarse march दिखने वाली stair-step banding छोड़ता है, इसलिए एक छह-iteration वाला binary refinement आखिरी miss और hit के बीच के interval को bisect करता है, जो 64x sub-step accuracy है, इतनी कि पड़ोसी water fragments उसी coarse hit position पर lock होना बंद कर देते हैं। एक आखिरी point-to-line distance check पुष्टि करता है कि candidate सचमुच reflection ray पर है, न कि सिर्फ उसी depth पर, एक thickness tolerance के साथ जो उस depth पर एक pixel की view-space width के हिसाब से auto-scale होती है, पास में tighter और दूर में looser।</p>
<p>इस spike का ईमानदार हिस्सा उसके अपने comments में लिखा है: SSR उस चीज़ को reflect नहीं कर सकता जिसे main camera ने कभी sample नहीं किया। किसी पेड़ का नीचे का हिस्सा, off-screen कुछ भी, occluded कुछ भी, इनमें से कुछ भी buffers में मौजूद नहीं है, इसलिए reflection में दिख ही नहीं सकता। यही वो &quot;wrong-side information loss&quot; है जिसे कितनी भी march quality ठीक नहीं करती, और यही ठीक वो वजह है जिसके लिए अगला spike मौजूद है।</p>
<h2 id="वो-mirror-जो-झूठ-नहीं-बोल-सकता" tabindex="-1">वो mirror जो झूठ नहीं बोल सकता <a class="header-anchor" href="#वो-mirror-जो-झूठ-नहीं-बोल-सकता" aria-label="Permalink to &quot;वो mirror जो झूठ नहीं बोल सकता&quot;"></a></h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/52-water-planar/" title="Spike 52 Water Planar" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/52-water-planar/" target="_blank">Spike 52 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=52-water-planar">Source देखें</a></p>
<p>एक planar reflection scene को दूसरी बार render करता है, water plane के आर-पार mirror की गई एक camera से, एक offscreen target में, और water shader उस target को sample करता है। यह canonical pattern है, जिसे UE5 Water, three.js की अपनी <code>WaterMesh</code>, ABZÛ, और Sea of Thieves सब इस्तेमाल करते हैं, क्योंकि इसके पास draw करने के लिए scene का हर pixel मौजूद है, उस geometry समेत जिसे SSR कभी देख नहीं सकता। TSL में यह लगभग anticlimactic है: <code>reflector()</code> mirror की गई helper camera और उसका render target allocate करता है, आप उसके target को mesh में जोड़ते हैं ताकि वह हर frame update हो, और आप उसका color sample करते हैं। जब बाद में waves आती हैं, तो reflection reflector के UV node में एक distortion offset जोड़कर wobble करता है, जो ठीक वही line है जो <code>WaterMesh</code> इस्तेमाल करती है।</p>
<p>record करने लायक bug safety net में था, mirror में नहीं। एक पुराने version ने reflector के output को एक procedural sky के साथ fallback के तौर पर blend किया, reflected color की magnitude के हिसाब से weighted, इस theory पर कि करीब-शून्य reflection का मतलब है target में वहां कुछ नहीं था। पर एक dark canopy की छाया की magnitude भी कम होती है, इसलिए clamp कभी full strength तक नहीं पहुंचा और वो असल में dark pixels bright sky के साथ mix हो गए। user ने जो symptom पकड़ा वह सटीक था: debug mode में raw mirror target perfect dark पेड़ दिखा रहा था, जबकि composed render में washed-out reflections थे, और diagnosis यह था कि shader &quot;dark colors को गायब कर देता है।&quot; Fix था deletion। Reflector target पहले frame के बाद reliable रहता है, इसलिए fallback की कोई ज़रूरत ही नहीं। दोनों spike नीचे वही refraction share करते हैं: surface के पीछे का scene sample करें, reconstruct करें कि हर pixel waterline से कितना नीचे बैठा है, और per-channel Beer-Lambert extinction लगाएं ताकि red कुछ ही meters में मर जाए जबकि blue बना रहे, एक sky mask के साथ ताकि far-plane backdrop fog न हो जाए। Schlick Fresnel refraction को तब mix करता है जब आप सीधे पानी में नीचे देखते हैं और reflection को तब जब आप उसके पार देखते हैं।</p>
<h2 id="पूरा-हो-चुका-कैसा-दिखता-है" tabindex="-1">पूरा हो चुका कैसा दिखता है <a class="header-anchor" href="#पूरा-हो-चुका-कैसा-दिखता-है" aria-label="Permalink to &quot;पूरा हो चुका कैसा दिखता है&quot;"></a></h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/53-water-pro/" title="Spike 53 Water Pro" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/53-water-pro/" target="_blank">Spike 53 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=53-water-pro">Source देखें</a></p>
<p>Spike 53 build-versus-buy check है। यह <code>threejs-water-pro</code> को वैसा ही डालता है जैसा वह ship होता है, अपने tropical preset, default ocean clipmap, camera tracking, और Rayleigh sky के साथ, और वही island glTF load करता है जो library का अपना demo इस्तेमाल करता है। मकसद है एक hand-rolled flat-water shader और एक पूरे ocean system के बीच का फ़र्क़ देखना, और यह फ़र्क़ बड़ा है: इस वाले में एक buoyancy system है जो किसी ship के hull के नीचे कई points पर wave height sample करता है ताकि वह सिर्फ ऊपर-नीचे होने की जगह pitch और roll करे, एक wake generator, shoreline और surface foam, और एक mask pass जो ship के hull के अंदर water rendering को दबा देता है ताकि ripples deck के आर-पार न रिसें।</p>
<p>इसे integrate करने से वो किस्म का detail सामने आया जो आप किसी library को इस्तेमाल करके ही सीखते हैं, उसका README पढ़कर नहीं। Foam textures को preset में filename से reference किया जाता है पर उन्हें load करना consumer का काम है, और उनके बिना shoreline breaking surf की जगह एक सख्त waterline edge जैसा दिखता है। Island ऐसे positioned है कि उसकी underwater geometry ocean floor के पार नीचे गिर जाती है, जिससे library का floor mesh model के बाहरी ring को बिना किसी दिखने वाले plane edge के occlude कर देता है, जो library का intended pattern है: एक 3D model लाओ, terrain synthesize मत करो। और antialiasing renderer पर जानबूझकर off है, एक post-process FXAA pass के पक्ष में, क्योंकि MSAA depth-aware atmospheric fog चलने से पहले edge fragments को background के against blend कर देता है, जहां भी geometry fog से मिलती है वहां एक पतला dark fringe छोड़ देता है। Aliasing को fog से पहले की जगह fog के बाद resolve करने से वह fringe हट जाता है। यह जो de-risk करता है वह खुद decision है: एक production ocean एक बड़ा, specialized system है, और जिन cases में हमें एक चाहिए, वहां एक maintained library अपनाना wakes और buoyancy और foam को शुरू से दोबारा बनाने से बेहतर है, जबकि spike 52 का planar-mirror shader उस छोटे inland water के लिए सही जवाब बना रहता है जिसे कोई creator अपनी दुनिया में रखता है।</p>
<h2 id="इस-chapter-में-reference-की-गई-technology" tabindex="-1">इस chapter में reference की गई technology <a class="header-anchor" href="#इस-chapter-में-reference-की-गई-technology" aria-label="Permalink to &quot;इस chapter में reference की गई technology&quot;"></a></h2>
<p><strong>Screen-space reflection water.</strong> एक reflected view ray DDA के ज़रिए screen space में depth buffer को march करता है, perspective-correct 1/z interpolation का इस्तेमाल करते हुए, per-fragment cost को bound करने के लिए एक hard step cap, और एक capped march जो banding छोड़ता है उसे हटाने के लिए एक binary refinement pass। depth-scaled thickness वाला एक point-to-line confirmation false hits को reject करता है। Method की hard limit यह है कि यह सिर्फ वही geometry reflect कर सकता है जिसे main camera पहले ही sample कर चुका है, इसलिए off-screen और wrong-side surfaces कभी नहीं दिखतीं। देखें <a href="/hi/guides/landscape-generation-browser.html#terrain-materials">terrain materials</a>।</p>
<p><strong>Planar mirror reflection.</strong> Water plane के आर-पार mirror की गई एक helper camera scene को एक offscreen target में render करती है जिसे water shader sample करता है, जो pixel-perfect reflections देता है, उस geometry समेत जिसे SSR देख नहीं सकता। यह वही pattern है जो UE5 Water और three.js <code>WaterMesh</code> इस्तेमाल करते हैं, wave distortion को reflector के UV node पर एक offset के तौर पर लगाया जाता है। एक magnitude-weighted sky fallback ने गलती से dark reflection pixels मिटा दिए; reflector target पहले frame के बाद reliable रहता है, इसलिए fallback हटाना ही fix था।</p>
<p><strong>Beer-Lambert depth tint refraction.</strong> दोनों shaders surface के पीछे का scene sample करते हैं, हर backdrop pixel की waterline से नीचे की depth reconstruct करते हैं, और per-channel exponential extinction (red meters में मरता है, blue बना रहता है) लगाते हैं जो एक water-fog color की तरफ composite होता है, एक sky mask के साथ ताकि far plane fog न हो। Schlick Fresnel normal incidence पर refraction को grazing angles पर reflection के साथ blend करता है।</p>
<p><strong>एक production water library अपनाना.</strong> <code>threejs-water-pro</code> एक ocean clipmap, Rayleigh sky, ship के pitch और roll के लिए multi-point buoyancy, wakes, foam, और एक hull mask pass ship करती है। Consumer-side के details मायने रखते हैं: foam textures को explicitly load करना ज़रूरी है, island की underwater geometry को ocean floor के पार नीचे गिरना चाहिए ताकि floor उसके edges को occlude करे, और antialiasing को MSAA की जगह एक post-process FXAA pass के तौर पर चलना चाहिए ताकि geometry edges पर एक dark fog fringe से बचा जा सके।</p>
<hr>
<p>29 में से भाग 26।
पिछला: <a href="/hi/blog/2026-05-10-open-world-browser-part-25-universal-characters.html">भाग 25 - एक skeleton, हर outfit</a>
अगला: <a href="/hi/blog/2026-05-13-open-world-browser-part-27-island-and-terrain.html">भाग 27 - noise से एक island, ज़मीन जो ज़मीन जैसी दिखे</a>
सीरीज़ गाइड: <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">/blog/2026-02-25-open-world-browser-series-guide</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[आधुनिक engines foliage overdraw को कैसे हराते हैं]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-05-11-foliage-overdraw</link>
            <guid>https://app.cinevva.com/hi/blog/2026-05-11-foliage-overdraw</guid>
            <pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Z-prepasses, octahedral imposters, GPU-driven cluster culling, hashed alpha, visibility buffers, और distance-field shadows: वह stack जो घने जंगल के scenes में 8-15x foliage overdraw को 1-2x में बदल देता है।]]></description>
            <content:encoded><![CDATA[<h1 id="आधुनिक-engines-foliage-overdraw-को-कैसे-हराते-हैं" tabindex="-1">आधुनिक engines foliage overdraw को कैसे हराते हैं <a class="header-anchor" href="#आधुनिक-engines-foliage-overdraw-को-कैसे-हराते-हैं" aria-label="Permalink to &quot;आधुनिक engines foliage overdraw को कैसे हराते हैं&quot;"></a></h1>
<p><em>लेखक <a href="/hi/about.html">Oleg Sidorkin</a>, Cinevva के CTO और सह-संस्थापक</em></p>
<img src="/img/blog/foliage_overdraw_hero.webp" alt="Dense forest canopy with overlapping leaf cards stacked behind each other in front of a setting sun, suggesting heavy overdraw" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>एक जंगल उन सबसे बुरी चीज़ों में से एक है जो आप किसी GPU से render करने को कह सकते हैं। हर पत्ता एक textured quad होता है जिसमें से एक alpha mask काटा गया होता है। ऐसे दर्जनों quads हर view ray के साथ एक-दूसरे के ऊपर ढेर हो जाते हैं। Rasterizer को पहले से जानने का कोई तरीका नहीं होता कि कौन से fragments alpha test पास करेंगे, इसलिए standard early-Z optimization जो opaque scenes को बचाता है, ज़्यादातर बंद हो जाता है। नतीजा यह कि एक ही screen pixel frame के स्थिर होने से पहले पूरे leaf shader को 10 या 15 बार चला सकता है। यही foliage overdraw है, और यह पिछले दशक में आए किसी भी game में एक open-world frame का सबसे महंगा हिस्सा है।</p>
<p>अच्छी खबर यह है कि यह एक हल हो चुकी समस्या है। इस मायने में नहीं कि किसी ने इसे एक ही trick से ठीक कर दिया, बल्कि इस मायने में कि सात या आठ techniques का एक stack है जो मिलकर एक घने जंगल में effective overdraw को 8-15x से घटाकर 1-2x कर देता है। हर आधुनिक engine इस stack का कोई न कोई रूप ship करता है। आइए देखें इसमें क्या है, हर टुकड़ा क्यों मौजूद है, और हर एक के canonical references क्या हैं।</p>
<h2 id="_1-foliage-overdraw-इतना-तकलीफदेह-क्यों-है" tabindex="-1">1. Foliage overdraw इतना तकलीफदेह क्यों है <a class="header-anchor" href="#_1-foliage-overdraw-इतना-तकलीफदेह-क्यों-है" aria-label="Permalink to &quot;1. Foliage overdraw इतना तकलीफदेह क्यों है&quot;"></a></h2>
<p>एक आम opaque scene में GPU early depth rejection करता है: pixel shader के चलने से पहले ही hardware मौजूदा depth buffer को देखता है और उन fragments को skip कर देता है जो पहले से किसी चीज़ के पीछे हैं। यह असल में मुफ्त है और यही घनी geometry की लागत को संभाले रखता है।</p>
<p>Alpha-tested foliage इसे तोड़ देता है। Fragment shader को असल में चलना पड़ता है ताकि alpha texture का मूल्यांकन हो और masked-out pixels पर <code>discard</code> (या <code>clip</code>) call हो। Hardware यह नहीं जान सकता कि कोई fragment मारा जाएगा या नहीं, जब तक shader चल न जाए, इसलिए ज़्यादातर GPUs पर किसी shader में कहीं भी <code>discard</code> का इस्तेमाल उस draw call के लिए early-Z को पूरी तरह बंद कर देता है। Tile-based GPUs (mobile, M-series, कुछ consoles) पर यह पूरे frame के लिए Hi-Z और depth compression को बंद कर सकता है। Pixel shader हर उस triangle के लिए एक बार चलता है जो किसी pixel को ढकता है, और उनमें से ज़्यादातर मूल्यांकन एक discard के साथ खत्म होते हैं।</p>
<p>एक ही screen pixel के सामने 10 leaf quads ढेर कर दें और leaf shader 10 बार चलता है। इसे 40 लाख pixels से गुणा करें और लागत क्रूर हो जाती है। Marco Salvi का लेख <a href="https://therealmjp.github.io/posts/to-earlyz-or-not-to-earlyz/" target="_blank" rel="noreferrer">To Early-Z, or Not To Early-Z</a> hardware स्तर पर यह क्यों होता है इसका सबसे सहज दौरा है, और अगर आपने पहले कभी इसके बारे में नहीं सोचा तो शुरुआत के लिए यही सही जगह है।</p>
<img src="/img/blog/foliage_overdraw_layers.webp" alt="Side view of a single screen pixel ray passing through twelve overlapping leaf cards, with each card highlighted to show stacked alpha-tested fragments" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<h2 id="_2-masked-geometry-के-लिए-depth-prepass" tabindex="-1">2. Masked geometry के लिए depth prepass <a class="header-anchor" href="#_2-masked-geometry-के-लिए-depth-prepass" aria-label="Permalink to &quot;2. Masked geometry के लिए depth prepass&quot;"></a></h2>
<p>सबसे बड़ी अकेली जीत, और वह technique जो हर आधुनिक engine ship करता है, foliage draw को दो passes में बाँटना है। पहला pass सिर्फ़ depth लिखता है, एक न्यूनतम shader के साथ जो alpha test करता है, masked pixels को discard करता है, और और कुछ नहीं लिखता। दूसरा pass पूरे material को render करता है जिसमें depth testing &quot;equal&quot; पर सेट होता है और depth writes बंद होते हैं। अब हर दिखने वाला pixel पूरे BRDF को ठीक एक बार shade करता है, चाहे उसके पीछे कितने भी leaf quads ढेर हों।</p>
<p>यह दोगुना काम लगता है क्योंकि आप एक ही triangles को दो बार छूते हैं, लेकिन prepass shader इतना सस्ता है (एक texture sample, एक discard, एक depth write) कि main pass पर हुई बचत इस अतिरिक्त लागत को बौना कर देती है। एक घने जंगल में main pass पूरे leaf shader को प्रति pixel 10-15 बार चलाने से घटकर ठीक एक बार चलाने पर आ जाता है।</p>
<p>Unreal, Frostbite, Decima, और आधुनिक Rage तथा Dunia शाखाएं सभी यह करती हैं। यही वह मुख्य वजह भी है कि इन engines में masked materials अब भी translucent materials से सस्ते हैं।</p>
<p>गहराई में:</p>
<ul>
<li>Pettineo, <a href="https://therealmjp.github.io/posts/to-earlyz-or-not-to-earlyz/" target="_blank" rel="noreferrer">To Early-Z, or Not To Early-Z</a> (<code>discard</code> Hi-Z और early-Z के साथ कैसे interact करता है, इसका canonical लेख)।</li>
<li>Wihlidal, <a href="http://www.frostbite.com/2016/03/optimizing-the-graphics-pipeline-with-compute/" target="_blank" rel="noreferrer">Optimizing the Graphics Pipeline with Compute</a> (GDC 2016, Frostbite का depth-prepass और prepass-driven culling architecture)।</li>
<li>Sanders, <a href="https://www.gdcvault.com/play/1025066/Between-Tech-and-Art-The" target="_blank" rel="noreferrer">Between Tech and Art: The Vegetation of Horizon Zero Dawn</a> (GDC 2018, Decima के two-pass foliage rendering के साथ)।</li>
<li>Persson, <a href="http://www.humus.name/index.php?page=News&amp;ID=255" target="_blank" rel="noreferrer">A couple of notes about Z</a> (depth-equal testing और prepass अर्थशास्त्र की अब भी सबसे साफ व्याख्याओं में से एक)।</li>
</ul>
<h2 id="_3-आक्रामक-lods-और-octahedral-imposters" tabindex="-1">3. आक्रामक LODs और octahedral imposters <a class="header-anchor" href="#_3-आक्रामक-lods-और-octahedral-imposters" aria-label="Permalink to &quot;3. आक्रामक LODs और octahedral imposters&quot;"></a></h2>
<p>दूसरी सबसे बड़ी जीत है पत्तों को बिल्कुल भी न draw करना जब आपको ज़रूरत न हो। Foliage assets कई LOD tiers के साथ ship होते हैं। सबसे नज़दीकी अलग-अलग leaf cards वाला पूरा mesh होता है। मध्यम दूरी पर पत्ते घने composite cards में सिमट जाते हैं (30 पत्तों का गुच्छा एक ही silhouette वाला 1 textured card बन जाता है)। एक दूरी की सीमा से परे, पूरा पेड़ एक <em>imposter</em> बन जाता है: geometry का एक छोटा टुकड़ा जो पेड़ के कई कोणों से pre-rendered views से textured होता है।</p>
<p>आधुनिक imposter format है <strong>octahedral imposter</strong>: geometry का एक 8-फलकीय टुकड़ा जो octahedral mapping का इस्तेमाल करके एक sphere के points से कैद किए गए views के atlas से textured होता है। Runtime पर shader camera direction के आधार पर सबसे नज़दीकी दो या तीन pre-rendered views चुनता है और उनके बीच blend करता है। नतीजा कुछ-triangle का एक stand-in होता है जो हर कोण से 3D दिखता है और इसमें सही shading, normal maps, और यहां तक कि wind animation हो सकता है। Ryan Brucks का implementation, जो मूल रूप से एक community plugin था और अब Unreal का हिस्सा है, यहां reference है। Microsoft Flight Simulator के अरबों-पेड़ वाले जंगल असल में camera को छोड़कर हर जगह octahedral imposters हैं।</p>
<p>बड़ी संरचनात्मक जीत यह है कि imposters दूरी पर <em>opaque या लगभग-opaque</em> होते हैं। 30-पत्ते वाला composite card 30 quads के बजाय एक ही masked quad है। पूरे-पेड़ का imposter कुछ फलक है, हज़ारों नहीं। Far-field overdraw लगभग शून्य पर सिमट जाता है।</p>
<p>गहराई में:</p>
<ul>
<li>Brucks, <a href="https://shaderbits.com/blog/octahedral-impostors" target="_blank" rel="noreferrer">Octahedral Impostors</a> (canonical reference, math और UE implementation के साथ)।</li>
<li>Halen, <a href="https://dev.epicgames.com/community/learning/tutorials/JmL3/octahedral-impostors-unreal-engine" target="_blank" rel="noreferrer">Octahedral Impostors in Unreal Engine</a> (एकीकृत UE workflow)।</li>
<li>Häggström, <a href="https://www.diva-portal.org/smash/get/diva2:1135856/FULLTEXT01.pdf" target="_blank" rel="noreferrer">Real-Time Rendering of Vegetation</a> (LOD chains, imposters, और उनके पीछे के math को कवर करने वाला एक साफ thesis)।</li>
<li>Crytek, <a href="http://developer.nvidia.com/gpugems/gpugems3/part-i-geometry/chapter-4-next-generation-speedtree-rendering" target="_blank" rel="noreferrer">SpeedTree integration in CryEngine 3</a> (GPU Gems 3, अब भी tree LOD chains पर सबसे अच्छा primer)।</li>
</ul>
<h2 id="_4-cluster-और-gpu-driven-culling" tabindex="-1">4. Cluster और GPU-driven culling <a class="header-anchor" href="#_4-cluster-और-gpu-driven-culling" aria-label="Permalink to &quot;4. Cluster और GPU-driven culling&quot;"></a></h2>
<p>depth prepass के बावजूद, prepass की खुद की एक लागत होती है: इसे अब भी हर दिखने वाले (या संभावित रूप से दिखने वाले) पेड़ के हर triangle को <em>छूना</em> पड़ता है। आधुनिक engines उस लागत को GPU-driven cluster culling से नीचे धकेलते हैं, जो rasterizer के देखने से पहले ही triangles के पूरे समूहों को फेंक देता है।</p>
<p>Pipeline ऐसा दिखता है: हर mesh को 64 या 128 triangles के clusters में पहले से बाँट दिया जाता है, जिनके पास एक tight bounding box और normals का एक cone होता है। Render time पर एक compute shader instance list पर चलता है, हर instance का frustum-test करता है, फिर हर दिखने वाले instance के हर cluster का frustum-test करता है, फिर हर बचे हुए cluster का पिछले frame के depth pyramid के विरुद्ध <em>Hi-Z occlusion-test</em> करता है। पेड़ों की पूरी शाखाएं जो किसी पहाड़ी के पीछे या किसी दूसरे पेड़ के सामने छिपी हैं, किसी भी vertex shader के चलने से पहले cull हो जाती हैं। Output &quot;इन clusters को draw करो&quot; arguments की एक compact list होती है जो सीधे एक ही <code>DrawIndirect</code> call में दी जाती है।</p>
<p>यही वह चीज़ है जो 10,000 पेड़ों के जंगल को सेकंडों के बजाय milliseconds में render कराती है। Ubisoft की Assassin's Creed Unity talk ने इस pipeline को production रूप में पेश किया (20-40% triangles culled, 30-80% shadow triangles culled, पिछली पीढ़ी की तुलना में screen पर 10x ज़्यादा instances), और Wihlidal की Frostbite talk ने इसे और आगे ले गई। UE5 Nanite इस दिशा का दिखने वाला अंतिम रूप है: pixel तक cluster culling।</p>
<p>गहराई में:</p>
<ul>
<li>Haar और Aaltonen, <a href="https://advances.realtimerendering.com/s2015/aaltonenhaar_siggraph2015_combined_final_footer_220dpi.pdf" target="_blank" rel="noreferrer">GPU-Driven Rendering Pipelines</a> (SIGGRAPH 2015, मूलभूत Assassin's Creed Unity talk)।</li>
<li>Wihlidal, <a href="http://www.frostbite.com/2016/03/optimizing-the-graphics-pipeline-with-compute/" target="_blank" rel="noreferrer">Optimizing the Graphics Pipeline with Compute</a> (GDC 2016, Frostbite का GPU-driven prepass)।</li>
<li>Karis, Stubbe, Wihlidal, <a href="https://advances.realtimerendering.com/s2021/Karis_Nanite_SIGGRAPH_Advances_2021_final.pdf" target="_blank" rel="noreferrer">A Deep Dive into Nanite Virtualized Geometry</a> (SIGGRAPH 2021, meshlet granularity पर cluster culling)।</li>
<li>Liktor, <a href="https://research.activision.com/publications/2021/09/geometry-rendering-pipeline-architecture-at-activision" target="_blank" rel="noreferrer">Geometry Rendering Pipeline Architecture at Activision</a> (cluster culling का Call of Duty संस्करण, 2021)।</li>
</ul>
<h2 id="_5-front-to-back-instance-और-cluster-sorting" tabindex="-1">5. Front-to-back instance और cluster sorting <a class="header-anchor" href="#_5-front-to-back-instance-और-cluster-sorting" aria-label="Permalink to &quot;5. Front-to-back instance और cluster sorting&quot;"></a></h2>
<p>एक बार prepass अपना काम कर रहा हो, तो <em>क्रम</em> मायने रखने लगता है। Prepass depth लिखता है, लेकिन सिर्फ़ उन fragments के लिए जो alpha test पास करते हैं। अगर आप जंगल का पिछला हिस्सा पहले और अगला हिस्सा आखिर में draw करें, तो हर front fragment एक back fragment को overwrite करता है, और prepass shader फिर भी back के लिए चलता है। अगर आप front-to-back draw करें, तो हर अगला draw छोटे values के साथ depth buffer को और भरता है, और Hi-Z shader के चलने से पहले back fragments को और-और ज़्यादा reject कर देता है।</p>
<p>यही वजह है कि लगभग हर आधुनिक engine prepass जारी करने से पहले foliage instances को camera से दूरी के हिसाब से sort करता है। Sort सस्ता है (radix sort का इस्तेमाल करके GPU पर कुछ लाख instances), और यह prepass को खुद ही self-pruning operation में बदल देता है। Cluster-level culling इसी वजह से meshlet granularity पर sort करता है। Depth prepass और front-to-back ordering वह जोड़ी है जहां हर एक अच्छा है और दोनों का मेल शानदार है।</p>
<p>गहराई में:</p>
<ul>
<li>Persson, <a href="http://www.humus.name/Articles/Persson_DepthInDepth.pdf" target="_blank" rel="noreferrer">Depth in-depth</a> (depth-buffer ordering, prepass अर्थशास्त्र, और Hi-Z व्यवहार पर architectural notes)।</li>
<li>Giesen, <a href="https://fgiesen.wordpress.com/2011/07/04/a-trip-through-the-graphics-pipeline-2011-part-7/" target="_blank" rel="noreferrer">A trip through the graphics pipeline</a> (Hi-Z reject rate draw order पर कैसे निर्भर करता है इसकी गहरी तकनीकी व्याख्या)।</li>
<li>Wihlidal, <a href="http://www.frostbite.com/2016/03/optimizing-the-graphics-pipeline-with-compute/" target="_blank" rel="noreferrer">Optimizing the Graphics Pipeline with Compute</a> (GDC 2016, Frostbite का GPU-side instance sort शामिल है)।</li>
</ul>
<h2 id="_6-dithered-lod-transitions-और-hashed-alpha" tabindex="-1">6. Dithered LOD transitions और hashed alpha <a class="header-anchor" href="#_6-dithered-lod-transitions-और-hashed-alpha" aria-label="Permalink to &quot;6. Dithered LOD transitions और hashed alpha&quot;"></a></h2>
<p>दूसरा बड़ा जाल है fading। दो LODs के बीच transition करने का (या camera के पास आने पर किसी instance को fade in या out करने का) भोला तरीका alpha blending है। लेकिन blended geometry depth buffer में नहीं लिख सकती, जो हर fading पेड़ को धीमे translucent path में धकेल देता है और prepass को तोड़ देता है। हल है geometry को masked path में रखना और fade को <em>alpha test के अंदर</em> करना।</p>
<p>दो मुख्य techniques:</p>
<ul>
<li><strong>Dithered LOD transitions</strong> एक 4x4 या 8x8 Bayer pattern (या एक screen-space blue-noise texture) sample करती हैं और उसे प्रति-pixel cutoff modifier के रूप में इस्तेमाल करती हैं। 50% blend वाले पेड़ में बचे हुए pixels का एक checkerboard होता है; गायब pixels अगले LOD के पूरक checkerboard से भर जाते हैं। TAA दो या तीन frames में checker को एक smooth blend में हल कर देता है। सस्ता, स्थिर, engine की हर बाकी चीज़ के साथ blend होता है।</li>
<li><strong>Hashed alpha testing</strong> (Wyman &amp; McGuire, I3D 2017) तय 0.5 alpha threshold की जगह [0,1) में एक प्रति-pixel hashed threshold रखता है। दूर की alpha geometry जो सामान्यतः पूरी तरह गायब हो जाती (क्योंकि mipmapped alpha 0.5 से नीचे चला जाता है) बचे हुए pixels का एक स्थिर बिखराव बनाए रखती है। TAA फिर से सफाई करता है।</li>
</ul>
<p>दोनों techniques foliage को opaque/masked path में रखती हैं जहां depth prepass काम करता है, इसलिए किसी चीज़ को सिर्फ़ fade in करने के लिए आपको पूरी translucent rendering लागत नहीं चुकानी पड़ती। <strong>Alpha to coverage</strong> इसी विचार का MSAA-युग वाला रिश्तेदार है: alpha को एक sub-pixel coverage mask में बदलो, masked path छोड़े बिना आंशिक transparency पाओ। पेच यह है कि A2C असल में सिर्फ़ MSAA के साथ चमकता है, जिसे ज़्यादातर आधुनिक deferred renderers अब इस्तेमाल नहीं करते।</p>
<p>गहराई में:</p>
<ul>
<li>Wyman और McGuire, <a href="https://research.nvidia.com/labs/rtr/publication/wyman2017hashed/" target="_blank" rel="noreferrer">Hashed Alpha Testing</a> (I3D 2017, canonical hashed-alpha paper)।</li>
<li>Castaño, <a href="http://the-witness.net/news/2010/09/computing-alpha-mipmaps/" target="_blank" rel="noreferrer">Computing Alpha Mipmaps</a> (The Witness blog, alpha-tested textures को mip करने का सही तरीका ताकि दूर के पेड़ गायब न हों)।</li>
<li>Yuksel, <a href="https://cemyuksel.com/research/alphadistribution/alpha_distribution.pdf" target="_blank" rel="noreferrer">Alpha Distribution for Alpha Testing</a> (alpha mipmaps पर एक और हालिया सुधार)।</li>
<li>NVIDIA, <a href="https://developer.nvidia.com/content/transparency-or-translucency-rendering" target="_blank" rel="noreferrer">Anti-Aliased Alpha Testing</a> (A2C, hashed alpha, और dithered विकल्पों का एक survey)।</li>
</ul>
<h2 id="_7-masked-pixels-पर-shading-लागत-घटाना" tabindex="-1">7. Masked pixels पर shading लागत घटाना <a class="header-anchor" href="#_7-masked-pixels-पर-shading-लागत-घटाना" aria-label="Permalink to &quot;7. Masked pixels पर shading लागत घटाना&quot;"></a></h2>
<p>एकदम सही prepass और एकदम सही culling के बावजूद, आपको अब भी हर दिखने वाले foliage pixel को एक बार shade करना पड़ता है। Engines वह लागत भी घटाते हैं:</p>
<ul>
<li><strong>सस्ता BRDF</strong>। Foliage matte होता है और इसे असल में पूरे Cook-Torrance specular path की ज़रूरत नहीं। एक wrapped-Lambertian diffuse और एक एक-लाइन specular अनुमान काफी है।</li>
<li><strong>कम-frequency normal maps</strong>। पत्ते पहले से ही noisy हैं। एक 256x256 normal map आम viewing distances पर 1024x1024 जैसा ही दिखता है और bandwidth बचाता है।</li>
<li><strong>No parallax, no anisotropy, no clearcoat</strong>। पत्तों के लिए PBR feature menu बंद कर दिया जाता है।</li>
<li><strong>Two-sided thin transmission</strong> पूरे subsurface scattering के बजाय। पत्ते पीछे से रोशनी transmit करते हैं, लेकिन आप इसे एक ही back-light dot product से नकली बना सकते हैं।</li>
<li>कुछ engines में <strong>Half-resolution shading</strong>। Foliage को 1/4 या 1/2 pixel rate पर shade किया जाता है और upscale किया जाता है। TAA का stochastic noise resampling को छिपा देता है।</li>
<li>masked materials पर default रूप से <strong>detail textures और decals को skip करें</strong>।</li>
</ul>
<p>इनमें से हर एक अकेले एक छोटी जीत है। मिलकर, masked-foliage shaders समकक्ष opaque material से 2-3x तेज़ चल सकते हैं।</p>
<p>गहराई में:</p>
<ul>
<li>Lagarde और de Rousiers, <a href="https://seblagarde.wordpress.com/2015/07/14/siggraph-2014-moving-frostbite-to-physically-based-rendering/" target="_blank" rel="noreferrer">Moving Frostbite to Physically Based Rendering 3.0, foliage और translucency पर sections</a> (SIGGRAPH 2014, thin two-sided materials के लिए canonical PBR adjustments)।</li>
<li>Jimenez, <a href="https://www.iryoku.com/stare-into-the-future" target="_blank" rel="noreferrer">Next Generation Character Rendering</a> (wrapped-Lambertian और back-translucency math, मूल रूप से त्वचा के लिए पर पत्तों में व्यापक रूप से port किया गया)।</li>
<li>Sanders, <a href="https://www.gdcvault.com/play/1025066/Between-Tech-and-Art-The" target="_blank" rel="noreferrer">Between Tech and Art: The Vegetation of Horizon Zero Dawn</a> (GDC 2018, Decima के foliage shader सरलीकरणों के साथ)।</li>
</ul>
<h2 id="_8-masked-materials-के-लिए-visibility-buffers-और-nanite" tabindex="-1">8. Masked materials के लिए visibility buffers और Nanite <a class="header-anchor" href="#_8-masked-materials-के-लिए-visibility-buffers-और-nanite" aria-label="Permalink to &quot;8. Masked materials के लिए visibility buffers और Nanite&quot;"></a></h2>
<p>overdraw का सबसे साफ जवाब है <em>shading को rasterization से पूरी तरह अलग कर देना</em>। एक visibility buffer geometry को एक पतले buffer में rasterize करता है (प्रति pixel सिर्फ़ triangle ID और instance ID), फिर पूरे material को एक deferred pass के रूप में चलाता है जो visibility buffer पढ़ता है और हर pixel को ठीक एक बार shade करता है। संरचना के हिसाब से ही, shading stage पर कोई overdraw नहीं होता। Burns और Hunt के 2013 के paper ने यह पेश किया; UE5 Nanite production-quality साकार रूप है, जिसमें UE 5.5 से masked foliage भी शामिल है।</p>
<p>Nanite का मोड़ यह है कि यह cluster-level virtualized geometry के साथ ऐसा करता है, इसलिए rasterizer खुद sub-pixel triangles के लिए एक software path पर चलता है और overdraw को सीमित रखता है। Nanite में masked materials को &quot;programmable raster&quot; feature की ज़रूरत होती है: alpha test visibility-buffer pass के दौरान चलता है, लेकिन material shading अब भी deferred resolve में प्रति दिखने वाले pixel एक बार होती है। नतीजा यह कि बहुत घना Nanite foliage, जो कभी masked materials पर धीमा होने के लिए बदनाम था, अब opaque के बराबर या उससे भी सस्ता है, क्योंकि shading समय पर overdraw शून्य है। एक tradeoff है: अक्सर low-poly masked-card पेड़ों को रखने के बजाय high-poly <em>opaque</em> tree geometry को Nanite से धकेलना बेहतर होता है, क्योंकि masked path programmable-raster लागत जोड़ता है।</p>
<p>गहराई में:</p>
<ul>
<li>Burns और Hunt, <a href="http://jcgt.org/published/0002/02/04/" target="_blank" rel="noreferrer">The Visibility Buffer: A Cache-Friendly Approach to Deferred Shading</a> (JCGT 2013, मूल paper)।</li>
<li>Karis, Stubbe, Wihlidal, <a href="https://advances.realtimerendering.com/s2021/Karis_Nanite_SIGGRAPH_Advances_2021_final.pdf" target="_blank" rel="noreferrer">A Deep Dive into Nanite Virtualized Geometry</a> (SIGGRAPH 2021, production architecture)।</li>
<li>Epic, <a href="https://media.gdcvault.com/gdc2024/Slides/GDC+slide+presentations/Nanite+GPU+Driven+Materials.pdf" target="_blank" rel="noreferrer">Nanite GPU Driven Materials</a> (GDC 2024, masked-material और programmable-raster pipeline के साथ)।</li>
<li><a href="https://www.sctheblog.com/blog/nanite-materials-notes/" target="_blank" rel="noreferrer">Notes from &quot;Nanite GPU Driven Materials&quot;</a> (उसी talk का एक साफ तीसरे-पक्ष का walkthrough)।</li>
</ul>
<h2 id="_9-foliage-के-लिए-अलग-shadow-representations" tabindex="-1">9. Foliage के लिए अलग shadow representations <a class="header-anchor" href="#_9-foliage-के-लिए-अलग-shadow-representations" aria-label="Permalink to &quot;9. Foliage के लिए अलग shadow representations&quot;"></a></h2>
<p>Alpha-tested foliage के लिए shadow maps किसी भी open-world frame में दूसरी सबसे महंगी shadow समस्या है, बड़े cascades के बाद। हर cascade को अपने depth prepass की ज़रूरत होती है, हर prepass alpha test चलाता है, और लागत 4 cascades और दर्जनों light frusta में तेज़ी से ढेर हो जाती है। इसलिए ज़्यादातर engines foliage shadows को उस तरह render नहीं करते जैसे वे foliage color render करते हैं।</p>
<p>आम विकल्प:</p>
<ul>
<li><strong>Mesh distance-field shadows</strong> (UE Lumen, custom engines)। हर mesh के पास एक precomputed signed distance field होता है। SDF के बीच से एक छोटा cone trace alpha-tested mesh को छुए बिना एक soft shadow देता है। पेड़ों के लिए खास तौर पर अच्छा क्योंकि SDF canopy silhouette को एक ही ठोस blob के रूप में कैद करता है और प्रति-पत्ता detail को नज़रअंदाज़ कर देता है।</li>
<li><strong>Foliage के लिए कम-resolution cascades</strong>। Foliage shadows एक half-resolution slice में जाते हैं और edge-aware filtering के साथ up-sample होते हैं। आंख resolution गिरावट को नहीं देखती क्योंकि shadows पहले से ही soft हैं।</li>
<li><strong>MSAA के साथ alpha-to-coverage shadow maps</strong>। जिन engines के shadow path में अब भी MSAA है, उन पर A2C पूरी alpha test लागत के बिना smooth-edged foliage shadows देता है।</li>
<li><strong>तने और बड़ी शाखाओं के लिए capsule shadows</strong>, canopy के लिए distance-field, पूरी alpha test सिर्फ़ सबसे नज़दीकी cascade पर। अलग-अलग दूरियों के लिए अलग-अलग representations, lighting pass में blend।</li>
<li><strong>WPO disable distance</strong>। Wind-driven World Position Offset एक threshold से परे मार दिया जाता है ताकि cached shadow data frames में valid रहे। UE के Virtual Shadow Maps इस पर बहुत भरोसा करते हैं।</li>
</ul>
<p>गहराई में:</p>
<ul>
<li>Epic, <a href="https://dev.epicgames.com/documentation/unreal-engine/distance-field-soft-shadows-in-unreal-engine" target="_blank" rel="noreferrer">Distance Field Soft Shadows in Unreal Engine</a> (mesh DF shadows के लिए canonical UE reference)।</li>
<li>Wright, <a href="https://advances.realtimerendering.com/s2022/SIGGRAPH2022-Advances-Lumen-Wright%20et%20al.pdf" target="_blank" rel="noreferrer">Lumen: Real-Time Global Illumination in Unreal Engine 5</a> (SIGGRAPH 2022, foliage के लिए Lumen के mesh-SDF integration के साथ)।</li>
<li>Epic, <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/virtual-shadow-maps-in-unreal-engine" target="_blank" rel="noreferrer">Virtual Shadow Maps</a> (आधुनिक UE5 shadow architecture, foliage-विशिष्ट WPO disable और caching नियमों के साथ)।</li>
<li>Persson, <a href="https://www.humus.name/index.php?page=3D&amp;ID=81" target="_blank" rel="noreferrer">Practical Cascaded Shadow Maps</a> (अब भी canonical CSM reference, alpha-tested casters पर notes के साथ)।</li>
</ul>
<h2 id="_10-wind-animation-और-shadow-caching" tabindex="-1">10. Wind, animation, और shadow caching <a class="header-anchor" href="#_10-wind-animation-और-shadow-caching" aria-label="Permalink to &quot;10. Wind, animation, और shadow caching&quot;"></a></h2>
<p>एक सूक्ष्म संबंधित समस्या: ज़्यादातर foliage हिलता है। Wind-driven vertex animation (UE में World Position Offset, Frostbite और Decima में समकक्ष) का मतलब है कि foliage geometry frame दर frame स्थिर नहीं रहती, जो shadow caching और reprojection को तोड़ देता है। आधुनिक engines इससे दो तरीकों से लड़ते हैं:</p>
<ul>
<li><strong>दूरी पर WPO को सीमित करें</strong>। एक threshold से परे wind animation का amplitude सहजता से शून्य हो जाता है। आंख वैसे भी उतनी दूर के झूलने को नहीं देख सकती, और shadow caches valid रहते हैं।</li>
<li><strong>Wind को cluster bounds में bake करें</strong>। Cluster bounding boxes अधिकतम WPO offset से फुला दिए जाते हैं ताकि culling बिना प्रति frame re-upload के conservative बनी रहे।</li>
<li><strong>Per-instance phase offsets</strong>। एक जैसे पेड़ wind phase को offset करने के लिए एक प्रति-instance random seed का इस्तेमाल करते हैं, ताकि एक जंगल प्रति पेड़ अलग animation की कीमत चुकाए बिना एक साथ कदम-से-कदम न झूले।</li>
</ul>
<p>यह वह तरह का detail है जो technique lists में नहीं दिखता पर असल में 3 ms जंगल और 9 ms जंगल के बीच का फर्क है।</p>
<p>गहराई में:</p>
<ul>
<li>Sanders, <a href="https://www.gdcvault.com/play/1025066/Between-Tech-and-Art-The" target="_blank" rel="noreferrer">Between Tech and Art: The Vegetation of Horizon Zero Dawn</a> (GDC 2018, Decima wind-animation pipeline और shadow caching के साथ)।</li>
<li>McAuley, <a href="https://www.gdcvault.com/play/1022235/Rendering-the-World-of-Far" target="_blank" rel="noreferrer">Rendering the World of Far Cry 4</a> (GDC 2015, vegetation के लिए wind-grid sampling शामिल है)।</li>
<li>Epic, <a href="https://dev.epicgames.com/community/learning/tutorials/qLk6/unreal-engine-virtual-shadow-maps" target="_blank" rel="noreferrer">Foliage and Virtual Shadow Maps</a> (WPO disable distance और VSM caching पर UE5 community मार्गदर्शन)।</li>
</ul>
<h2 id="_11-संयुक्त-गणित" tabindex="-1">11. संयुक्त गणित <a class="header-anchor" href="#_11-संयुक्त-गणित" aria-label="Permalink to &quot;11. संयुक्त गणित&quot;"></a></h2>
<p>इनमें से कोई trick रामबाण नहीं है। दिलचस्प बात यह है कि जब आप इन्हें एक के ऊपर एक रखते हैं तो क्या होता है:</p>
<ul>
<li>एक घने जंगल scene पर एक भोला masked-foliage pass 8-15x effective overdraw मापता है। हर दिखने वाला pixel leaf shader को 8 से 15 बार चलाता है।</li>
<li>एक depth prepass जोड़ें और main pass ~1x overdraw पर गिर जाता है, पर prepass खुद अब भी सब कुछ छूता है।</li>
<li>Front-to-back sorting जोड़ें और prepass खुद को pruning करने लगता है।</li>
<li>Cluster-level GPU culling जोड़ें और prepass सिर्फ़ उसे छूता है जो संभवतः दिख सकता है।</li>
<li>LOD chains और imposters जोड़ें और 30 m से परे दिखने वाले quads की <em>संख्या</em> एक अंक के क्रम से गिर जाती है।</li>
<li>Visibility-buffer / Nanite path जोड़ें और shading stage घने overlap पर भी सचमुच प्रति pixel एक बार चलता है।</li>
<li>Distance-field shadows जोड़ें और shadow लागत alpha test के साथ scale करना बंद कर देती है।</li>
</ul>
<p>मुख्य नतीजा, जो ऊपर लिंक की गई talks में बार-बार दोहराया गया है: effective overdraw 8-15x से 1-2x में सिमट जाता है, और एक घने जंगल scene में कुल foliage frame लागत 4-6x गिर जाती है। यही पूरी वजह है कि आधुनिक open-world games consumer hardware पर जंगलों को 60+ fps पर render कर सकते हैं।</p>
<img src="/img/blog/foliage_overdraw_pipeline.webp" alt="Diagram showing the foliage rendering pipeline as five stacked stages: GPU culling, sorted prepass, masked color pass with depth-equal, visibility-buffer shading, and separate distance-field shadow path" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<h2 id="_12-browser-के-लिए-इसका-क्या-मतलब-है" tabindex="-1">12. Browser के लिए इसका क्या मतलब है <a class="header-anchor" href="#_12-browser-के-लिए-इसका-क्या-मतलब-है" aria-label="Permalink to &quot;12. Browser के लिए इसका क्या मतलब है&quot;"></a></h2>
<p>इस stack का ज़्यादातर हिस्सा WebGPU पर साफ-साफ map होता है। हम पहले ही <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">open-world browser engine</a> में GPU-driven culling, indirect dispatch, Hi-Z occlusion, और front-to-back sorted prepasses ship कर चुके हैं। Masked geometry के लिए depth prepass सीधा है: WebGPU fragment shaders में depth-equal testing और <code>discard</code> का समर्थन करता है, early-Z को लेकर उन्हीं चेतावनियों के साथ। Octahedral imposters यांत्रिक रूप से port होते हैं, math बस sphere-to-octahedron unwrapping और atlas indexing है।</p>
<p>मुश्किल टुकड़े आधुनिक वाले हैं। WebGPU में एक visibility buffer का मतलब है एक render target में 32-bit triangle ID लिखना और एक fullscreen compute pass में materials को resolve करना; building blocks मौजूद हैं पर orchestration जटिल है। Mesh distance-field shadows प्रति asset एक 3D texture और एक छोटा cone trace चाहते हैं, दोनों WebGPU की पहुंच में हैं। Hashed alpha और dithered LODs हर एक एक shader function हैं।</p>
<p>Browser foliage के लिए आगे का रास्ता वही है जो इस stack में बाकी हर चीज़ के लिए है: सस्ते, मज़बूत टुकड़े पहले ship करो (prepass, sorted instances, LODs, imposters, hashed alpha) और भारी मशीनरी (visibility buffer, mesh-SDF shadows) उसके ऊपर जोड़ो। Browser hardware का floor आखिरकार इतना ऊंचा है कि कोई architectural वजह नहीं कि एक WebGPU जंगल किसी console जैसे न दिखे और न चले। बस engineering वजहें हैं, और engineering वजहें वही हैं जो हमें पसंद हैं।</p>
<h2 id="पूरे-stack-में-आगे-पढ़ने-के-लिए" tabindex="-1">पूरे stack में आगे पढ़ने के लिए <a class="header-anchor" href="#पूरे-stack-में-आगे-पढ़ने-के-लिए" aria-label="Permalink to &quot;पूरे stack में आगे पढ़ने के लिए&quot;"></a></h2>
<p>अगर आप एक ऐसा source चाहते हैं जो यह सब एक साथ खींच लाए, तो SIGGRAPH &quot;Advances in Real-Time Rendering in Games&quot; archive (<a href="https://advances.realtimerendering.com/" target="_blank" rel="noreferrer">advances.realtimerendering.com</a>) में 2014 तक की canonical foliage और GPU-driven-rendering talks हैं। Adrian Courrèges के <a href="http://www.adriancourreges.com/blog/" target="_blank" rel="noreferrer">GPU profiling articles</a> में GTA V और Horizon Zero Dawn के frame-by-frame breakdowns हैं जो यहां चर्चित हर pass को production क्रम में दिखाते हैं। खास तौर पर alpha-test math के लिए, Chris Wyman के <a href="https://cwyman.org/" target="_blank" rel="noreferrer">research page</a> पर reference shaders के साथ hashed-alpha और stochastic-transparency papers हैं। और <a href="https://www.realtimerendering.com/" target="_blank" rel="noreferrer">Real-Time Rendering, 4th edition</a> के transparency, sampling, और depth handling पर अध्याय अब भी पाठ्यपुस्तक की शुरुआती जगह हैं।</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ब्राउज़र में एक ओपन वर्ल्ड बनाना, भाग 25: एक स्केलेटन, हर पोशाक]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-05-10-open-world-browser-part-25-universal-characters</link>
            <guid>https://app.cinevva.com/hi/blog/2026-05-10-open-world-browser-part-25-universal-characters</guid>
            <pubDate>Sun, 10 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[स्पाइक 50 ने यह जांचा कि क्या एक CC0 कैरेक्टर पैक पूरे avatar कस्टमाइज़ेशन प्रोडक्ट को संभाल सकता है। चार Quaternius पैक जानबूझकर एक ही 65-जॉइंट स्केलेटन साझा करते निकले, जिसने इस स्पाइक को एनिमेशन-पाइपलाइन की समस्या से बदलकर नाम-आधारित स्केलेटन री-बाइंडिंग के अभ्यास में बदल दिया।]]></description>
            <content:encoded><![CDATA[<h1 id="ब्राउज़र-में-एक-ओपन-वर्ल्ड-बनाना-भाग-25-एक-स्केलेटन-हर-पोशाक" tabindex="-1">ब्राउज़र में एक ओपन वर्ल्ड बनाना, भाग 25: एक स्केलेटन, हर पोशाक <a class="header-anchor" href="#ब्राउज़र-में-एक-ओपन-वर्ल्ड-बनाना-भाग-25-एक-स्केलेटन-हर-पोशाक" aria-label="Permalink to &quot;ब्राउज़र में एक ओपन वर्ल्ड बनाना, भाग 25: एक स्केलेटन, हर पोशाक&quot;"></a></h1>
<p><em><a href="/hi/about.html">Oleg Sidorkin</a> द्वारा, Cinevva के CTO और सह-संस्थापक</em></p>
<p>यहाँ नए हैं? <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">सीरीज़ गाइड</a> का इस्तेमाल करें। यह बताती है कि स्पाइक क्या होता है और सभी भागों को लिंक करती है।</p>
<p><a href="/hi/blog/2026-05-09-open-world-browser-part-24-persistence-and-wind.html">भाग 24</a> ने वर्ल्ड को persistent बनाया और उसकी वनस्पति को हवा दी। यह भाग फिर से उसमें मौजूद लोगों के बारे में है, लेकिन वॉर्डरोब की तरफ से: क्या एक creator एक बेस बॉडी चुन सकता है, कपड़े बदल सकता है, हेयरस्टाइल चुन सकता है, और कोई भी एनिमेशन चला सकता है, वह सब एक मुफ्त asset पैक पर, बिना किसी rigging और बिना किसी एनिमेशन authoring के? एक कस्टम rig बनाना de-risk करने लायक सही चीज़ नहीं है। जवाब देने लायक सवाल यह है कि क्या एक CC0 पैक पूरा भार उठा सकता है।</p>
<h2 id="एक-पैक-जो-आपस-में-फिट-होने-के-लिए-ही-बनाया-गया-था" tabindex="-1">एक पैक जो आपस में फिट होने के लिए ही बनाया गया था <a class="header-anchor" href="#एक-पैक-जो-आपस-में-फिट-होने-के-लिए-ही-बनाया-गया-था" aria-label="Permalink to &quot;एक पैक जो आपस में फिट होने के लिए ही बनाया गया था&quot;"></a></h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/50-universal-characters/" title="Spike 50 Universal Characters" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/50-universal-characters/" target="_blank">Spike 50 को नए टैब में खोलें ↗</a> · <a href="/blog/spike-source?spike=50-universal-characters">सोर्स देखें</a></p>
<p>Quaternius चार assets भेजता है जो लगभग संदेहास्पद रूप से अच्छी तरह मेल खाते हैं: Universal Base Characters जिसमें पुरुष और महिला बॉडी के साथ आठ हेयरस्टाइल और दो आइब्रो सेट हैं, Modular Character Outfits जो body, arms, legs और feet हिस्सों में बँटे हैं और साथ में pauldrons और एक hood जैसी accessories हैं, और Universal Animation Library पैक एक और दो, कुल मिलाकर 262 क्लिप जो locomotion, combat, climbing, farming, fishing, idles और social moves को कवर करते हैं। उनके glTF का निरीक्षण करने पर पता चला कि वे क्यों फिट होते हैं: चारों पैक का हर एक mesh एक ही 65-जॉइंट UE5-स्टाइल स्केलेटन पर rigged है, वही जॉइंट नाम, वही bind poses, root से pelvis और spine होते हुए head तक, हर तरफ पंद्रह उँगली जॉइंट वाली मिरर की हुई arms, मिरर की हुई legs। कोई retargeting नहीं चाहिए। यह स्पाइक 35 की तीन-स्केलेटन retargeting समस्या के बिल्कुल उलट है, जहाँ एक 213-बोन फेस rig को एक 65-बोन Mixamo rig से बात करनी पड़ती थी। यहाँ चारों पैक जानबूझकर एनिमेशन लाइब्रेरी के स्केलेटन पर authored थे, और यह जुड़ाव बिल्कुल सटीक है।</p>
<p>इसने इस स्पाइक को एनिमेशन-पाइपलाइन के अभ्यास के बजाय एक बाइंडिंग अभ्यास में बदल दिया। बेस लेयर एक body glTF लोड करती है, सीन को <code>SkeletonUtils.clone</code> से क्लोन करती है ताकि हर कैरेक्टर को एक ताज़ा स्केलेटन इंस्टेंस मिले बजाय इसके कि bone म्यूटेशन वापस loader के कैश्ड सीन में जाएँ, और उस 65-बोन स्केलेटन को canonical के रूप में कैश करती है साथ ही उस armature ऑब्जेक्ट को भी जो एनिमेशन का root है।</p>
<h2 id="एक-कोट-को-बॉडी-पर-री-बाइंड-करना" tabindex="-1">एक कोट को बॉडी पर री-बाइंड करना <a class="header-anchor" href="#एक-कोट-को-बॉडी-पर-री-बाइंड-करना" aria-label="Permalink to &quot;एक कोट को बॉडी पर री-बाइंड करना&quot;"></a></h2>
<p>जो ट्रिक पूरी चीज़ को काम करवाती है वह यह है कि आप किसी outfit के mesh को सीधे सीन में दोबारा parent नहीं कर सकते, क्योंकि वह अब भी अपने खुद के glTF की bones को रेफर करता है, जो एक अलग subtree में बैठी होती हैं। हर modular हिस्सा, एक peasant body या एक ranger की legs, अपने खुद के SkinnedMesh के रूप में आता है जिसके पास उसी armature का अपना क्लोन होता है। बाइंडिंग सोर्स स्केलेटन की bones को उनके मूल क्रम में चलती है, हर एक को नाम से canonical स्केलेटन में ढूँढती है, और उन री-बाउंड bones से एक नया <code>Skeleton</code> बनाती है जो सोर्स के bind-inverse मैट्रिसेज़ को फिर से इस्तेमाल करता है, फिर सोर्स के identity bind मैट्रिक्स के साथ <code>SkinnedMesh.bind</code> को कॉल करती है। बाइंडिंग के बाद, mesh अपने सोर्स सीन से अलग हो जाता है और सीधे कैरेक्टर root के नीचे parent हो जाता है। चूँकि bind मैट्रिक्स bind समय पर world transform को कैप्चर कर लेता है और root identity पर बैठा है, mesh का अपना world transform आउटपुट को कभी प्रभावित नहीं करता और skinning पूरी तरह अब-साझा bones के ज़रिए होती है।</p>
<p>Hair और eyebrows भी slots हैं, और उन्होंने एक गलत धारणा को सुधार दिया। फोल्डर स्ट्रक्चर कहता था &quot;rigged to head bone,&quot; जिससे लगता था कि hair एक स्टैटिक mesh होगा जो head के साथ एक baked offset के साथ parent किया गया है। ऐसा नहीं है। हर hair फाइल एक SkinnedMesh है जो सभी 65 जॉइंट पर weighted है, जिसमें long hair का weight ऊपरी spine और neck में फैलता है ताकि कैरेक्टर के नीचे देखने पर वह झूल जाए। तो hair भी किसी भी outfit हिस्से जैसा ही नाम-आधारित री-बाइंडिंग रास्ता अपनाता है। एकमात्र खास मामला outfit body slot है: जब यह attach होता है, तो बेस body mesh को छिपा दिया जाता है ताकि outfit उसमें से clip न करे, जबकि arms, legs, feet और accessories बस एक के ऊपर एक स्टैक हो जाते हैं क्योंकि पैक ने उन्हें इस तरह authored किया है कि वे बेस body के साथ सह-अस्तित्व में रहें और जहाँ कपड़े त्वचा को खुला छोड़ते हैं वहाँ वह दिखती रहे।</p>
<h2 id="मुफ्त-में-262-एनिमेशन" tabindex="-1">मुफ्त में 262 एनिमेशन <a class="header-anchor" href="#मुफ्त-में-262-एनिमेशन" aria-label="Permalink to &quot;मुफ्त में 262 एनिमेशन&quot;"></a></h2>
<p>एक बार स्केलेटन साझा हो जाने के बाद एनिमेशन लगभग anticlimactic है। दोनों लाइब्रेरी glbs लोड होती हैं, उनके क्लिप एक नामांकित सूची में सपाट हो जाते हैं, और उन क्लिप में track नाम सटीक जॉइंट नामों को <code>bone.position</code>, <code>bone.quaternion</code> और <code>bone.scale</code> के ज़रिए रेफर करते हैं। कैरेक्टर के armature पर rooted एक <code>AnimationMixer</code> उन bones को नाम से ढूँढता है और उन्हें सीधे चलाता है, स्विच पर crossfade करते हुए। viewer का दायाँ पैनल सभी 262 क्लिप की एक फ़िल्टर-योग्य सूची है जिसमें एक source pill है, तो &quot;fish&quot; खोजने पर दोनों लाइब्रेरी की हर fishing एनिमेशन सामने आ जाती है। सॉफ्ट shadows के साथ स्टैंडर्ड three-point lighting, पैरों के नीचे एक polar grid, और ACES tone mapping स्टाइलाइज़्ड बेस textures को पढ़ने लायक बनाए रखते हैं बिना गहरे bodysuit की shadows को कुचले।</p>
<p>यह प्रोडक्ट के लिए जो de-risk करता है वह बहुत बड़ा है। avatar कस्टमाइज़ेशन फीचर शून्य rigging काम और शून्य एनिमेशन authoring के साथ एक CC0 पैक पर शिप हो सकता है: चारों पैक डाल दें, एक वॉर्डरोब UI वायर कर दें, और आपके पास लगभग छह outfits गुणा आठ हेयरस्टाइल गुणा दो लिंग गुणा 262 एनिमेशन जितनी विविधता बॉक्स से बाहर निकलते ही मिल जाती है। 65-जॉइंट स्केलेटन इतना छोटा है कि GPU skinning की लागत नगण्य है, और स्पाइक 45 का batched-skinning काम इस आकार के rig पर पहले से ही 200-प्लस avatars संभाल लेता है। CC0 पर कोई इस्तेमाल पाबंदी नहीं होती, तो एक paid creator प्लेटफॉर्म पर commercial उपयोग ठीक है। बाकी बचा खुला सवाल कस्टम-अपलोड किए गए outfits का है, जो एक Phase 3 की समस्या है और इसे अपलोड समय पर इस canonical स्केलेटन पर retargeting करके हल किया जाता है, जो स्पाइक 35 की runtime retargeting का उलटा है। asset का फुटप्रिंट डिस्क पर लगभग 147 MB है जो raw 2K PNGs और uncompressed एनिमेशन glbs के रूप में है, जिसे production KTX2 texture compression और एक gltf-transform पास के साथ घटाकर लगभग 30 MB कर देगा।</p>
<h2 id="इस-अध्याय-में-संदर्भित-तकनीक" tabindex="-1">इस अध्याय में संदर्भित तकनीक <a class="header-anchor" href="#इस-अध्याय-में-संदर्भित-तकनीक" aria-label="Permalink to &quot;इस अध्याय में संदर्भित तकनीक&quot;"></a></h2>
<p><strong>एक पैक भर में एक canonical स्केलेटन।</strong> चार Quaternius पैक (बेस बॉडी, modular outfits, दो एनिमेशन लाइब्रेरी) सभी एक समान 65-जॉइंट UE5-स्टाइल स्केलेटन पर एक ही जॉइंट नामों और bind poses के साथ rigged हैं, तो उन्हें जोड़ने के लिए कोई retargeting नहीं चाहिए। बेस को <code>SkeletonUtils.clone</code> से क्लोन करने पर हर कैरेक्टर को loader के कैश्ड सीन को म्यूटेट करने के बजाय एक ताज़ा स्केलेटन इंस्टेंस मिलता है।</p>
<p><strong>नाम-आधारित स्केलेटन री-बाइंडिंग।</strong> हर modular हिस्सा अपने खुद के armature को रेफर करते हुए अपना खुद का SkinnedMesh भेजता है। री-बाइंडिंग सोर्स bones को क्रम में चलती है, हर एक को नाम से canonical स्केलेटन में मैप करती है, सोर्स bind-inverses को फिर से इस्तेमाल करते हुए एक नया <code>Skeleton</code> बनाती है, और identity bind मैट्रिक्स के साथ <code>SkinnedMesh.bind</code> को कॉल करती है, फिर mesh को साझा कैरेक्टर root के नीचे parent करती है ताकि skinning पूरी तरह साझा bones के ज़रिए चले। outfit body slot clipping से बचने के लिए बेस body को छिपा देता है; बाकी slots स्टैक हो जाते हैं।</p>
<p><strong>एक skinned slot के रूप में Hair।</strong> Hair एक स्टैटिक head-bone attachment नहीं बल्कि एक SkinnedMesh है जो सभी 65 जॉइंट पर weighted है, जिसमें long hair को ऊपरी spine और neck में weight किया गया है ताकि नीचे देखने पर वह झूल जाए। यह outfit हिस्सों जैसा ही री-बाइंडिंग रास्ता अपनाता है।</p>
<p><strong>मुफ्त में नाम-कुंजी आधारित एनिमेशन retargeting।</strong> Animation Library क्लिप जॉइंट को सटीक नाम से रेफर करते हैं, तो साझा armature पर rooted एक <code>AnimationMixer</code> सभी 262 क्लिप को crossfade के साथ सीधे चलाता है, बिना किसी प्रति-क्लिप retargeting के। एक CC0 लाइसेंस commercial उपयोग को कवर करता है, और छोटा जॉइंट काउंट GPU skinning को इतना सस्ता रखता है कि स्पाइक 45 के batched-skinning रास्ते को फिर से इस्तेमाल किया जा सके। देखें <a href="/hi/guides/landscape-generation-browser.html#gpu-driven-lod-with-webgpu">GPU-driven LOD</a>।</p>
<hr>
<p>29 में से भाग 25।
पिछला: <a href="/hi/blog/2026-05-09-open-world-browser-part-24-persistence-and-wind.html">भाग 24 - एक वर्ल्ड को सेव करना, और वह हवा जो आप देख सकते हैं</a>
अगला: <a href="/hi/blog/2026-05-12-open-world-browser-part-26-water.html">भाग 26 - वह पानी जो हर पैमाने पर टिकता है</a>
सीरीज़ गाइड: <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">/blog/2026-02-25-open-world-browser-series-guide</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Browser में open world बनाना, भाग 24: एक दुनिया को सहेजना, और हवा जो आपको दिखे]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-05-09-open-world-browser-part-24-persistence-and-wind</link>
            <guid>https://app.cinevva.com/hi/blog/2026-05-09-open-world-browser-part-24-persistence-and-wind</guid>
            <pubDate>Sat, 09 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Spike 47 ने world edits को टिकाऊ बनाया: एक Durable Object जो ownership का फैसला करता है, per-chunk binary blobs को persist करता है, और एक commutative edit protocol के ज़रिए हर peer के terrain को converge करता है। Spike 49 ने Quaternius के Godot wind shaders को TSL में ईमानदारी से port किया, फिर एक per-frame recompile का पीछा किया जिसने scene को 1 fps तक गिरा दिया था।]]></description>
            <content:encoded><![CDATA[<h1 id="browser-में-open-world-बनाना-भाग-24-एक-दुनिया-को-सहेजना-और-हवा-जो-आपको-दिखे" tabindex="-1">Browser में open world बनाना, भाग 24: एक दुनिया को सहेजना, और हवा जो आपको दिखे <a class="header-anchor" href="#browser-में-open-world-बनाना-भाग-24-एक-दुनिया-को-सहेजना-और-हवा-जो-आपको-दिखे" aria-label="Permalink to &quot;Browser में open world बनाना, भाग 24: एक दुनिया को सहेजना, और हवा जो आपको दिखे&quot;"></a></h1>
<p><em>लेखक <a href="/hi/about.html">Oleg Sidorkin</a>, Cinevva के CTO और सह-संस्थापक</em></p>
<p>यहाँ नए हैं? <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">series guide</a> का इस्तेमाल करें। यह बताती है कि spike क्या होता है और सभी भागों को link करती है।</p>
<p><a href="/hi/blog/2026-05-08-open-world-browser-part-23-avatars-and-voice.html">भाग 23</a> ने दुनिया में लोगों को रखा और उन्हें एक आवाज़ दी। यह भाग इस बारे में है कि दुनिया को यह याद रखवाना कि लोगों ने उसके साथ क्या किया, और उसे तब भी जीवंत महसूस कराना जब कोई उसे छू नहीं रहा हो। Spike 47 persistence है: एक creator terrain को आकार देता है और props रखता है, और वे edits एक reload के बाद बच जाते हैं, हर दूसरे peer के साथ sync होते हैं, और जब दो लोग एक साथ edit करें तो साफ़-सुथरे तरीके से फैसला हो जाता है। Spike 49 wind है: एक stylized nature pack के vegetation shaders को port करना ताकि पेड़, झाड़ियाँ और घास उस तरह हिलें जैसा artist ने चाहा था, जो math से ज़्यादा shader compiler के साथ एक लड़ाई बन गई।</p>
<h2 id="एक-दुनिया-जो-याद-रखती-है" tabindex="-1">एक दुनिया जो याद रखती है <a class="header-anchor" href="#एक-दुनिया-जो-याद-रखती-है" aria-label="Permalink to &quot;एक दुनिया जो याद रखती है&quot;"></a></h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/47-world-persistence/" title="Spike 47 World Persistence" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/47-world-persistence/" target="_blank">Spike 47 को एक नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=47-world-persistence">Source देखें</a></p>
<p>सेटअप एक shared authoring session है। Players एक दुनिया में चलते हैं, एक click से props रखते हैं, एक right-click से उन्हें हटाते हैं, और एक brush को drag करके ज़मीन को आकार देते हैं, heightmap को ऊपर-नीचे करते हैं या SDF terrain में volumetric गुफाएँ काटते हैं जो एक chunk को marching cubes तक promote कर देता है। वे जो कुछ भी करते हैं वह एक Cloudflare <code>WorldChunkDO</code> में persist होता है, एक server-authoritative Durable Object जो अपने ही SQLite storage द्वारा backed है। Clients state को सीधे नहीं लिखते। वे intent भेजते हैं, DO फैसला करता है और नतीजा broadcast करता है, और DO ही single source of truth है, इसलिए एक नया जुड़ने वाला एक snapshot पाता है और ठीक उसी दुनिया में उतरता है जो बाकी सब देखते हैं।</p>
<p>दो persistence विवरणों ने अपनी जगह बनाई। Terrain को join पर replay किए जाने वाले event log के रूप में store नहीं किया जाता; इसे per-chunk binary blobs के रूप में store किया जाता है जो source of truth हैं, stroke-end पर upload किए जाते हैं, इसलिए जुड़ने वाला हज़ारों brush samples को फिर से चलाने के बजाय committed bytes को सीधे load करता है। और वे blobs एक बड़ी row के बजाय per chunk एक storage key में रहते हैं, क्योंकि एक अकेला SDF chunk 168 KB का है और DO में per-row limit 2 MB है। एक chunk index यह track करता है कि कौन-सी keys मौजूद हैं ताकि DO जागने पर पूरे map को rehydrate कर सके। Identity को client पर दो storages से संभाला जाता है: player id <code>sessionStorage</code> में रहती है ताकि दो tabs दो अलग peers हों, न कि एक ऐसा peer जो DO के player map में खुद को overwrite कर दे, जबकि display name <code>localStorage</code> में रहता है ताकि एक tab में किया गया rename उन सब में पहुँच जाए।</p>
<h2 id="concurrent-edits-को-converge-कराना" tabindex="-1">Concurrent edits को converge कराना <a class="header-anchor" href="#concurrent-edits-को-converge-कराना" aria-label="Permalink to &quot;Concurrent edits को converge कराना&quot;"></a></h2>
<p>Multiplayer authoring का असली कठिन हिस्सा यह है कि जब दो लोग ठीक एक ही पल में overlapping ज़मीन को edit करें तो क्या होता है। Spike edits को उनके algebra के हिसाब से बाँटता है। Additive operations, heightmap पर raise और lower और SDF पर add और subtract, commutative हैं: उन्हें किसी भी क्रम में लगाने पर वही नतीजा मिलता है, इसलिए वे एक optimistic-stamp path पर चलती हैं जहाँ हर client locally apply करता है और stamp भेज देता है, और DO बिना किसी coordination के उसे सबको broadcast कर देता है। क्रम सचमुच मायने नहीं रखता, इसलिए coordinate करने को कुछ है ही नहीं।</p>
<p>Order-dependent operations, smooth और flatten, दिलचस्प मामला थीं। पहले design ने उन्हें एक region lock दिया था: एक client pointer-down पर एक lock का अनुरोध करता है, DO उसे grant या deny करता है, client press के दौरान samples को buffer करता है, और pointer-up पर DO पूरे stroke को atomically apply कर देता है। यह काम करता है, पर यह अपने ही lock TTL और grant/deny round-trip वाला एक अलग protocol है। जिस साफ़-सुथरे जवाब ने उसकी जगह ली वह एक precomputed delta है: originator smooth या flatten brush को locally चलाता है, फिर per-cell deltas की जो list बनी उसे भेज देता है, और हर peer बस उन deltas को अपने ही cells में जोड़ देता है बिना कुछ भी फिर से derive किए। यह एक order-dependent operation को उसके नतीजे को source पर freeze करके commutative बना देता है, इसलिए पूरा edit system एक ही uniform commutative protocol पर चलता है, समान convergence के साथ और बिल्कुल कोई locks नहीं। Prop locks एक अलग वजह से बने रहते हैं: per-record locking ने owner-only deletion की जगह ली, इसलिए कोई भी peer किसी भी prop को delete कर सकता है जब तक कि किसी ने उसे lock न कर रखा हो, और सिर्फ़ lock करने वाला ही उसे clear कर सकता है। Undo और redo इस तरह काम करते हैं कि client किसी prop की id को रखने से पहले ही उसका नाम तय कर देता है, इसलिए वह server के echo से पहले id को जान लेता है और अपने ही actions को deterministically उल्टा कर सकता है। Hibernating WebSockets एक निष्क्रिय room को पूरे समय मुफ़्त रखते हैं, वही property जिसने पिछले भाग में avatar relay को सस्ता बना दिया था।</p>
<h2 id="wind-को-ईमानदारी-से-port-किया-फिर-लड़ाई-हुई" tabindex="-1">Wind को ईमानदारी से port किया, फिर लड़ाई हुई <a class="header-anchor" href="#wind-को-ईमानदारी-से-port-किया-फिर-लड़ाई-हुई" aria-label="Permalink to &quot;Wind को ईमानदारी से port किया, फिर लड़ाई हुई&quot;"></a></h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/49-gpu-wind-props/" title="Spike 49 GPU Wind Props" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/49-gpu-wind-props/" target="_blank">Spike 49 को एक नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=49-gpu-wind-props">Source देखें</a></p>
<p>Spike 49 Quaternius का Stylized Nature MegaKit लेता है और उसकी wind को हमारे stack में port करता है। Pack अपने source Godot shaders भेजता है, चार shaders, और सही कदम एक re-invention के बजाय एक ईमानदार translation था। Bark का vertex function खाली है, इसलिए तने rigid हैं; एक पहले की procedural-mask कोशिश तनों को लहरा रही थी, और fix बस यह था कि bark पर wind लगाना पूरी तरह बंद कर दिया जाए। Leaves को एक triangular-pulse hash से per-vertex अव्यवस्थित sway मिलता है, height से masked ताकि canopy हिले और base टिका रहे। Base foliage को world space में एक noise-modulated sin/cos sway मिलता है। Grass base foliage के साथ एक wind-line bobble है, एक power curve के ज़रिए एक scrolling noise texture को sample करती है ताकि texture के सिर्फ़ चमकीले bands ही योगदान दें, जो वे दिखने वाली ripples पैदा करता है जो एक मैदान के आर-पार दौड़ती हैं। Dispatch pack के अपने material-naming convention को मानता है, इसलिए <code>Leaves_Birch</code> नाम का एक material leaves path तक route होता है और <code>Grass_Common</code> grass path तक, कोई अंदाज़ा नहीं।</p>
<p>Port से एक हैरानी यह है कि leaf का रंग texture में नहीं है। Quaternius leaf की दिखावट को पूरी तरह एक vertical gradient और एक Fresnel rim से author करता है: albedo canopy के नीचे एक अतिरिक्त रंग से ऊपर leaf रंग तक का एक mix है, height पर keyed, साथ में emission के रूप में जोड़ा गया एक subsurface-scattering tint जो एक <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="12.282ex" height="2.451ex" role="img" focusable="false" viewBox="0 -833.2 5428.4 1083.2" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(389,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(1111.2,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(2111.4,0)"><g data-mml-node="mi"><path data-c="1D40D" d="M314 0Q296 3 181 3T48 0H39V62H147V624H39V686H171H265Q288 686 297 686T309 684T315 679Q317 676 500 455T684 233V624H576V686H585Q603 683 718 683T851 686H860V624H752V319Q752 15 750 11Q747 4 742 2T718 0H712Q708 0 706 0T700 0T696 1T693 2T690 4T687 7T684 11T679 16T674 23Q671 27 437 311L215 579V62H323V0H314Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(3233.7,0)"><path data-c="22C5" d="M78 250Q78 274 95 292T138 310Q162 310 180 294T199 251Q199 226 182 208T139 190T96 207T78 250Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(3733.9,0)"><g data-mml-node="mi"><path data-c="1D415" d="M592 686H604Q615 685 631 685T666 684T700 684T724 683Q829 683 835 686H843V624H744L611 315Q584 254 546 165Q492 40 482 19T461 -6L460 -7H409Q398 -4 391 9Q385 20 257 315L124 624H25V686H36Q57 683 190 683Q340 683 364 686H377V624H289L384 403L480 185L492 212Q504 240 529 298T575 405L670 624H582V686H592Z" style="stroke-width: 3;"/></g></g><g data-mml-node="msup" transform="translate(4602.9,0)"><g data-mml-node="mo"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(422,363) scale(0.707)"><path data-c="33" d="M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><mrow data-mjx-texclass="ORD"><mi mathvariant="bold">N</mi></mrow><mo>⋅</mo><mrow data-mjx-texclass="ORD"><mi mathvariant="bold">V</mi></mrow><msup><mo stretchy="false">)</mo><mn>3</mn></msup></math></mjx-assistive-mml></mjx-container> Fresnel term से scale होता है। इसीलिए एक सादा textured pass flat लगता था। रंग gradient और rim से आते हैं, painted map से नहीं। Port raw local Y के बजाय एक baked <code>heightFactor</code> vertex attribute पढ़ता है, load time पर world-space Y से per leaf group normalize किया गया, इसलिए gradient और wind mask दोनों सही व्यवहार करते हैं चाहे FBX import ने हर mesh के local axes को कैसे भी rotate किया हो। Godot color constants sRGB tagged हैं और shader के देखने से पहले linear में convert हो जाते हैं, इसलिए port भी वही conversion करता है, बजाय इसके कि चमकीले sRGB numbers को linear मानकर खिलाए और foliage को धो दे।</p>
<h2 id="वह-recompile-जिसने-frame-rate-खा-ली" tabindex="-1">वह recompile जिसने frame rate खा ली <a class="header-anchor" href="#वह-recompile-जिसने-frame-rate-खा-ली" aria-label="Permalink to &quot;वह recompile जिसने frame rate खा ली&quot;"></a></h2>
<p>इसके पहले एक FBX baseline के रूप में ship होने की वजह, पूरे wind material को एक <code>.bak</code> file में अलग रखकर, एक per-frame recompile bug है जिसने scene को लगभग 1 fps तक गिरा दिया। FBX-loaded materials के ऊपर custom TSL को layer करना Three.js को हर frame shader programs फिर से बनाने पर मजबूर कर रहा था, <code>needsUpdate</code> असल में अटका हुआ रहता था। Diagnostic अनुशासन यह था कि हर foliage material को बिना किसी custom nodes वाले एक सादे textured pass तक छील दिया जाए और देखा जाए कि recompile loop बना रहता है या नहीं। अगर वह रुक गया, तो custom graph ही दोषी था; अगर वह चलता रहा, तो वजह FBX material setup या ख़ुद Three.js में, ऊपर की तरफ़ थी। जिस fix ने असली shaders को वापस आने दिया वह यह था कि हर per-material अंतर, leaf color, SSS color, strength, और blend, को uniforms के रूप में bind कर दिया जाए ताकि सारे leaf assets एक ही compiled program साझा करें, बजाय इसके कि compiler हर unique color combination के लिए एक नया shader निकाले और compile queue को thrash करे।</p>
<p>दो और टुकड़े रखने लायक हैं। Grass हर source file के लिए एक <code>InstancedMesh</code> के रूप में render होती है, और उसकी wind world space में compute होती है क्योंकि sin phases world position पर key होते हैं। पर displacement को instance matrix चलने से पहले local space में लगाना पड़ता है, और WGSL में call करने को कोई <code>inverse()</code> नहीं है। translation, एक Y rotation, और एक uniform scale वाले एक instance matrix के लिए, ऊपरी 3×3 का inverse बस उसका transpose है जो scale के वर्ग से भाग किया गया हो, इसलिए shader world displacement को transposed model matrix से गुणा करता है और matrix के पहले column की लंबाई के वर्ग से भाग देता है, बिना किसी square root के scale को वापस पा लेता है। Vertex transform के matrix को फिर से लगाने के बाद, motion ठीक वैसे world space में उतरती है जैसे author की गई थी, हर tuft के rotation या scale से स्वतंत्र। और हर tuft एक per-vertex GPU frustum cull चलाता है: यह instance center को clip space तक project करता है, और अगर वह margin के साथ frustum के बाहर गिरता है, तो हर vertex को local origin तक collapse कर देता है ताकि हर triangle के तीनों vertices एक हो जाएँ, rasterizer उस degenerate triangle को छोड़ देता है, और off-screen grass के लिए कोई fragment, alpha-test, या shadow काम नहीं होता। यह उस coarse per-chunk bounding-sphere cull के ऊपर जुड़ता है जो Three.js पहले से करता है, booleans के बजाय float <code>step</code> से बना ताकि वह सीधे position mix में गुणा हो जाए।</p>
<h2 id="इस-अध्याय-में-संदर्भित-तकनीक" tabindex="-1">इस अध्याय में संदर्भित तकनीक <a class="header-anchor" href="#इस-अध्याय-में-संदर्भित-तकनीक" aria-label="Permalink to &quot;इस अध्याय में संदर्भित तकनीक&quot;"></a></h2>
<p><strong>Server-authoritative world persistence.</strong> एक <code>WorldChunkDO</code> Durable Object prop placement और terrain edits का फैसला करता है, per-chunk binary blobs को source of truth के रूप में persist करता है (इसलिए जुड़ने वाले एक event log को replay करने के बजाय committed bytes load करते हैं), और DO की 2 MB per-row limit के नीचे रहने के लिए per chunk एक storage key store करता है। Player id <code>sessionStorage</code> में रहती है ताकि tabs अलग peers हों; display name <code>localStorage</code> में रहता है ताकि renames tabs के पार पहुँचें।</p>
<p><strong>Commutative edit convergence.</strong> Additive terrain ops (raise/lower, SDF add/subtract) commutative हैं और बिना coordination के एक optimistic-stamp path पर चलती हैं। Order-dependent ops (smooth, flatten) को एक region lock हासिल करने के बजाय precomputed per-cell deltas भेजकर commutative बनाया जाता है, इसलिए पूरा system बिना locks के एक ही uniform protocol के तहत converge होता है। Per-record prop locks owner-only deletion की जगह लेते हैं, और client-named object ids server के echo के पहुँचने से पहले deterministic undo/redo को संभव बनाती हैं। देखें <a href="/hi/guides/landscape-generation-browser.html#gpu-driven-lod-with-webgpu">GPU-driven LOD</a>।</p>
<p><strong>Godot से TSL में ईमानदार shader porting.</strong> Quaternius के चार source wind shaders line-for-line translate होते हैं: rigid bark, height-masked leaf sway, world-space foliage sway, और एक scrolling wind-line bobble वाली grass, pack के material-naming convention से dispatched। Leaf color texture के बजाय एक height gradient और एक Fresnel-driven SSS rim से आता है, और sRGB authoring constants linear में convert होते हैं ताकि look reference renders से मेल खाए।</p>
<p><strong>Per-frame shader recompiles से बचना.</strong> FBX materials पर custom TSL को layer करना <code>needsUpdate</code> को pin कर सकता है और हर frame programs फिर से बना सकता है, ~1 fps तक गिर जाता है। हर per-material अंतर को एक uniform के रूप में bind करना सारे variants को एक ही compiled program साझा करने देता है, बजाय इसके कि हर unique parameter set पर एक नया shader निकले। एक plain-textured diagnostic pass यह अलग कर देता है कि वजह custom graph है या ऊपर का setup।</p>
<p><strong>Instanced foliage पर world-space wind.</strong> Grass wind world space में compute होती है और एक hand-derived inverse (scale-squared पर transpose) से वापस local में transform होती है क्योंकि WGSL में कोई <code>inverse()</code> नहीं है। एक per-vertex GPU frustum cull off-screen tufts को एक degenerate triangle तक collapse कर देता है ताकि कोई fragment या shadow काम न चले, Three.js के per-chunk bounding-sphere cull के ऊपर जुड़कर।</p>
<hr>
<p>भाग 24, कुल 29 में से।
पिछला: <a href="/hi/blog/2026-05-08-open-world-browser-part-23-avatars-and-voice.html">भाग 23 - पचास avatar और कमरे में एक आवाज़</a>
अगला: <a href="/hi/blog/2026-05-10-open-world-browser-part-25-universal-characters.html">भाग 25 - एक skeleton, हर outfit</a>
Series guide: <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">/hi/blog/2026-02-25-open-world-browser-series-guide</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ब्राउज़र में open world बनाना, भाग 23: पचास avatar और कमरे में एक आवाज़]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-05-08-open-world-browser-part-23-avatars-and-voice</link>
            <guid>https://app.cinevva.com/hi/blog/2026-05-08-open-world-browser-part-23-avatars-and-voice</guid>
            <pubDate>Fri, 08 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Spike 45 ने 50 character को 13 ms के per-frame JS से घटाकर batched GPU skinning के साथ एक draw call में ला दिया, और दो घंटे एक WGSL error के पीछे लगा दिए जो असल में एक morph target निकला। Spike 46 ने HRTF spatial audio के साथ proximity voice बनाई, फिर audio chain का आधा हिस्सा हटा दिया ताकि वह उससे मेल खाए जो Meet और Teams असल में भेजते हैं।]]></description>
            <content:encoded><![CDATA[<h1 id="ब्राउज़र-में-open-world-बनाना-भाग-23-पचास-avatar-और-कमरे-में-एक-आवाज़" tabindex="-1">ब्राउज़र में open world बनाना, भाग 23: पचास avatar और कमरे में एक आवाज़ <a class="header-anchor" href="#ब्राउज़र-में-open-world-बनाना-भाग-23-पचास-avatar-और-कमरे-में-एक-आवाज़" aria-label="Permalink to &quot;ब्राउज़र में open world बनाना, भाग 23: पचास avatar और कमरे में एक आवाज़&quot;"></a></h1>
<p><em>लिखा है <a href="/hi/about.html">Oleg Sidorkin</a> ने, Cinevva के CTO और को-फाउंडर</em></p>
<p>यहाँ नए हैं? <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">सीरीज़ गाइड</a> देखिए। यह बताती है कि spike क्या होता है और सारे भागों के लिंक देती है।</p>
<p><a href="/hi/blog/2026-05-07-open-world-browser-part-22-clouds-and-meshlets.html">भाग 22</a> ने world के ऊपर एक sky लगाया। यह भाग उसमें लोग डालता है। एक third-person open world चाहता है कि किसी भी पल में 50 से ज़्यादा character दिखें, और चाहता है कि आपके पास खड़े लोगों की आवाज़ सुनाई दे। Spike 45 rendering का पक्ष है: इतने सारे animated avatar को GPU पर लाना, वह भी main thread को पिघलाए बिना। Spike 46 audio का पक्ष है: peer-to-peer voice जो position के हिसाब से pan और attenuate होती है, ऐसे tune की गई कि किसी tech demo की जगह एक सामान्य video call जैसी लगे।</p>
<h2 id="पचास-नाचने-वालों-के-लिए-एक-draw-call" tabindex="-1">पचास नाचने वालों के लिए एक draw call <a class="header-anchor" href="#पचास-नाचने-वालों-के-लिए-एक-draw-call" aria-label="Permalink to &quot;पचास नाचने वालों के लिए एक draw call&quot;"></a></h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/45-avatar-network-sync/" title="Spike 45 Avatar Network Sync" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/45-avatar-network-sync/" target="_blank">Spike 45 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=45-avatar-network-sync">सोर्स देखें</a></p>
<p>डिफ़ॉल्ट Three.js path हर character को उसका अपना <code>SkinnedMesh</code>, अपना <code>AnimationMixer</code>, अपना bone-matrix upload, और अपना draw call देता है। लोकल Mac पर 50 avatar पर यह करीब 13 ms का शुद्ध JavaScript overhead था per frame, इससे पहले कि GPU एक भी काम करे। पूरे multiplayer track के लिए de-risking सवाल यह था कि क्या एक batched-skinning architecture इसे काबू में ला सकता है और character count के साथ linearly scale कर सकता है।</p>
<p>जवाब इस बात में बँटा है कि animation कहाँ compute होती है और कहाँ draw होती है। तीन character class एक FBX template साझा करते हैं। लोकल player एक सामान्य <code>Avatar</code> है, अपने mixer वाला पूरा skeleton clone, मानक Three.js path, क्योंकि इसका हमेशा सिर्फ़ एक ही होता है। हर remote peer एक <code>VirtualSkeleton</code> है: यह भी अपने mixer के साथ एक पूरा clone जो वही clip चलाता है, लेकिन हर <code>SkinnedMesh</code> node को clone करने के तुरंत बाद हटा दिया जाता है ताकि सिर्फ़ bone बचें। यह कभी scene में नहीं आता। हर frame में, mixer के update होने और matrices के स्थिर हो जाने के बाद, यह सभी 100 bone के लिए <code>(bone.matrixWorld × boneInverse)</code> को एक साझा <code>Float32Array</code> के एक slot में pack करता है। फिर <code>BatchSkinnedRenderer</code> हर geometry piece के लिए एक <code>InstancedMesh</code> का मालिक होता है, ये सब एक ही <code>StorageBufferAttribute</code> से bone matrices पढ़ते हैं जिसका आकार <code>maxInstances × numBones × mat4</code> है, यानी 60 × 100 × 64 = 384 KB। custom <code>positionNode</code> और <code>normalNode</code> वाला एक <code>MeshStandardNodeMaterial</code> हर vertex के लिए चार bone influence सीधे उस storage buffer से पढ़ता है। नतीजा यह कि पूरी भीड़ के लिए हर geometry piece पर एक storage upload और एक draw call होता है, चाहे उसमें कितने भी लोग हों। Skinning vertex shader में रहती है, और per-avatar JavaScript की लागत घटकर एक mixer चलाने और 100 matrix copy करने तक रह जाती है।</p>
<p>इसे मापने वाले HUD को भी फिर से बनाना पड़ा। पुराना version तब &quot;over budget&quot; दिखाता था जब पूरे-frame का GPU time 3 ms पार करता, लेकिन frame में हमेशा shadow map, ground, और लोकल player का पूरा skinned mesh शामिल होते हैं, जो मिलकर असली hardware पर 3 से 5 ms चलते हैं, चाहे कितने भी synthetic peer मौजूद हों। fix एक ऐसा budget है जो खुद को calibrate करता है: जब तक कोई batched avatar मौजूद न हो, यह live GPU time को एक तेज़ EMA के ज़रिए baseline के रूप में capture करता है, फिर उस baseline को freeze कर देता है और synthetic दिखने पर हर जुड़े avatar पर budget को 0.06 ms की दर से linearly बढ़ाता है। यह हर machine पर idle में PASS दिखाता है और भीड़ बढ़ने पर आनुपातिक रूप से कसता है।</p>
<h2 id="bug-एक-ऐसा-चेहरा-था-जो-आपको-दिखता-नहीं-था" tabindex="-1">bug एक ऐसा चेहरा था जो आपको दिखता नहीं था <a class="header-anchor" href="#bug-एक-ऐसा-चेहरा-था-जो-आपको-दिखता-नहीं-था" aria-label="Permalink to &quot;bug एक ऐसा चेहरा था जो आपको दिखता नहीं था&quot;"></a></h2>
<p>Chrome में पहले run में ground पर silver shadow और कोई avatar बिल्कुल नहीं दिखा, साथ में एक WGSL parse error: एक ऐसी line पर <code>cannot index type 'f32'</code> जो <code>object.nodeUniform2[i]</code> को subscript करने की कोशिश कर रही थी जहाँ uniform एक scalar के रूप में declare किया गया था। इस कहानी का ईमानदार हिस्सा यह है कि पहला fix ग़लत था और फिर भी काम कर गया। अंदाज़ा यह था कि <code>InstancedMesh</code> का instance-matrix path ख़राब code बना रहा था, और एक <code>StorageInstancedBufferAttribute</code> डालने से Chrome में error ग़ायब हो गया। पर वह इसलिए ग़ायब हुआ क्योंकि नए path ने अलग shader code emit किया, इसलिए नहीं कि उसने वजह को हल किया, और यही सबसे ख़तरनाक तरह का fix है।</p>
<p>असली अपराधी थे morph target। 3MIKE.fbx blend-shape facial expression के साथ आता है, cloned geometry <code>morphAttributes</code> को विरासत में लेती है, और Three.js का <code>MorphNode.setup()</code> <code>morphTargetInfluences</code> को एक scalar <code>float</code> के रूप में declare करता है और फिर एक synthesized loop के अंदर उसे <code>.element(i)</code> करने की कोशिश करता है, जो ठीक वही scalar-subscript है जिसे compiler ने नकार दिया। fix एक line है, उस geometry पर <code>geometry.morphAttributes = {}</code> clear करना जो morph का इस्तेमाल नहीं करती, ताकि Three.js <code>MorphNode</code> को inject ही न करे। वह अनजाने वाला Chrome fix कुछ देर के लिए टिका रहा और फिर पलटकर काट गया: Safari पर, storage-instanced path ने 256 बार <code>Vertex buffer is not big enough</code> दिया, क्योंकि Safari का WebGPU backend इसे साफ़-सुथरे ढंग से translate नहीं करता। उसे revert करना सही फ़ैसला था, और सादा bone-matrix storage buffer, जो किसी generated instance path के बजाय core WebGPU है, हर जगह ठीक काम करता है। सीखने लायक सबक़ यही है: जब कोई fix एक browser पर काम करे और आप उसकी मशीनरी समझा न सकें, तो आपने किसी लक्षण पर पट्टी लगाई है, इसलिए असली generated WGSL पढ़िए। spike में बाद में जोड़ा गया एक <code>getCompilationInfo()</code> shim Three.js के सामान्य &quot;module is not valid&quot; को असली Tint error में बदल देता है और उसने अपनी क़ीमत कई गुना वसूल कर ली।</p>
<p>इसके पास ही एक मिलती-जुलती framework-evasion तरकीब बैठी है। Three.js मानक <code>skinIndex</code> और <code>skinWeight</code> attribute नाम पहचान लेता है और अपना <code>SkinningNode</code> inject करने की कोशिश करता है, उस <code>InstancedMesh</code> पर भी जिसका custom <code>positionNode</code> पहले से ही skinning करता है। उन attribute के नाम बदलकर <code>boneIndex</code> और <code>boneWeight</code> करने से वे framework से छिप जाते हैं, और custom TSL उन्हें नए नामों से पढ़ता है।</p>
<h2 id="एक-relay-जो-शब्दों-के-बीच-आपको-भूल-जाता-है" tabindex="-1">एक relay जो शब्दों के बीच आपको भूल जाता है <a class="header-anchor" href="#एक-relay-जो-शब्दों-के-बीच-आपको-भूल-जाता-है" aria-label="Permalink to &quot;एक relay जो शब्दों के बीच आपको भूल जाता है&quot;"></a></h2>
<p>पहले version ने peer को <code>BroadcastChannel</code> पर sync किया, यानी असली wire format और cadence के साथ एक same-browser नमूना, और protocol comment में वादा था कि असली transport में बदलना एक line का काम होगा। उस वादे को भुनाने का मतलब था एक <code>AvatarRoomDO</code>, एक 74-line का Cloudflare Durable Object जो 36-byte वाली binary frame को decode तक नहीं करता। यह हर message को जैसा है वैसा ही कमरे के बाकी हर peer को आगे भेज देता है, क्योंकि भेजने वाले की id frame में embedded है और हर receiver अपनी ही echo को client-side filter कर लेता है। relay को identity की कोई जानकारी नहीं होती। Hibernating WebSocket एक खाली कमरे को मुफ़्त बना देते हैं: messages के बीच DO memory से बाहर निकल जाता है और runtime अगले packet पर tagged socket बहाल कर देता है। हर peer के 10 event per second पर यह 36,000 DO request per peer-hour है, करीब आधा सेंट, Cloudflare पर egress मुफ़्त और equivalent AWS WebSocket आकार से करीब 6 से 10 गुना सस्ता।</p>
<p>इस बदलाव ने एक state-machine bug सामने ला दिया जो रखने लायक है। एक remote player रुकने के बाद भी चलता रहा। animation request <code>this._state</code> यानी अभी चल रहे clip के विरुद्ध guard कर रही थी, न कि आख़िरी queued नाम के, इसलिए जब दो network message एक ही tick में आए, पहले <code>walk</code> फिर <code>idle</code>, तो <code>idle</code> एक ऐसे state से तुलना कर रहा था जो अभी आगे बढ़ा ही नहीं था और चुपचाप drop हो गया। peer हमेशा के लिए चलने में अटक गया, क्योंकि आगे आने वाले <code>idle</code> packet upstream में बिना बदलाव के deduplicate हो रहे थे। fix यह है कि हमेशा pending नाम को overwrite किया जाए और transition helper को असली same-state request को short-circuit करने दिया जाए, जो वह पहले से करता था। यह bug का एक आम वर्ग है: ग़लत reference value के विरुद्ध एक dedup check चुपचाप उसी input को निगल जाता है जो मायने रखता है।</p>
<p>Safari को दो और guard की ज़रूरत थी। यह WebSocket को Chrome से तेज़ खोलता है, इसलिए पहला inbound peer message batch renderer के बन जाने से पहले आ सकता था और null को dereference कर देता था; renderer के मौजूद न होने पर messages drop करना सुरक्षित है क्योंकि peer हर 100 ms में दोबारा broadcast करते हैं। और <code>'gpu' in navigator</code> ने true लौटाया जबकि <code>requestAdapter()</code> ने null लौटाया, इसलिए Three.js चुपचाप WebGL2 पर वापस आ गया, जहाँ storage-buffer skinning chain का कोई valid translation नहीं है और उसने errors उगल दिए। एक असली adapter की जाँच करना और यह सुनिश्चित करना कि backend सचमुच WebGPU है, एक degraded render को एक साफ़ loading-screen message में बदल देता है। यहाँ तक कि एक WGSL dialect gap भी था: Three.js आधुनिक दो-argument वाला <code>@interpolate(flat, either)</code> emit करता है जिसे WebKit के compiler ने अभी भेजा नहीं है, इसे <code>createShaderModule</code> में जाते वक़्त shader source को rewrite करके दूसरा argument हटाकर patch किया गया, जो मुफ़्त है क्योंकि flat interpolation हर vertex पर एक ही value रखती है चाहे जो भी हो।</p>
<h2 id="वह-आवाज़-जो-कमरे-के-साथ-pan-होती-है" tabindex="-1">वह आवाज़ जो कमरे के साथ pan होती है <a class="header-anchor" href="#वह-आवाज़-जो-कमरे-के-साथ-pan-होती-है" aria-label="Permalink to &quot;वह आवाज़ जो कमरे के साथ pan होती है&quot;"></a></h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/46-proximity-voice/" title="Spike 46 Proximity Voice" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/46-proximity-voice/" target="_blank">Spike 46 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=46-proximity-voice">सोर्स देखें</a></p>
<p>Spike 46 proximity voice है: HRTF spatial audio के साथ peer-to-peer WebRTC, साफ़ तौर पर इस दायरे में रखी गई कि एक शांत-से-मध्यम-शोर वाले कमरे में Google Meet और Microsoft Teams की क्वालिटी से मेल खाए। एक <code>VoiceRoomDO</code> signaling को एक JSON relay की तरह संभालता है, हर नए peer को एक roster भेजता है, join और leave की घोषणा करता है, SDP और ICE को socket tag के ज़रिए एक ख़ास peer तक route करता है, और position update broadcast करता है जो spatial panner को चलाते हैं। यह हर message पर भेजने वाले की id छाप देता है ताकि peer एक-दूसरे की नकल न कर सकें, और audio खुद कभी DO को नहीं छूता। हर remote peer के लिए एक <code>RTCPeerConnection</code>, जहाँ lexicographically छोटी peer id हमेशा offer बनाती है ताकि दोनों पक्ष इस बात पर सहमत हो जाएँ कि कौन शुरू करता है, बिना किसी पूरे perfect-negotiation implementation के।</p>
<p>receive side पर हर peer का audio एक <code>PannerNode</code> से होकर गुज़रता है जो HRTF पर inverse distance rolloff के साथ सेट है, और <code>AudioListener</code> हर frame लोकल player की position और facing से update होता है, <code>forwardX = sin(facing)</code>, <code>forwardZ = cos(facing)</code> का इस्तेमाल करते हुए, जो scene के <code>atan2(wx, wz)</code> facing convention से मेल खाता है। Chrome की एक ख़ासियत ने एक घंटा खर्च करा दिया: सिर्फ़ Web Audio द्वारा consume होने वाली एक <code>MediaStream</code> कभी-कभी packet नहीं खींचती, इसलिए हर stream एक छिपे हुए muted <code>&lt;audio&gt;</code> element से भी जुड़ती है ताकि decoder को schedule करने पर मजबूर किया जा सके। क्वालिटी की ओर, browser डिफ़ॉल्ट रूप से करीब 32 kbps mono Opus चलाते हैं, इसलिए spike हर offer और answer पर <code>fmtp</code> line को बदलकर उसे 128 kbps तक बढ़ाता है, in-band FEC enabled और DTX disabled के साथ, फिर एक ऊँची max bitrate के साथ <code>setParameters</code> call करता है ताकि गारंटी रहे कि encoder सचमुच वही इस्तेमाल करे जो SDP बताता है। bitrate बढ़ाने के बाद FEC दूसरी सबसे बड़ी सुनाई देने वाली जीत है, यह बिना renegotiation के packet loss से उबर जाता है।</p>
<h2 id="साफ़-audio-तक-पहुँचने-का-रास्ता-हटाते-हुए" tabindex="-1">साफ़ audio तक पहुँचने का रास्ता हटाते हुए <a class="header-anchor" href="#साफ़-audio-तक-पहुँचने-का-रास्ता-हटाते-हुए" aria-label="Permalink to &quot;साफ़ audio तक पहुँचने का रास्ता हटाते हुए&quot;"></a></h2>
<p>जो audio chain भेजी गई वह उससे कहीं छोटी है जिससे मैंने शुरुआत की थी, और उसे सिकोड़ना ही असली सबक़ था। पहले version में एक high-pass filter, keyboard noise पकड़ने के लिए tune किया गया एक click limiter, एक compressor, एक noise gate, और एक wet-dry crossfade था, जिसके आगे एक floating panel था जिसमें बारह से ज़्यादा slider थे। जब user ने सुनाई देने वाले keyboard click की रिपोर्ट की, तो सहज प्रवृत्ति यह थी कि click limiter को और ज़ोर से tune किया जाए और dry mix घटाई जाए, यानी पट्टियों का ढेर। structural जवाब यह था कि जैसे ही chain में एक ML denoiser आ जाता है, click limiter और gate और ज़्यादातर high-pass सब बेकार हो जाते हैं, क्योंकि RNNoise को ठीक keyboard, mouse और typing noise पर ही train किया गया है, और amplitude clipping उसी काम का एक सख़्ती से घटिया version है। production client ML denoise, echo cancellation, automatic gain, और level के लिए एक soft compressor भेजते हैं, और कुछ नहीं। तो चार stage बाहर हो गए, slider panel बाहर हो गया, और &quot;अपनी noise reduction चुनें&quot; वाले toggle बाहर हो गए, और पीछे एक तय pipeline रह गई।</p>
<p>बचा हुआ हर stage अपनी जगह कमाता है। Browser echo cancellation चालू रहता है क्योंकि RNNoise echo नहीं संभालता, और इसके बिना speaker-से-mic feedback की कोई सीमा नहीं रहती। Browser noise suppression बंद रहता है क्योंकि उसे RNNoise के ऊपर रखने से s, sh, और f जैसी fricative पर artifact बनते हैं, इसलिए आप एक ही denoiser चुनते हैं। Browser automatic gain चालू रहता है, क्योंकि उसे बंद करने से signal इतना धीमा हो जाता था कि compressor के काम लायक न रहे और Web Audio के <code>DynamicsCompressorNode</code> में भरपाई के लिए कोई makeup-gain parameter नहीं है; browser का व्यापक levelling और spike का तेज़ compressor अलग-अलग timescale पर काम करते हैं और साथ रहते हैं। RNNoise 92 प्रतिशत wet पर चलता है, 8 प्रतिशत dry के साथ मिलाकर, क्योंकि यह s, sh, और f जैसे unvoiced consonant को ज़्यादा दबा सकता है जिनकी voice probability गिर जाती है, और छोटा dry path उन्हें थोड़े से keystroke leak की क़ीमत पर बचाए रखता है।</p>
<p>दो feature इसे पूरा करते हैं। Push-to-talk <code>track.enabled</code> को नहीं पलटता, क्योंकि वह pipeline buffer में बचा हुआ सब कुछ फेंक देता है और key छोड़ने पर आख़िरी syllable काट देता है। इसके बजाय tail के पास एक <code>GainNode</code> <code>setTargetAtTime</code> के साथ ramp करता है, तेज़ attack ताकि पहली syllable बची रहे और धीमी release ताकि आख़िरी consonant निकल जाए, और track को हमेशा के लिए enabled छोड़ दिया जाता है। और एक पाँच-सेकंड का broadcast delay, जो एक radio-style feature के रूप में माँगा गया था, एक bypass leg और एक <code>DelayNode</code> leg को साथ crossfade करके चलता है, एक dump button के साथ जो delayed output को silence पर ले जाता है और audio लौटने से पहले HUD पर उल्टी गिनती करता है। denoiser को bundle करना अपने आप में एक छोटी गाथा थी: published RNNoise worklet ऐसे bare-specifier import इस्तेमाल करता है जिन्हें कोई CDN resolve नहीं करता, इसलिए fix एक local esbuild bundle था जो एक self-contained 1.9 MB file बनाता है जिसमें WASM base64-inlined है, repo में commit किया गया और module के सापेक्ष एक URL से referenced किया गया ताकि वह dev server, VitePress build, और custom domain सब के तहत resolve हो जाए। अगर worklet कभी load होने में नाकाम रहे, तो chain फिर भी एक सादे high-pass और compressor के ज़रिए audio बनाती रहती है, और HUD उस नाकामी को लाल रंग में दिखाता है।</p>
<h2 id="इस-अध्याय-में-जिस-तकनीक-का-ज़िक्र-हुआ" tabindex="-1">इस अध्याय में जिस तकनीक का ज़िक्र हुआ <a class="header-anchor" href="#इस-अध्याय-में-जिस-तकनीक-का-ज़िक्र-हुआ" aria-label="Permalink to &quot;इस अध्याय में जिस तकनीक का ज़िक्र हुआ&quot;"></a></h2>
<p><strong>भीड़ के लिए batched GPU skinning.</strong> Remote avatar एक headless <code>VirtualSkeleton</code> चलाते हैं (एक पूरा clone जिसमें skinned mesh हटा दिए गए हैं, bone रखे गए हैं, अपना mixer है) जो हर bone के लिए <code>bone.matrixWorld × boneInverse</code> को एक साझा <code>StorageBufferAttribute</code> में pack करता है। हर geometry piece के लिए एक <code>InstancedMesh</code> उन matrices को एक custom TSL <code>positionNode</code>/<code>normalNode</code> में पढ़ता है, इसलिए पूरी भीड़ की लागत हर piece पर एक storage upload और एक draw call है, जहाँ per-avatar CPU काम एक mixer update और एक matrix copy तक सीमित है। देखें <a href="/hi/guides/landscape-generation-browser.html#gpu-driven-lod-with-webgpu">GPU-driven LOD</a>।</p>
<p><strong>लक्षण नहीं, generated WGSL पढ़ना.</strong> एक <code>cannot index type 'f32'</code> compile error का सुराग Three.js के <code>MorphNode</code> तक पहुँचा जो <code>morphTargetInfluences</code> को एक scalar के रूप में declare करके उसे subscript कर रहा था, जिसे उस geometry पर <code>morphAttributes</code> clear करके fix किया गया जो morph का इस्तेमाल नहीं करती। एक पहला fix जिसने सिर्फ़ यह बदला कि कौन सा shader path generate हुआ, वजह को छिपा गया और बाद में Safari को तोड़ गया। <code>skinIndex</code>/<code>skinWeight</code> का नाम बदलकर <code>boneIndex</code>/<code>boneWeight</code> करने से attribute Three.js के automatic <code>SkinningNode</code> injection से छिप जाते हैं ताकि एक custom skinning material गणित का मालिक बने।</p>
<p><strong>Hibernating Durable Object relay.</strong> एक pure-binary <code>AvatarRoomDO</code> 36-byte frame को बिना decode किए बाकी हर peer को आगे भेजता है, जहाँ भेजने वाले की पहचान frame में embedded है और self-echo client-side filter होती है। Hibernating WebSocket एक खाली कमरे को मुफ़्त बना देते हैं, और यह आकार 10 Hz पर करीब आधा सेंट per peer-hour खर्च करता है, equivalent managed-WebSocket pricing से कहीं नीचे। एक dedup guard जो last-queued के बजाय चल रहे animation state से तुलना करता था, चुपचाप stop message drop कर देता था और remote player को एक walk loop में अटका देता था।</p>
<p><strong>HRTF के साथ WebRTC proximity voice.</strong> हर peer के लिए एक <code>RTCPeerConnection</code> जहाँ offer/answer की भूमिकाएँ peer-id क्रम से तय होती हैं, audio एक HRTF <code>PannerNode</code> से route होता है जहाँ <code>AudioListener</code> हर frame player facing से update होता है, और Opus को resilience के लिए in-band FEC के साथ 128 kbps तक बदला जाता है। एक muted छिपा हुआ <code>&lt;audio&gt;</code> element Chrome को एक Web-Audio-only stream से packet खींचने पर मजबूर करता है।</p>
<p><strong>Subtractive audio engineering.</strong> Meet/Teams की क्वालिटी से मेल खाने का मतलब था stage जोड़ना नहीं, हटाना: ML denoise और echo cancellation और automatic gain और एक soft compressor, बिना किसी gate और बिना किसी click limiter के, क्योंकि keyboard noise पर train किया गया एक ML denoiser amplitude clipping को बेकार बना देता है। Push-to-talk track पलटने के बजाय एक asymmetric envelope के साथ एक tail <code>GainNode</code> को ramp करता है ताकि syllable न कटें, और denoiser worklet bare-specifier import resolution से बचने के लिए एक अकेले self-contained esbuild bundle के रूप में भेजा जाता है।</p>
<hr>
<p>29 में से भाग 23।
पिछला: <a href="/hi/blog/2026-05-07-open-world-browser-part-22-clouds-and-meshlets.html">भाग 22 - वो बादल जिन्हें आप light कर सकते हैं, और वह culling जिसे खिलाना पड़ता है</a>
अगला: <a href="/hi/blog/2026-05-09-open-world-browser-part-24-persistence-and-wind.html">भाग 24 - एक world को save करना, और वह हवा जो आप देख सकते हैं</a>
सीरीज़ गाइड: <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">/hi/blog/2026-02-25-open-world-browser-series-guide</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ब्राउज़र में open world बनाना, भाग 22: ऐसे बादल जिन्हें आप रोशन कर सकें, और culling जिसे खिलाना पड़ता है]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-05-07-open-world-browser-part-22-clouds-and-meshlets</link>
            <guid>https://app.cinevva.com/hi/blog/2026-05-07-open-world-browser-part-22-clouds-and-meshlets</guid>
            <pubDate>Thu, 07 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Spike 43 ने physically based sky और volumetric clouds को 2 ms से कम में screen पर ला दिया, ऐसे sunsets के साथ जिन्हें time-of-day के हिसाब से अलग से tune करने की ज़रूरत नहीं। Spike 44 ने meshlet GPU culling बनाया और सीखा कि Hi-Z occlusion तभी काम करता है जब occluders इतने बड़े हों कि max-reduce में टिक सकें।]]></description>
            <content:encoded><![CDATA[<h1 id="ब्राउज़र-में-open-world-बनाना-भाग-22-ऐसे-बादल-जिन्हें-आप-रोशन-कर-सकें-और-culling-जिसे-खिलाना-पड़ता-है" tabindex="-1">ब्राउज़र में open world बनाना, भाग 22: ऐसे बादल जिन्हें आप रोशन कर सकें, और culling जिसे खिलाना पड़ता है <a class="header-anchor" href="#ब्राउज़र-में-open-world-बनाना-भाग-22-ऐसे-बादल-जिन्हें-आप-रोशन-कर-सकें-और-culling-जिसे-खिलाना-पड़ता-है" aria-label="Permalink to &quot;ब्राउज़र में open world बनाना, भाग 22: ऐसे बादल जिन्हें आप रोशन कर सकें, और culling जिसे खिलाना पड़ता है&quot;"></a></h1>
<p><em>लिखा है <a href="/hi/about.html">Oleg Sidorkin</a> ने, Cinevva के CTO और को-फाउंडर</em></p>
<p>यहाँ नए हैं? <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">सीरीज़ गाइड</a> देखिए। यह बताती है कि spike क्या होता है और सारे भागों के लिंक देती है।</p>
<p><a href="/hi/blog/2026-05-06-open-world-browser-part-21-visibility-buffer.html">भाग 21</a> एक ऐसी rendering technique के बारे में था जिसने फ़ायदा नहीं दिया। इस भाग में एक ऐसी है जिसने दिया, और एक जिसे काम करने के लिए एक सावधान fix की ज़रूरत पड़ी। Spike 43 sky है: एक physically based atmosphere और volumetric clouds, वह नींव जो किसी scene को tech demo की जगह एक असली जगह जैसा दिखाती है। Spike 44 meshlet-style GPU culling है, जहाँ सबक़ यह था कि occlusion test उतना ही अच्छा होता है जितने अच्छे occluders आप उसे खिलाते हैं।</p>
<h2 id="physics-से-बनी-sky-gradient-से-नहीं" tabindex="-1">physics से बनी sky, gradient से नहीं <a class="header-anchor" href="#physics-से-बनी-sky-gradient-से-नहीं" aria-label="Permalink to &quot;physics से बनी sky, gradient से नहीं&quot;"></a></h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/43-clouds-atmosphere/" title="Spike 43 Clouds and Atmosphere" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/43-clouds-atmosphere/" target="_blank">Spike 43 नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=43-clouds-atmosphere">सोर्स देखें</a></p>
<p>लगभग हर cinematic weather effect दो हिस्सों की infrastructure पर टिका होता है: एक physically based atmosphere, ताकि sky का रंग और sun का रंग किसी हाथ से tune किए gradient की जगह physics से time of day का पीछा करें, और एक volumetric cloud volume, ताकि sky में किसी baked cubemap की जगह 3D structure हो। Spike 43 ठीक यही जोड़ी मौजूदा WebGPU और TSL stack पर बनाता है, इससे ज़्यादा कुछ नहीं, क्योंकि एक बार ये दोनों मौजूद हो जाएँ तो बाक़ी weather stack (fog, god rays, गीली सतहें, बर्फ़) छोटे और जाने-पहचाने follow-ons की एक कतार बन जाती है।</p>
<p>Atmosphere Hillaire 2020 model है, lookup tables का एक सेट जो WGSL compute shaders में compute होता है। एक transmittance table sun light को Rayleigh, Mie, और ozone density profile के आरपार integrate करती है और सिर्फ़ तब फिर से compute होती है जब sun हिलता है। एक sky-view table हर frame फिर से bake होती है क्योंकि यह इतनी सस्ती है कि इसे gate करना code के लायक़ नहीं, horizon के आसपास एक non-linear parameterization के साथ ताकि banding न आए। Multiple scattering अभी proper table की जगह एक analytic fit इस्तेमाल करता है, और sunsets सही दिखते हैं, तो यह शॉर्टकट अच्छे से छिपा हुआ है। बादल एक Schneider Nubis-शैली का ray-march हैं जो एक horizontal slab के आरपार जाता है, shape एक 128³ Perlin-Worley texture से आता है जिसे एक 32³ Worley texture ने eroded किया है, दोनों boot पर compute में bake होते हैं बिना किसी network fetch के, Beer's law extinction, एक dual-lobe phase function, और एक powder approximation से रोशन। मुख्य coupling यह है कि बादल का sun color हर step पर वही transmittance table sample करता है, तो cloud lighting दूसरे tuning pass के बिना sunset का पीछा करती है।</p>
<p>एक M1 पर पूरी चीज़ half-resolution clouds पर 1.1 से 2.0 ms पर बैठती है, 6 ms के budget से ख़ासा नीचे, लगभग 14 MB GPU memory इस्तेमाल करते हुए, 100 FPS से ऊपर चलते हुए। दोनों thesis के दावे practice में टिके रहे। Sunset हीरो शॉट है, वह पल जो renderer को cinematic महसूस कराता है, और यह per-time-of-day tuning के बिना physics से ही निकल आता है। और एक ख़ुशनुमा इत्तेफ़ाक़: cloud slab को 800 m और 4000 m के बीच parameterize करने पर, horizon पर दूर के बादल एक नीची camera से dark mountain ridges जैसे दिखते हैं, जो दुनिया को background terrain देता है बिना किसी के background terrain model किए।</p>
<p>एक architecture नोट याद रखने लायक़ है। स्वाभाविक तरीक़ा यह है कि पहले sky को swap chain में paint किया जाए, फिर three.js को <code>autoClear = false</code> के साथ उसके ऊपर geometry draw करने दिया जाए। यह r184 पर WebGPU renderer के साथ नहीं टिकता, क्योंकि वह flag color load op को उस तरह gate नहीं करता जैसे WebGL में करता है, तो three.js हर frame sky को मिटा देता है। Fix यह है कि three.js को एक offscreen target में render किया जाए और final composite (<code>mix(skyCloud, scene, scene.alpha)</code> फिर ACES फिर sRGB) अपने ख़ुद के एक pass में किया जाए जो swap chain का मालिक हो।</p>
<h2 id="ऐसी-culling-जो-अपने-occluders-जितनी-ही-अच्छी-है" tabindex="-1">ऐसी culling जो अपने occluders जितनी ही अच्छी है <a class="header-anchor" href="#ऐसी-culling-जो-अपने-occluders-जितनी-ही-अच्छी-है" aria-label="Permalink to &quot;ऐसी culling जो अपने occluders जितनी ही अच्छी है&quot;"></a></h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/44-meshlet-clusters/" title="Spike 44 Meshlet Clusters" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/44-meshlet-clusters/" target="_blank">Spike 44 नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=44-meshlet-clusters">सोर्स देखें</a></p>
<p>Spike 44 चार rendering modes को एक-दूसरे के ख़िलाफ़ bench करता है: plain forward, CPU cluster culling, GPU compute culling, और Hi-Z occlusion culling के साथ एक visibility buffer। Hi-Z path दिलचस्प वाला है, और इसमें एक चुपचाप छिपा bug था: इसका HUD कहता था occlusion चालू है, मगर &quot;Hi-Z killed&quot; counter हमेशा बिल्कुल 0.0% पर बैठा रहता था। Frustum culling काम कर रहा था, तो cull shader का upstream ठीक था। Occlusion वाला आधा हिस्सा एक no-op था जो पूरी क़ीमत चुका रहा था।</p>
<p>एक Hi-Z occlusion test एक cluster के bounding box को screen पर project करता है, एक depth-pyramid mip level चुनता है ताकि screen rectangle लगभग 2×2 texels का हो, उस rectangle में सबसे गहरे occluder की depth sample करता है, और cluster को reject कर देता है अगर उसका सबसे क़रीबी point अब भी उस occluder से दूर हो। Depth pyramid हर frame बनती है, mip 0 को एक opaque-depth pre-pass से seed करके और ऊपर तक max-reduce करके। Opaque pre-pass जानबूझकर सिर्फ़ ठोस occluders शामिल करता है, ज़मीन और per-tree trunk proxies, क्योंकि alpha-tested foliage ऐसे gaps बना देती जो एक max-reduce को धोखा दे जाते।</p>
<p>Bug geometric था, logical नहीं। Trunk proxy 0.5 m गुणा 4 m गुणा 0.5 m का box था। 30 m पर यह screen पर लगभग 17 pixels पर project होता है। मगर एक आम 50 m grass cluster mip 5 चुनता है, जहाँ हर texel 32 source pixels ढकता है। एक 17-pixel का trunk एक भी mip-5 texel को पूरा नहीं ढकता, तो trunk को छूता हर texel आसपास की ज़मीन को भी छूता है। सबसे पहला 2×2 max-reduce बड़ी depth value चुन लेता है, जो trunk के पीछे की दूर वाली ज़मीन है, और trunk की depth पहली ही reduction पर मिट जाती है। mip 5 तक pyramid लगभग हर जगह ground depth रखती है, cluster कभी ज़मीन से दूर नहीं होता, और कुछ भी कभी occlude नहीं होता।</p>
<p>Fix यह है कि proxy को इतना बड़ा बनाया जाए कि वह जिन texels में गिरे उन पर हावी हो जाए, उसे पेड़ की लकड़ी की जगह उसके silhouette के हिसाब से size दिया जाए। लगभग 2 m गुणा 6 m गुणा 2 m का proxy असली canopy से अब भी छोटा है, तो gaps के बीच से दिखने वाली पत्तियाँ कभी over-cull नहीं होतीं, मगर यह इतना बड़ा है कि उन दूरियों तक max-reduce में टिक जाए जो मायने रखती हैं, और occlusion counter फ़ौरन non-zero हो गया। यह सीख production engine के लिए एक नियम में बदल जाती है: जिस भी चीज़ पर Hi-Z occluder के तौर पर भरोसा किया जाए, उसे उसके on-screen silhouette के हिसाब से size देना होगा, क्योंकि खुली foliage वाले scenes में Hi-Z की असरदारी relevant mip पर occluder coverage से तय होती है, depth-test math की elegance से नहीं। Grass-बनाम-grass occlusion तो वैसे भी fire नहीं हो सकता, क्योंकि एक पत्ती उसके नीचे की ज़मीन जितनी ही depth पर बैठती है, तो असली जीत पेड़ों के दूर की foliage को occlude करने और पेड़ों के पेड़ों को occlude करने में है।</p>
<h2 id="इस-अध्याय-में-बताई-गई-technology" tabindex="-1">इस अध्याय में बताई गई technology <a class="header-anchor" href="#इस-अध्याय-में-बताई-गई-technology" aria-label="Permalink to &quot;इस अध्याय में बताई गई technology&quot;"></a></h2>
<p><strong>Hillaire 2020 atmosphere LUTs.</strong> एक transmittance table (Rayleigh, Mie, और ozone profile के आरपार sun light) जो सिर्फ़ sun के हिलने पर फिर से compute होती है, साथ में एक per-frame sky-view table एक non-linear horizon parameterization के साथ, physically based sky और sun colors देती है जो किसी हाथ से tune किए gradient के बिना time of day का पीछा करते हैं। एक analytic multiple-scattering fit पूरी table की जगह तब तक काम चलाता है जब तक कोई artifact proper bake पर मजबूर न कर दे। Sunset per-time-of-day tuning के बिना physics से ही निकल आता है।</p>
<p><strong>Schneider Nubis volumetric clouds.</strong> एक horizontal slab के आरपार एक ray-march, जिसे एक boot-baked 128³ Perlin-Worley texture shape देता है और एक 32³ Worley texture eroded करता है, Beer's law extinction, एक dual-lobe phase, और एक powder term से रोशन। हर step पर उसी transmittance table से cloud sun color sample करने से cloud lighting बिना किसी ख़र्च के sunrise और sunset का पीछा करती है। Half-resolution ray-march आम दूरी पर बिना किसी दिखने वाले quality loss के full से लगभग 4× सस्ता चलता है, यही standard production trade है।</p>
<p><strong>r184 पर raw WebGPU को three.js के साथ compositing करना.</strong> Sky को swap chain में paint करके और three.js geometry को <code>autoClear = false</code> के साथ उसके ऊपर draw करना नाकाम रहता है क्योंकि वह flag WebGPU backend में color load op को gate नहीं करता। three.js को एक offscreen RGBA16F target में render करें और final <code>mix</code> साथ ही tone-map साथ ही sRGB एक ऐसे pass में करें जो swap chain का मालिक हो।</p>
<p><strong>Hi-Z occlusion culling और occluder sizing.</strong> Max-reduce से बनी एक depth pyramid एक GPU cull pass को उन clusters को reject करने देती है जिनका सबसे क़रीबी point उनके screen rectangle में सबसे गहरे occluder के पीछे हो। यह test चुपचाप कुछ नहीं करता अगर occluders इतने छोटे हों कि चुने गए mip पर एक texel पर हावी न हो सकें, क्योंकि पहला max-reduce occluder की depth को उसके पीछे के दूर वाले background से बदल देता है। Occluders को उनके on-screen silhouette के हिसाब से size देना होगा, उनके physical core के हिसाब से नहीं। देखें <a href="/hi/guides/landscape-generation-browser.html#gpu-driven-lod-with-webgpu">GPU-driven LOD</a>।</p>
<hr>
<p>29 में से भाग 22।
पिछला: <a href="/hi/blog/2026-05-06-open-world-browser-part-21-visibility-buffer.html">भाग 21 - एक तेज़ renderer जो तेज़ नहीं निकला</a>
अगला: <a href="/hi/blog/2026-05-08-open-world-browser-part-23-avatars-and-voice.html">भाग 23 - पचास avatars और कमरे में एक आवाज़</a>
सीरीज़ गाइड: <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">/hi/blog/2026-02-25-open-world-browser-series-guide</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Browser में open world बनाना, भाग 21: एक तेज़ renderer जो तेज़ नहीं निकला]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-05-06-open-world-browser-part-21-visibility-buffer</link>
            <guid>https://app.cinevva.com/hi/blog/2026-05-06-open-world-browser-part-21-visibility-buffer</guid>
            <pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Spike 40 ने घनी घास के लिए एक visibility buffer बनाया, वह तकनीक जिसे हर कोई overdraw पर जीतने वाली बताता है, और मापा कि Apple Silicon पर उच्च घनत्व पर यह सादे forward rendering से 44% पीछे रह गई। यहाँ बताया है क्यों, और इसे असल में कब इस्तेमाल करना चाहिए।]]></description>
            <content:encoded><![CDATA[<h1 id="browser-में-open-world-बनाना-भाग-21-एक-तेज़-renderer-जो-तेज़-नहीं-निकला" tabindex="-1">Browser में open world बनाना, भाग 21: एक तेज़ renderer जो तेज़ नहीं निकला <a class="header-anchor" href="#browser-में-open-world-बनाना-भाग-21-एक-तेज़-renderer-जो-तेज़-नहीं-निकला" aria-label="Permalink to &quot;Browser में open world बनाना, भाग 21: एक तेज़ renderer जो तेज़ नहीं निकला&quot;"></a></h1>
<p><em>लेखक <a href="/hi/about.html">Oleg Sidorkin</a>, Cinevva के CTO और सह-संस्थापक</em></p>
<p>यहाँ नए हैं? <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">series guide</a> का इस्तेमाल करें। यह बताती है कि spike क्या होता है और सभी भागों को link करती है।</p>
<p><a href="/hi/blog/2026-05-05-open-world-browser-part-20-parallax-occlusion.html">भाग 20</a> ने एक सपाट quad पर surface की गहराई का भ्रम बनाया। यह भाग एक render-architecture फ़ैसले के बारे में है, और यही वह spike है जहाँ किताबी जवाब हमारे hardware के लिए गलत निकला। सवाल यह था: third-person camera के नीचे cinematic-घनत्व वाली alpha-tested घास के लिए, 200-player घनत्व तक पहुँचने से पहले क्या हमें एक visibility buffer चाहिए? चलन वाली सलाह ज़ोरदार हाँ कहती है। हमने इसे बनाया, मापा, और जवाब ना था।</p>
<h2 id="वह-तकनीक-जिसकी-हर-कोई-सिफ़ारिश-करता-है" tabindex="-1">वह तकनीक जिसकी हर कोई सिफ़ारिश करता है <a class="header-anchor" href="#वह-तकनीक-जिसकी-हर-कोई-सिफ़ारिश-करता-है" aria-label="Permalink to &quot;वह तकनीक जिसकी हर कोई सिफ़ारिश करता है&quot;"></a></h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/40-visibility-buffer/" title="Spike 40 Visibility Buffer" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/40-visibility-buffer/" target="_blank">Spike 40 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=40-visibility-buffer">View source</a></p>
<p>एक visibility buffer rendering को दो pass में बाँट देता है। Pass 1 geometry को rasterize करता है और बिना कोई shading किए सिर्फ़ triangle और instance ID एक compact integer target में depth के साथ लिखता है। Pass 2 एक fullscreen pass है जो हर ढके हुए pixel पर ID पढ़ता है, उस triangle के vertices दोबारा fetch करता है, interpolated attributes दोबारा बनाता है, और हर दिखने वाले pixel को ठीक एक बार shade करता है। दावा perfect overdraw rejection का है: depth test उन fragments के खिलाफ़ चलता है जिन्होंने कोई shading काम नहीं किया, इसलिए महँगा material सिर्फ़ उसी पर चलता है जो आप असल में देखते हैं।</p>
<p>यह spike एक ही canvas और एक ही device पर दो रास्ते चलाता है ताकि अकेला variable यह रहे कि shading कहाँ रहता है। Forward रास्ता three.js के ज़रिए एक सामान्य <code>MeshStandardNodeMaterial</code> है। Vis-buffer रास्ता three.js के बाहर चलने वाली एक कच्ची two-pass WebGPU pipeline है, जो three.js की घास का texture सीधे backend से पढ़ता है, pass 1 में एक <code>RG32Uint</code> target में <code>(instanceId, triId)</code> लिखता है और pass 2 में lighting हल करता है। दोनों एक ही ground-truth lighting setup साझा करते हैं।</p>
<p>दो implementation बातें ध्यान रखने लायक हैं। WebGPU में अब भी fragment shaders में कोई portable <code>primitive_index</code> builtin नहीं है, इसलिए तरकीब यह है कि un-indexed geometry पर per-vertex triangle ID bake किया जाए और उसे <code>flat</code>-interpolated पढ़ा जाए, जिसमें vertex count 3× हो जाता है पर 12-vertex घास card पर यह नगण्य है। और three.js के renderer के साथ canvas साझा करना ज़्यादातर कोई बड़ी बात नहीं, जब तक आप कभी context को reconfigure न करें या canvas dimensions को न छुएँ, क्योंकि दोनों three.js के अधीन हैं। Forward रास्ते की timing करना झंझट भरा हिस्सा था, क्योंकि three.js अपने render pass के अंदर GPU timestamp queries डालने का कोई hook नहीं देता; इसका जुगाड़ यह है कि उसके काम को दो no-op timestamp pass से घेर दिया जाए, जो उसके पहले और बाद में submit किए जाते हैं और GPU उन्हें submission क्रम में चलाता है।</p>
<h2 id="आँकड़े-उल्टी-दिशा-में-जाते-हैं" tabindex="-1">आँकड़े उल्टी दिशा में जाते हैं <a class="header-anchor" href="#आँकड़े-उल्टी-दिशा-में-जाते-हैं" aria-label="Permalink to &quot;आँकड़े उल्टी दिशा में जाते हैं&quot;"></a></h2>
<p>~1080p पर एक M-series Mac पर, 80 m के मैदान पर cross-card घास की पत्तियों के साथ:</p>
<p>50,000 instances पर vis-buffer रास्ता 25% से जीता, 4.13 ms बनाम forward के 5.51 ms। 100,000 पर यह बराबरी पर रहा। 200,000 instances पर forward 44% से जीता, 5.44 ms बनाम vis-buffer के 7.80 ms। घनत्व बढ़ने के साथ vis-buffer रास्ता <em>अपेक्षाकृत खराब</em> होता जाता है, जो उस लोककथा के बिलकुल उलट है जो कहती है कि यह तभी जीतता है जब overdraw भारी हो।</p>
<h2 id="forward-क्यों-टिका-रहता-है" tabindex="-1">Forward क्यों टिका रहता है <a class="header-anchor" href="#forward-क्यों-टिका-रहता-है" aria-label="Permalink to &quot;Forward क्यों टिका रहता है&quot;"></a></h2>
<p>Apple Silicon GPUs tile-based deferred renderers हैं, और यह पूरा गणित बदल देता है। TBDR पर forward shading में एक hidden-surface-removal चरण होता है जो fragment shader से पहले चलता है: rasterizer एक tile पर map होने वाले हर fragment को इकट्ठा करता है, उन्हें depth के हिसाब से sort करता है, और सिर्फ़ बचे हुए (post-alpha-test) ही fragment shader तक पहुँचते हैं। तो forward रास्ता पहले से ही visibility buffer के &quot;हर pixel पर एक बार shade&quot; वाले वादे का ज़्यादातर हिस्सा मुफ़्त में, hardware के अंदर, चुका रहा है। जैसे-जैसे पत्तियाँ screen पर भरती हैं, कोई shading चलने से पहले HSR पर ज़्यादा fragments reject हो जाते हैं, और forward की असरदार per-pixel लागत overdraw के साथ बढ़ने के बजाय लगभग सपाट बनी रहती है।</p>
<p>Vis-buffer रास्ते के pass 1 को वही TBDR फ़ायदा मिलता है। दिक्कत पूरी की पूरी pass 2 में है। Pass 2 हर pixel का instance matrix एक buffer से पढ़ता है जो 200,000 instances पर 12.8 MB का है, किसी भी GPU cache से कहीं बड़ा। Screen पर पास-पास के pixel आमतौर पर अलग-अलग घास instances के होते हैं (scatter एक jittered grid है, इसलिए पड़ोसी पत्तियों के instance ID मनमाने होते हैं), इसलिए उस buffer से टकराने वाली हर wave divergently cache miss करती है। वह असंगत random access अकेले ही हर frame करीब 4 ms छुपा लेता है। Forward इससे पूरी तरह बच जाता है क्योंकि instance matrix per-instance attribute रास्ते से vertex के साथ ही आ जाता है, तो जब तक fragment shader चलता है तब तक transformed vertex data पहले से tile-local registers में होता है, megabyte-scale random read की ज़रूरत नहीं।</p>
<p>यही वह लागत है जिसे amortize करने के लिए Nanite की material-classification pass मौजूद है: pixels को instance के हिसाब से bin करो और sorted compute waves dispatch करो ताकि हर wave के reads coherent हों। हमारे पास वह नहीं है। एक मोटे अनुमान के मुताबिक pixels को instance के हिसाब से sort करने से वह 4 ms शायद 1.5 से 2 ms तक गिर जाएगा और crossover को 400,000 से 500,000 instances तक धकेल देगा। पर यह एक ऐसी architecture पर optimizations जमा करना है जो यहाँ शुरू से ही जीत नहीं रही।</p>
<h2 id="ईमानदार-निष्कर्ष-और-वह-audit-जिसने-इसे-कमाया" tabindex="-1">ईमानदार निष्कर्ष, और वह audit जिसने इसे कमाया <a class="header-anchor" href="#ईमानदार-निष्कर्ष-और-वह-audit-जिसने-इसे-कमाया" aria-label="Permalink to &quot;ईमानदार निष्कर्ष, और वह audit जिसने इसे कमाया&quot;"></a></h2>
<p>Apple Silicon WebGPU पर alpha-tested cross-card foliage के लिए, three.js की TSL pipeline वाला forward रास्ता पहले से ही vis-buffer लागत के बराबर या उससे नीचे है, और vis-buffer की पूरी plumbing 200,000 instances से काफ़ी आगे तक कुछ भी दिखने लायक नहीं देती और तभी देती है जब आप साथ में एक sorting या binning pass भी जोड़ें। production engine के लिए व्यावहारिक फ़ैसला यह है कि पिछले spikes का forward प्लस LOD प्लस imposter stack बनाए रखें और vis-buffer infrastructure में तब तक निवेश न करें जब तक या तो हम discrete NVIDIA या AMD GPUs को प्रमुख deployment के रूप में न साधें (जहाँ overdraw लागत ज़्यादा linear होती है) या हम एक meshlet architecture पर न चले जाएँ जहाँ vis-buffer वैसे भी स्वाभाविक output है।</p>
<p>चूँकि वह नतीजा अंतर्ज्ञान के उलट है, निष्कर्ष की कोई कीमत तभी है जब तुलना निष्पक्ष हो, इसलिए spike को एक पूरा audit pass मिला। कई असली bug सामने आए और ठीक हुए: एक blade-scale slider जो चुपचाप दोनों रास्तों को desync कर रहा था, आधी forward पत्तियाँ anti-parallel normals की वजह से घुप अँधेरी render हो रही थीं (canonical upward-normal foliage तरकीब से ठीक हुआ), और vis-buffer energy-conserving <code>1/π</code> के बजाय एक हाथ से चुने Lambert factor, एक hardcoded ambient term, और गायब tone mapping के कारण करीब 2× ज़्यादा चमकीला पढ़ रहा था। fix ने three.js की हूबहू ACES filmic curve को WGSL में copy किया और हर frame असली scene lights से light colors और intensities पढ़ता है। बची हुई जानी-पहचानी कमी, pass 2 में गायब direct specular, तुलना को vis-buffer के <em>पक्ष में</em> झुकाती है, यानी forward सख्ती से हर pixel पर ज़्यादा काम कर रहा है और फिर भी उच्च घनत्व पर जीत रहा है। इससे मुख्य निष्कर्ष आशावादी नहीं, बल्कि conservative बन जाता है। एक चेतावनी टिकती है: यह सब M-series-विशिष्ट है, और एक discrete card पर crossover पलट भी सकता है, इसलिए non-Apple targets के लिए stack पक्का करने से पहले इसे दोबारा चलाना अच्छा रहेगा।</p>
<h2 id="इस-अध्याय-में-संदर्भित-तकनीक" tabindex="-1">इस अध्याय में संदर्भित तकनीक <a class="header-anchor" href="#इस-अध्याय-में-संदर्भित-तकनीक" aria-label="Permalink to &quot;इस अध्याय में संदर्भित तकनीक&quot;"></a></h2>
<p><strong>Visibility buffer rendering.</strong> Pass 1 geometry को rasterize करता है और बिना कोई shading किए सिर्फ़ triangle और instance ID plus depth लिखता है। Pass 2 एक fullscreen resolve है जो हर ढके हुए pixel पर ID पढ़ता है, source triangle दोबारा fetch करता है, perspective-correct barycentric attributes दोबारा बनाता है, और हर दिखने वाले pixel को एक बार shade करता है। चूँकि WebGPU में portable fragment <code>primitive_index</code> नहीं है, triangle ID को un-indexed geometry पर एक <code>flat</code>-interpolated per-vertex attribute के रूप में bake किया जाता है।</p>
<p><strong>TBDR hidden-surface removal बनाम deferred resolve.</strong> एक tile-based deferred GPU (Apple Silicon) पर, forward shading fragment shader चलने से पहले ही occluded fragments को reject कर देता है, इसलिए यह visibility buffer के shade-once फ़ायदे का ज़्यादातर हिस्सा मुफ़्त में पकड़ लेता है, और overdraw बढ़ने पर इसकी per-pixel लागत लगभग सपाट रहती है। बजाय इसके एक vis-buffer resolve pass एक बड़े per-instance buffer (200k instances पर 12.8 MB) में असंगत random access की कीमत चुकाता है, जो उच्च घनत्व पर हावी हो जाता है, जब तक कि pixels को पहले instance के हिसाब से sort या bin न किया जाए, जैसे Nanite की material classification करती है।</p>
<p><strong>three.js के WebGPURenderer के साथ canvas साझा करना.</strong> कच्चे WebGPU command buffers साझा queue पर three.js submissions के साथ सही ढंग से interleave होते हैं, जब तक आप <code>context.configure()</code> दोबारा कभी न call करें या <code>canvas.width/height</code> न लिखें, क्योंकि दोनों renderer के अधीन हैं। Forward-path GPU timing, जिसके लिए three.js कोई hook नहीं देता, उसके render call के इर्द-गिर्द submit किए गए दो no-op timestamp render passes से घेरी जा सकती है, क्योंकि GPU command buffers को submission क्रम में चलाता है।</p>
<p><strong>एक अंतर्ज्ञान-विरोधी benchmark को validate करना.</strong> एक चौंकाने वाला performance नतीजा उतना ही भरोसेमंद होता है जितनी तुलना की निष्पक्षता। दोनों रास्तों को एक जैसे scene content और shading पर audit करना (matched ACES tone mapping, energy-conserving Lambert, एक ही objects से पढ़ी गई lights, एक जैसा blade scale) ही वह चीज़ है जिसने &quot;vis-buffer धीमा है&quot; को एक संभावित measurement artifact से एक टिकाऊ निष्कर्ष में बदला, बची हुई एक असमानता conservative दिशा में झुकी हुई।</p>
<hr>
<p>भाग 21 / 29।
पिछला: <a href="/hi/blog/2026-05-05-open-world-browser-part-20-parallax-occlusion.html">भाग 20 - एक सपाट plane पर गहराई का भ्रम</a>
अगला: <a href="/hi/blog/2026-05-07-open-world-browser-part-22-clouds-and-meshlets.html">भाग 22 - बादल जिनके बीच से आप उड़ सकते हैं, और culling जो असल में काम आती है</a>
Series guide: <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">/hi/blog/2026-02-25-open-world-browser-series-guide</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Browser में open world बनाना, भाग 20: एक सपाट plane पर गहराई का भ्रम]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-05-05-open-world-browser-part-20-parallax-occlusion</link>
            <guid>https://app.cinevva.com/hi/blog/2026-05-05-open-world-browser-part-20-parallax-occlusion</guid>
            <pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Spike 39 ने parallax occlusion mapping को TSL में port किया, दो WebGPU shader-control-flow दीवारों से टकराया, पाया कि bug दरअसल verbatim-port अनुशासन की चूक थी, और खुद को ईमानदार रखने के लिए एक real-geometry reference plane बनाया।]]></description>
            <content:encoded><![CDATA[<h1 id="browser-में-open-world-बनाना-भाग-20-एक-सपाट-plane-पर-गहराई-का-भ्रम" tabindex="-1">Browser में open world बनाना, भाग 20: एक सपाट plane पर गहराई का भ्रम <a class="header-anchor" href="#browser-में-open-world-बनाना-भाग-20-एक-सपाट-plane-पर-गहराई-का-भ्रम" aria-label="Permalink to &quot;Browser में open world बनाना, भाग 20: एक सपाट plane पर गहराई का भ्रम&quot;"></a></h1>
<p><em>लेखक <a href="/hi/about.html">Oleg Sidorkin</a>, Cinevva के CTO और सह-संस्थापक</em></p>
<p>यहाँ नए हैं? <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">series guide</a> का इस्तेमाल करें। यह बताती है कि spike क्या होता है और सभी भागों को link करती है।</p>
<p><a href="/hi/blog/2026-05-04-open-world-browser-part-19-imposters.html">भाग 19</a> ने दूरी पर पूरे पेड़ का भ्रम बनाने के लिए एक सपाट quad का इस्तेमाल किया। यह भाग पास से गहराई का भ्रम बनाने के लिए एक सपाट quad का इस्तेमाल करता है: parallax occlusion mapping, वह तरकीब जो एक cobblestone सड़क को ऐसा दिखाती है जैसे उसमें 5 cm की धंसी हुई grouting हो, बिना एक भी अतिरिक्त vertex खर्च किए। मकसद यह था कि इसे production stack (Three.js r184, WebGPU, TSL) पर उतारा जाए ताकि terrain detail materials उस गहराई के भ्रम को वहाँ ले जा सकें जहाँ वह मायने रखता है और बाकी हर जगह सपाट-texture जितनी ही लागत चुकाएँ।</p>
<h2 id="गहराई-का-भ्रम-बनाने-के-तीन-तरीके-अगल-बगल" tabindex="-1">गहराई का भ्रम बनाने के तीन तरीके, अगल-बगल <a class="header-anchor" href="#गहराई-का-भ्रम-बनाने-के-तीन-तरीके-अगल-बगल" aria-label="Permalink to &quot;गहराई का भ्रम बनाने के तीन तरीके, अगल-बगल&quot;"></a></h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/39-parallax-pom/" title="Spike 39 Parallax Occlusion Mapping" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/39-parallax-pom/" target="_blank">Spike 39 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=39-parallax-pom">Source देखें</a></p>
<p>यह spike तीन सपाट 5×5 m planes अगल-बगल रखता है, सभी का material scaffold एक जैसा, फर्क सिर्फ उस UV में जो samplers को feed करता है। Flat texture को सीधा sample करता है, यह reference baseline है। Single-sample parallax UV को view direction के साथ एक बार उस बिंदु की height के हिसाब से shift करता है, जो सस्ता है और कम amplitude पर ठीक है पर grazing angles पर तैरने लगता है। POM tangent space में ray-march करता है: view ray के साथ step बढ़ाओ, वह पहली layer ढूँढो जहाँ ray heightfield के नीचे जाती है, और crossing को परिष्कृत करो। Tangent space सरल बना रहता है क्योंकि हर test plane axis-aligned है, इसलिए view direction पूरे per-vertex TBN matrix की जगह बस कुछ sign flips के साथ tangent space में पैक हो जाती है। Texture set live Polyhaven file API से खींचता है, वही path जो भाग 17 की model search ने इस्तेमाल किया था।</p>
<h2 id="दो-webgpu-दीवारें-और-एक-branchless-ray-march" tabindex="-1">दो WebGPU दीवारें, और एक branchless ray-march <a class="header-anchor" href="#दो-webgpu-दीवारें-और-एक-branchless-ray-march" aria-label="Permalink to &quot;दो WebGPU दीवारें, और एक branchless ray-march&quot;"></a></h2>
<p>किताबी POM loop पहली crossing पर search से बाहर निकल जाता है। r184 पर वह काम नहीं करता, दो अलग वजहों से। <code>If(...).and(...)</code> बिना errors के compile हुआ पर ऐसा WGSL पैदा किया जहाँ loop body कभी चली ही नहीं, इसलिए post-loop refinement कचरे पर चला और plane लगभग सफेद render हुआ। और standalone node के तौर पर <code>Break()</code> r184 build में आया ही नहीं था, इसलिए काम करने वाले <code>If</code> के साथ भी &quot;पहली crossing पर रुको&quot; कहने का कोई तरीका नहीं था। दोनों इस version range में <code>If</code> और <code>Loop</code> सीमाओं के पार TSL control flow के over-optimizing से जुड़े जाने-माने three.js issues तक जाते हैं।</p>
<p>Rewrite branchless है। हर iteration बिना शर्त texture sample करता है, जो texture access को uniform control flow में रखता है जैसा WGSL spec चाहता है, फिर नई state को एक float के रूप में रखे <code>done</code> flag के जरिए मोड़ देता है। एक बार <code>done</code> 1 पर पलटता है, तो per-iteration <code>mix</code> calls &quot;state को अपरिवर्तित रखो&quot; में degenerate हो जाती हैं, जो break का branchless समकक्ष है। <code>done</code> flag एक <code>step</code> helper से बनता है जिसे <code>0.5 + 0.5 × sign(x + ε)</code> के रूप में लागू किया गया है क्योंकि boolean-to-float coercion r18x line में अनिश्चित रहा है और <code>sign()</code> हर जगह सुरक्षित है। लागत यह है कि हर fragment सभी 64 iterations चलाता है चाहे वह असल में कहीं भी cross करे, पर fragment scale पर यह सही सौदा है: runtime वैसे भी max steps पर gate करता है, और एक असली GPU भी एक &quot;असली&quot; break के पार speculate कर लेता। यहाँ एक साफ fallback मायने रखता है, एक अंतिम <code>mix(baseUV, refined, done)</code>, ताकि zero amplitude पर (distance fade के दूर वाले छोर पर) कोई fragment cross न करे, <code>done</code> 0 रहे, और POM material सपाट से bit-identical हो। यही तो distance-LOD तरकीब का पूरा मकसद है: जहाँ effect वैसे भी sub-pixel है वहाँ सपाट लागत में collapse कर दो।</p>
<h2 id="bug-गणित-की-चूक-नहीं-अनुशासन-की-चूक-थी" tabindex="-1">Bug गणित की चूक नहीं, अनुशासन की चूक थी <a class="header-anchor" href="#bug-गणित-की-चूक-नहीं-अनुशासन-की-चूक-थी" aria-label="Permalink to &quot;Bug गणित की चूक नहीं, अनुशासन की चूक थी&quot;"></a></h2>
<p>Branchless version चला पर विकृत दिखा, मध्यम amplitude पर streaky horizontal artifacts और कम amplitude पर सूक्ष्म-रूप-से-गलत-पर-साफ-नहीं नतीजा। Fix एक एक-line prompt से आया: जाओ canonical reference पढ़ो। जिस LlamAcademy tutorial ने इसे प्रेरित किया वह बस एक Unity ShaderGraph node है, इसलिए असली implementation Unity के <code>PerPixelDisplacement.hlsl</code> में रहता है। उसे line दर line पढ़ने से तीन semantic फर्क सामने आए जो मैंने अनजाने में डाल दिए थे: ray-height baseline में एक off-by-one (Unity loop से पहले एक initial advance करता है, इसलिए मेरा frame of reference पूरे एक step से phase से बाहर था, करीब आधे समय crossings को गलत layer में उतार रहा था), max offset पर एक sign convention जिस पर refinement step निर्भर करता है, और एक cumulative-offset बनाम cumulative-UV bookkeeping चुनाव जिसने मेरे refinement गणित को ज्यादा मेहनत करवाई और sign को उलझा दिया।</p>
<p>मूल वजह कोई एक error नहीं थी, वह दो references को मिलाना थी। मैंने LearnOpenGL POM tutorial को अपना guide बनाया था, जो मिलते-जुलते पर अलग sign conventions और एक अलग refinement formula इस्तेमाल करता है, और एक mongrel हालत में जा पहुँचा जहाँ दो-तिहाई गणित एक source से मेल खाता था और एक-तिहाई दूसरे से। Rewrite Unity के HLSL का TSL में लगभग verbatim port है, वही variable names, वही initial advance, वही refinement, ऊपर branchless <code>done</code> flag रखे हुए। यह सबक साथ ले जाने लायक है: जब आप किसी और stack से एक known-good shader port करें, तो पहले उसे उन्हीं names के साथ line-दर-line port करो, फिर local style के लिए refactor करो। Port के बीच में किसी दूसरे reference के खिलाफ दोबारा derive मत करो।</p>
<h2 id="एक-reference-plane-जो-झूठ-नहीं-बोल-सकता" tabindex="-1">एक reference plane जो झूठ नहीं बोल सकता <a class="header-anchor" href="#एक-reference-plane-जो-झूठ-नहीं-बोल-सकता" aria-label="Permalink to &quot;एक reference plane जो झूठ नहीं बोल सकता&quot;"></a></h2>
<p>Side-by-side में स्पष्ट चीज़ गायब थी: एक real-geometry plane। उसके बिना &quot;POM काफी अच्छा दिखता है&quot; अप्रमाणनीय है। किसके मुकाबले अच्छा? तो spike ने एक चौथा plane जोड़ा, वही heightmap असली vertex positions के जरिए धकेला हुआ। WebGPU में hardware tessellation नहीं है (यह spec में है ही नहीं, Metal compatibility के लिए हटा दिया गया), इसलिए विकल्प एक सघन-रूप से subdivided plane है (256×256 segments, 131,072 triangles) जिसमें vertex stage में vertex displacement है। वही amplitude uniform POM और geometry plane दोनों को चलाता है, इसलिए वे साथ fade होते हैं और तुलना हर दूरी पर apples-to-apples बनी रहती है।</p>
<p>Screen पर ground truth होने से गुणात्मक दावे मापने योग्य हो गए। नीचे देखते हुए 16° orbit पर, POM और tessellated plane internal shading पर सहमत हैं। Grazing angles पर वे ठीक वहीं अलग होते हैं जहाँ उन्हें होना चाहिए: POM geometry के बिल्कुल सीधे rectangular edge पर clamp होता है, जबकि असली mesh असली peaks और valleys का एक उबड़-खाबड़ horizon profile दिखाता है जो रोशनी पकड़ता है। तो POM का edge &quot;तैरना&quot; अब साबित होकर algorithm में अंतर्निहित है, texture या lighting का artifact नहीं। दोनों लागत के आकार भी साफ हैं: POM fragment-bound है (लागत covered pixels के साथ बढ़ती है), tessellated plane vertex-bound है (लागत coverage की परवाह किए बिना mesh density के साथ बढ़ती है)। एक terrain chunk के लिए, जो पहले से एक heightmap-driven plane की vertex लागत चुकाता है, sub-mesh detail के लिए POM सही जवाब है।</p>
<p>Reference plane ने एक सूक्ष्म UX bug भी पकड़ा। User ने गौर किया कि amplitude बढ़ने पर surface धँसता दिखता था। यह Unity की उस convention तक जाता है जो geometric plane को heightfield के top के रूप में मानती है, इसलिए peaks flush anchor होते हैं और बाकी सब नीचे की ओर parallax होता है, औसत surface को सपाट baseline से <code>(1 − mean_h) × amplitude</code> जितना नीचे खींचते हुए। Fix convention को फिर से center करता है ताकि <code>h = 0.5</code> plane हो, peaks camera की ओर उठें और valleys धँसें। Algorithm ठीक वैसे ही चलता है जैसे Unity बताता है; spike बस output को आधे offset से post-process करता है ताकि slider खींचने वाले इंसान के लिए &quot;amplitude&quot; का जो मतलब होना चाहिए उससे मेल खाए।</p>
<p>एक और चीज़ reference plane ने सुलझाई। एक &quot;Steps&quot; slider कुछ करता नहीं दिखता था, जो एक plumbing bug जैसा लगता था पर था नहीं। linear search के बाद का तीन-iteration secant refinement इतना अच्छा है (Tatarchuk के 2006 के POM paper में लिखा है कि 4-step search plus 3-step secant नज़र से एक 64-step search से अलग नहीं किया जा सकता) कि एक smooth heightmap पर 4 से 64 तक हर step count उसी sub-texel UV पर converge हो जाता है। Fix एक toggle था, re-plumbing नहीं: secant बंद करो और step slider crossing precision पर एकमात्र control बन जाता है, इसलिए 4 पर गिराने से cobblestone साफ-साफ stair-step करता है और 64 पर चढ़ाने से वापस smooth हो जाता है। Toggle एक 0/1 uniform है जो बंद होने पर हर secant state update को no-op में <code>mix</code> कर देता है, इसलिए toggle करने से material कभी rebuild नहीं होता और कभी stutter नहीं करता।</p>
<h2 id="इस-अध्याय-में-संदर्भित-तकनीक" tabindex="-1">इस अध्याय में संदर्भित तकनीक <a class="header-anchor" href="#इस-अध्याय-में-संदर्भित-तकनीक" aria-label="Permalink to &quot;इस अध्याय में संदर्भित तकनीक&quot;"></a></h2>
<p><strong>TSL में parallax occlusion mapping.</strong> POM tangent space में एक heightfield के बीच से view direction पर ray-march करता है, वह पहली layer ढूँढता है जहाँ ray surface के नीचे गिरती है, और crossing को परिष्कृत करता है, बिना अतिरिक्त geometry के एक सपाट quad पर धँसी-mortar गहराई पैदा करता है। एक अंतिम <code>mix(baseUV, refined, done)</code> material को सपाट से bit-identical बना देता है जब कोई fragment cross नहीं करता, और यही वह चीज़ है जो distance-LOD amplitude attenuation को दूरी पर लागत को सपाट-texture लागत में collapse करने देती है। देखें <a href="/hi/guides/landscape-generation-browser.html#terrain-materials">terrain materials</a>।</p>
<p><strong>WebGPU control flow के लिए branchless loops.</strong> Three.js r184 पर, TSL <code>If(...).and(...)</code> ऐसे WGSL में compile हो सकता है जिसकी loop body कभी चलती नहीं, और standalone <code>Break()</code> उपलब्ध नहीं है। Portable pattern है हर iteration में एक बिना शर्त texture sample (WGSL spec के अनुसार texture access को uniform control flow में रखना) plus एक float के रूप में रखा <code>done</code> flag जो set होने पर हर state update को no-op में <code>mix</code> कर देता है। <code>sign(x + ε)</code> से बना एक <code>step</code> helper अविश्वसनीय boolean-to-float coercion से बचाता है। लागत early-out बिंदु की परवाह किए बिना constant max iterations है, fragment scale पर सही सौदा।</p>
<p><strong>Verbatim shader porting.</strong> किसी और engine से एक known-good shader port करना पहले original के variable names के साथ line-दर-line होना चाहिए, local style के लिए refactor दूसरे नंबर पर। दो references मिलाने (Unity का <code>PerPixelDisplacement.hlsl</code> और LearnOpenGL tutorial) ने एक mongrel पैदा किया जिसमें एक off-by-one ray baseline, एक उल्टा offset sign, और एक refinement formula थी जिसका clamp out-of-range weights को spatial discontinuities के रूप में छिपा देता था। एक canonical ground truth, दोबारा-derivation नहीं।</p>
<p><strong>Vertex-displaced ground-truth reference.</strong> WebGPU में hardware tessellation न होने पर, vertex stage में displaced एक सघन-रूप से subdivided plane (256² segments) एक fragment-stage भ्रम को validate करने के लिए असली geometry के तौर पर खड़ा होता है। दोनों को एक ही amplitude uniform से चलाना तुलना को दूरी भर ईमानदार रखता है। POM fragment-bound है (covered pixels के साथ बढ़ता है) और geometry plane vertex-bound है (mesh density के साथ बढ़ता है), इसलिए वे ठीक silhouette edges पर अलग होते हैं, साबित करते हुए कि POM का edge swim अंतर्निहित है, artifact नहीं।</p>
<hr>
<p>29 में से भाग 20।
पिछला: <a href="/hi/blog/2026-05-04-open-world-browser-part-19-imposters.html">भाग 19 - वह imposter जिसे एक जंगल झेलना है</a>
अगला: <a href="/hi/blog/2026-05-06-open-world-browser-part-21-visibility-buffer.html">भाग 21 - एक तेज़ renderer जो तेज़ नहीं था</a>
Series guide: <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">/hi/blog/2026-02-25-open-world-browser-series-guide</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Browser में open world बनाना, भाग 19: वह imposter जिसे एक जंगल में टिके रहना है]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-05-04-open-world-browser-part-19-imposters</link>
            <guid>https://app.cinevva.com/hi/blog/2026-05-04-open-world-browser-part-19-imposters</guid>
            <pubDate>Mon, 04 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Spike 38 ने एक पेड़ को billboard पर दो textures तक bake कर दिया, फिर एक KISS rewrite और एक odd-N fix ने उसे मेल खिला दिया। Spikes 41-42 ने hemi-octahedral blending से snap को खत्म किया और दस लाख पेड़ों को GPU पर डाल दिया।]]></description>
            <content:encoded><![CDATA[<h1 id="browser-में-open-world-बनाना-भाग-19-वह-imposter-जिसे-एक-जंगल-में-टिके-रहना-है" tabindex="-1">Browser में open world बनाना, भाग 19: वह imposter जिसे एक जंगल में टिके रहना है <a class="header-anchor" href="#browser-में-open-world-बनाना-भाग-19-वह-imposter-जिसे-एक-जंगल-में-टिके-रहना-है" aria-label="Permalink to &quot;Browser में open world बनाना, भाग 19: वह imposter जिसे एक जंगल में टिके रहना है&quot;"></a></h1>
<p><em>लिखा है <a href="/hi/about.html">Oleg Sidorkin</a> ने, Cinevva के CTO और Co-Founder</em></p>
<p>यहाँ नए हैं? <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">series guide</a> देखें। यह समझाती है कि spike क्या होता है और सभी भागों को लिंक करती है।</p>
<p><a href="/hi/blog/2026-05-02-open-world-browser-part-18-ai-scattering.html">भाग 18</a> ने creators को एक brush दिया जो किसी पहाड़ी को पेड़ों से भर देता है। पेच यह है कि जब स्क्रीन पर हज़ारों पेड़ हों तो उनकी कीमत क्या होती है। एक दूर का पेड़ चार pixel देने के लिए 2,000 triangles की ज़रूरत नहीं रखता। यह भाग सबसे गहरा LOD है: imposter, एक चपटा quad जो पेड़ की एक तस्वीर पहने हुए है, और &quot;एक पेड़ जो सही दिखता है&quot; से लेकर GPU पर उनके दस लाख तक का रास्ता।</p>
<h2 id="एक-पेड़-billboard-पर-दो-textures-है" tabindex="-1">एक पेड़ billboard पर दो textures है <a class="header-anchor" href="#एक-पेड़-billboard-पर-दो-textures-है" aria-label="Permalink to &quot;एक पेड़ billboard पर दो textures है&quot;"></a></h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/38-imposters/" title="Spike 38 Octahedral Imposters" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/38-imposters/" target="_blank">Spike 38 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=38-imposters">Source देखें</a></p>
<p>एक imposter किसी prop को देखने के कोणों के एक grid से दो texture atlases में पहले से render कर देता है, एक color के लिए और एक world-space normals के लिए, फिर runtime पर एक ही camera-facing quad दिखाता है जो वह tile sample करता है जो मौजूदा view से मेल खाती है। Bake प्रति tile दो passes का होता है: diffuse एक unlit material के साथ ताकि texture में कोई lighting bake न हो, और normals को <code>normalWorld × 0.5 + 0.5</code> के रूप में encode किया जाता है जिसमें alpha source से आगे भेजा जाता है ताकि silhouette pixel-दर-pixel मेल खाए। Runtime material एक पूरा <code>MeshStandardNodeMaterial</code> है, इसलिए imposter अब भी किसी भी दूसरी surface की तरह scene का sun और IBL लेता है। फायदा geometry में है: हज़ारों triangles के बजाय एक quad, और detail एक 1 MB texture में रहती है।</p>
<p>इसे अपने अलग spike में खींच लाना अपने आप में एक सबक था। Imposter spike 37 के scatter system के अंदर सबसे गहरे LOD के रूप में शुरू हुआ था, और bake पर हर iteration को पूरी scatter pipeline के ज़रिए test करना पड़ता था, जहाँ bake की सही-गलती instance-matrix migration और LOD swaps में उलझी रहती थी। इसे एक prop, एक quad तक अलग करके, original के साथ कंधे से कंधा मिलाकर रखने से iteration का समय मिनटों से सेकंडों तक गिर गया।</p>
<h2 id="जब-किताबी-जवाब-ही-गलत-जवाब-हो" tabindex="-1">जब किताबी जवाब ही गलत जवाब हो <a class="header-anchor" href="#जब-किताबी-जवाब-ही-गलत-जवाब-हो" aria-label="Permalink to &quot;जब किताबी जवाब ही गलत जवाब हो&quot;"></a></h2>
<p>पहले implementation में octahedral encoding इस्तेमाल हुई, जो sphere directions को एक square में pack करने की किताबी mapping है। इसने numerical roundtrip tests पास किए, और फिर भी user बार-बार imposter के ऐसे tile पर snap हो जाने के screenshot भेजता रहा जो पेड़ को सामने से देखने के बजाय थोड़ा ऊपर से देखता हुआ लगता था। छह दौर की fixes आईं (एक per-quad view-direction uniform, एक square bake aspect, debug materials, static billboarding) और हर एक सचमुच ज़रूरी थी पर कोई भी असली bug नहीं था। Fix तभी आया जब &quot;इसे शुरू से फिर सोचो, KISS, कोई band-aid नहीं।&quot;</p>
<p>Rewrite ने octahedral folding को फेंक दिया और सादे azimuth बनाम elevation को अपनाया: <code>az = atan2(dir.x, dir.z)</code>, <code>el = asin(dir.y)</code>, <code>uv = (az/2π, el/π + ½)</code>। यही पूरी encoding है, कोई L1 normalize नहीं, sign-of-zero के कोई corner cases नहीं। यह यहाँ बेहतर इसलिए नहीं है कि यह ज़्यादा सटीक है (यह एक कम uniform sphere sample करता है), बल्कि इसलिए कि CPU cell-picker और GPU shader एक ही primitives इस्तेमाल करते हैं, इसलिए वे किसी boundary direction पर उस तरह असहमत नहीं हो सकते जैसे octahedral जोड़ी चुपचाप हो जाती थी। Atlas एक contact sheet की तरह पढ़ा जाता है: column है prop के चारों ओर का कोण, row है elevation, overlay में एक नज़र में साफ दिखता है।</p>
<p>इसके बाद भी &quot;थोड़ा ऊपर से देखता है&quot; वाली शिकायत बनी रही, और इसकी वजह एक quantization चुनाव थी, encoding नहीं। एक 4×4 grid के साथ row centers ±22.5° और ±67.5° पर आते हैं, इसलिए ठीक 0° elevation पर कोई row नहीं होती। क्षैतिज देखने वाला viewer, जो कहीं ज़्यादा आम मामला है, हमेशा किसी tilt पर bake की गई row में गिरता है। Fix है odd N: एक 5×5 grid row centers को 0° और ±36° और ±72° पर रखता है, इसलिए क्षैतिज viewer को ठीक क्षैतिज पर bake की गई tile मिलती है। &quot;आधे cell जितनी चूक&quot; वाली गलती का यही परिवार अगले भाग के parallax काम में फिर सामने आता है, और इलाज वही सवाल है: क्या मेरा discrete sample point वाकई वहीं गिरता है जहाँ canonical input के लिए मैं सोचता हूँ?</p>
<p>दो और बातें मायने रखती थीं। Billboard को piecewise-static होना ज़रूरी है, लगातार camera की ओर मुँह करने वाला नहीं। Imposter एक खास bake direction से ली गई चपटी तस्वीर है, इसलिए runtime quad के image plane को उस bake camera के plane से मेल खाना ही चाहिए, जिसका मतलब है कि यह उस arc भर में अपना orientation थामे रखता है जहाँ एक cell चुनी रहती है, फिर boundary पर snap हो जाता है। और budget को वहाँ जाना चाहिए जहाँ players असल में देखते हैं: एक बाद के pass ने tilted top-down rows को पूरी तरह हटाकर उनकी जगह 15° के फासले पर 24 horizontal ring slots और एक सीधी-नीचे वाली tile रख दी, क्योंकि पेड़ करीब-करीब हर वक्त आँख की ऊँचाई से देखे जाते हैं।</p>
<h2 id="snap-और-blending-ने-उसे-कैसे-मिटाया" tabindex="-1">Snap, और blending ने उसे कैसे मिटाया <a class="header-anchor" href="#snap-और-blending-ने-उसे-कैसे-मिटाया" aria-label="Permalink to &quot;Snap, और blending ने उसे कैसे मिटाया&quot;"></a></h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/42-imposter-flicker/" title="Spike 42 Imposter Flicker Comparison" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/42-imposter-flicker/" target="_blank">Spike 42 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=42-imposter-flicker">Source देखें</a></p>
<p>Piecewise-static billboard दूरी पर अदृश्य रहता है और करीब आने पर pop करता है, जो तब तक ठीक है जब तक आप orbit न करें। Spike 42 ने चार variants को साथ-साथ रखा (original prop, az/el 5×5 baseline, और दो hemi-octahedral grids) ताकि flicker को अलग करके खत्म किया जा सके। दो artifacts snap को चलाते हैं। Cell pop इसलिए होता है क्योंकि fragment shader view direction को 25 cells में से एक में quantize कर देता है, इसलिए किसी boundary को पार करना उसी frame पर sample की गई tile बदल देता है और quad को फिर से aim कर देता है। Pole degeneracy है top-down view, जहाँ हर azimuth एक ही point पर ढह जाता है और ring तथा top tile के बीच का पुल atlas का सबसे बुरा transition है।</p>
<p>Hemi-octahedral mapping दोनों को ठीक करती है। यह ऊपरी hemisphere को unit square पर लगातार map करती है, इसलिए पास-पास की 3D directions पास-पास की UVs पर गिरती हैं और कोई pole singularity नहीं रहती और किसी खास top-down tile की ज़रूरत नहीं पड़ती। Flicker का इलाज है bilinear cell blending: सबसे नज़दीकी tile पर snap करने के बजाय, encode की गई direction को घेरने वाला 2×2 tiles का group ढूँढो और चारों को blend करो, कुल मिलाकर 8 texture taps (4 diffuse, 4 normal)। पास-पास के views अब pop करने के बजाय cross-fade करते हैं। दो unit vectors का normal blend खुद unit length का नहीं होता, इसलिए इसे फिर से normalize किया जाता है, जो पड़ोसी tiles के बीच के छोटे कोणों के लिए एक slerp जैसा बर्ताव करता है। कीमत असली है (एक 12×12 atlas az/el के 1.6 MB के मुकाबले करीब 9 MB का है, और bake 288 render-target passes पर लगभग 5× ज़्यादा लंबा चलता है) पर bake load के वक्त एक बार का होता है और blend एक pop-free नतीजा देता है, जो imposters को तब इस्तेमाल लायक बनाता है जब camera वाकई चल रहा हो।</p>
<h2 id="दस-लाख-पेड़-प्रति-frame-एक-camera-position-copy" tabindex="-1">दस लाख पेड़, प्रति frame एक camera-position copy <a class="header-anchor" href="#दस-लाख-पेड़-प्रति-frame-एक-camera-position-copy" aria-label="Permalink to &quot;दस लाख पेड़, प्रति frame एक camera-position copy&quot;"></a></h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/41-imposter-forest/" title="Spike 41 Imposter Forest" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/41-imposter-forest/" target="_blank">Spike 41 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=41-imposter-forest">Source देखें</a></p>
<p>Spike 38 का runtime प्रति quad प्रति frame एक CPU <code>lookAt</code> करता है, जो एक पेड़ के लिए ठीक है और एक जंगल के लिए जानलेवा। दस लाख पेड़ों पर प्रति-frame matrix updates और instance-buffer upload सब कुछ हावी कर देंगे। Spike 41 पूरी per-frame pipeline को GPU पर ले जाता है। हर instance का center, yaw, और scale build time पर एक बार instanced attributes के रूप में upload होता है और कभी नहीं बदलता। Vertex shader world-space view direction <code>camPos − center</code> से billboard basis बनाता है और एक साझा unit quad को world space में फैलाता है। Fragment shader प्रति pixel hemi-octahedral encode और bilinear blend करता है। पूरे जंगल के लिए एकमात्र per-frame CPU काम है camera-position uniform को update करने वाला एक <code>Vector3.copy</code>, जो पेड़ों की गिनती के साथ बिल्कुल भी नहीं बढ़ता।</p>
<p>गणित का एक अच्छा हिस्सा यह है कि per-instance yaw normal decode से कट जाता है। Bake normals को bake camera के frame में store करता है, और चूँकि world up के चारों ओर एक yaw rotation +Y को बरकरार रखता है और cross product rotation-equivariant है, इसलिए world-up reference के साथ बना runtime basis पहले से ही rotated bake basis के बराबर है। तो shader normals को runtime basis varyings के ज़रिए सीधे decode करता है, per-instance yaw को कभी छुए बिना। Placement शुद्ध random scatter के बजाय एक jittered grid इस्तेमाल करता है: इलाके को cells में बाँटो, हर cell में center पर एक पेड़ डालो और साथ में एक bounded offset, जो एक न्यूनतम spacing की गारंटी देता है (कोई दो पेड़ एक दूसरे के ऊपर नहीं) जबकि फिर भी एक प्राकृतिक जंगल जैसा पढ़ा जाता है। एक detail जिसे चूकना आसान है वह है bounding sphere। Geometry template बस एक unit quad है, इसलिए three.js पूरे जंगल को उसी पल frustum-cull कर देता जिस पल camera origin से दूर देखता। पूरे इलाके को और एक quad के margin को ढकने वाली एक explicit bounding sphere set करना कोने के पेड़ों को तिरछे कोणों पर कटने से बचाता है।</p>
<h2 id="इस-अध्याय-में-उल्लिखित-technology" tabindex="-1">इस अध्याय में उल्लिखित technology <a class="header-anchor" href="#इस-अध्याय-में-उल्लिखित-technology" aria-label="Permalink to &quot;इस अध्याय में उल्लिखित technology&quot;"></a></h2>
<p><strong>Octahedral और azimuth-elevation imposter atlases.</strong> एक imposter किसी prop को view directions के एक grid से एक diffuse atlas और एक world-space normal atlas में bake करता है, फिर एक ही billboard render करता है जो मेल खाती tile sample करता है, हज़ारों triangles को दो textures से बदल देता है। किताबी octahedral mapping uniform sphere coverage देती है पर fold boundaries पर CPU/GPU divergence की ओर झुकी रहती है; एक सादा azimuth-बनाम-elevation grid एक कम uniform sphere sample करता है पर construction से ही गारंटी देता है कि cell-picker और shader सहमत रहें। Odd N इस्तेमाल करें ताकि एक row ठीक 0° elevation पर आए, और tile budget को horizontal ring पर खर्च करें क्योंकि props ज़्यादातर आँख की ऊँचाई से देखे जाते हैं।</p>
<p><strong>Piecewise-static billboard orientation.</strong> एक imposter एक खास bake direction से ली गई तस्वीर है, इसलिए runtime quad के image plane को bake camera के plane से मेल खाना ज़रूरी है, runtime camera की ओर लगातार मुँह करना नहीं। Quad उस arc भर में अपना orientation थामे रखता है जहाँ एक cell चुनी रहती है, फिर boundary पर snap हो जाता है, जो imposter दूरी पर अदृश्य रहता है और सिर्फ करीब आने पर pop करता है जहाँ imposters इस्तेमाल नहीं होते।</p>
<p><strong>Hemi-octahedral atlas with bilinear cell blend.</strong> ऊपरी hemisphere को unit square पर लगातार map करने से pole singularity और खास top-down tile हट जाती है। Encode की गई view direction को घेरने वाले 2×2 tile group को sample करके और चारों tiles को bilinear-blend करके (8 taps) snap को खत्म किया जाता है, इसलिए पास-पास के views cross-fade करते हैं। Blended normals को फिर से normalize किया जाता है, जो छोटे inter-tile कोण पर एक slerp के करीब आता है। कीमत है एक बड़ा atlas (12×12 पर करीब 9 MB) और एक लंबा एक बार का bake, जो camera की गति में pop-free shading के बदले में दिया जाता है।</p>
<p><strong>GPU-driven instanced imposters.</strong> Per-instance center, yaw, और scale एक बार instanced attributes के रूप में upload होते हैं; vertex shader billboard basis बनाता है और एक साझा unit quad को फैलाता है, और fragment shader प्रति pixel encode और blend करता है। पूरे जंगल के लिए per-frame CPU कीमत एक अकेली camera-position uniform copy है, जो instance count से स्वतंत्र है। Per-instance yaw normal decode से कट जाता है क्योंकि world up के चारों ओर yaw cross-product basis construction से बरकरार रहता है। एक explicit जंगल-भर की bounding sphere three.js को पूरे instanced mesh को frustum-cull करने से रोकती है जब camera unit-quad template के origin से दूर देखता है। देखें <a href="/hi/guides/landscape-generation-browser.html#gpu-driven-lod-with-webgpu">GPU-driven LOD</a>।</p>
<hr>
<p>29 में से भाग 19।
पिछला: <a href="/hi/blog/2026-05-02-open-world-browser-part-18-ai-scattering.html">भाग 18 - एक scatter brush जो AI-placed महसूस होता है</a>
अगला: <a href="/hi/blog/2026-05-05-open-world-browser-part-20-parallax-occlusion.html">भाग 20 - एक चपटे plane पर depth का भ्रम</a>
Series guide: <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">/hi/blog/2026-02-25-open-world-browser-series-guide</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[आधुनिक गेम्स में वॉल्यूमेट्रिक बादल और मौसम के प्रभाव]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-05-04-volumetric-clouds-and-weather</link>
            <guid>https://app.cinevva.com/hi/blog/2026-05-04-volumetric-clouds-and-weather</guid>
            <pubDate>Mon, 04 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[आधुनिक गेम्स कैसे वॉल्यूमेट्रिक बादल, atmospheric scattering, कोहरा, बारिश, बर्फ और डायनामिक मौसम रेंडर करते हैं, हर तकनीक के पीछे के बुनियादी पेपर और engine टॉक्स के साथ।]]></description>
            <content:encoded><![CDATA[<h1 id="आधुनिक-गेम्स-में-वॉल्यूमेट्रिक-बादल-और-मौसम-के-प्रभाव" tabindex="-1">आधुनिक गेम्स में वॉल्यूमेट्रिक बादल और मौसम के प्रभाव <a class="header-anchor" href="#आधुनिक-गेम्स-में-वॉल्यूमेट्रिक-बादल-और-मौसम-के-प्रभाव" aria-label="Permalink to &quot;आधुनिक गेम्स में वॉल्यूमेट्रिक बादल और मौसम के प्रभाव&quot;"></a></h1>
<p><em>लेखक <a href="/hi/about.html">Oleg Sidorkin</a>, Cinevva के CTO और सह-संस्थापक</em></p>
<img src="/img/blog/clouds_weather_hero.webp" alt="Stylized AAA scene with towering volumetric storm clouds, lightning, rain shafts, and a wet stone road reflecting the sky" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>कुछ हफ़्ते पहले मैंने <a href="/hi/blog/2026-05-03-aaa-rendering-techniques.html">उन रेंडरिंग तकनीकों के बारे में लिखा था जो आधुनिक AAA गेम्स असल में शिप करते हैं</a>। एक क्षेत्र जिस पर मैंने हल्का छुआ था वह था आसमान और मौसम, क्योंकि यह अपनी अलग सूची का हकदार है। बादल, कोहरा, बारिश और बर्फ वे सिस्टम हैं जो एक terrain डेमो को एक जगह में बदल देते हैं। ये दिखने से ज़्यादा कोड आपस में साझा करते हैं। वॉल्यूमेट्रिक बादल, ज़मीनी कोहरा और god rays सब एक ही ray-march हैं। गीली सड़कें, बर्फ का जमाव और पैरों के निशान सब एक ही displacement प्लस PBR ट्रिक हैं। हवा एक दिशा वेक्टर है जिसे सीन की हर चीज़ पढ़ती है।</p>
<p>यहाँ 2026 में बड़े स्टूडियो इस सामग्री को कैसे बनाते हैं, इसका एक छोटा और मतवाला दौरा है, हर हिस्से के पीछे के पेपर और engine टॉक्स के साथ।</p>
<h2 id="_1-physically-based-आसमान-और-वातावरण" tabindex="-1">1. Physically based आसमान और वातावरण <a class="header-anchor" href="#_1-physically-based-आसमान-और-वातावरण" aria-label="Permalink to &quot;1. Physically based आसमान और वातावरण&quot;"></a></h2>
<p>Atmospheric scattering ही बुनियाद है। आसमान का रंग, क्षितिज की धुंध, दूर के पहाड़ों का नीला पड़ना, सूर्यास्त का नारंगी रंग, ये सब हवा से होकर रोशनी के scatter होने से आते हैं। आधुनिक engine इसे physics से कैलकुलेट करते हैं: नीले रंग के लिए Rayleigh scattering, सूरज के आसपास की धुंध के लिए Mie scattering, और zenith पर गहरे बैंगनी रंग के लिए ozone absorption।</p>
<p>मूल 2008 का Bruneton तरीका सब कुछ 4D लुकअप टेबल्स में bake कर देता था, जिससे डायनामिक time-of-day सीमित हो जाता था और कम सूरज के कोणों पर LUT artifacts जुड़ जाते थे। Sébastien Hillaire का 2020 का अपडेट, जो UE5 का Sky Atmosphere कंपोनेंट शिप करता है, उच्च-आयामी LUT की जगह कुछ 2D टेक्सचर और एक multiple-scattering approximation रख देता है जो हर frame पर अपडेट होता है। यह एक फ़ोन से लेकर हाई-एंड PC तक चलता है।</p>
<img src="/img/blog/clouds_weather_atmosphere.webp" alt="Physically based sky at golden hour with smooth orange-to-blue gradient over a distant mountain silhouette" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>गहराई से पढ़ें:</p>
<ul>
<li>Hillaire, <a href="https://sebh.github.io/publications/egsr2020.pdf" target="_blank" rel="noreferrer">A Scalable and Production Ready Sky and Atmosphere Rendering Technique</a> (EGSR 2020, आधुनिक मानक, UE5 में इस्तेमाल होता है)।</li>
<li>Bruneton and Neyret, <a href="https://hal.inria.fr/inria-00288758/document" target="_blank" rel="noreferrer">Precomputed Atmospheric Scattering</a> (EGSR 2008, मूल LUT तरीका)।</li>
<li>Bruneton, <a href="https://ebruneton.github.io/precomputed_atmospheric_scattering/" target="_blank" rel="noreferrer">Precomputed Atmospheric Scattering: a New Implementation</a> (ओपन-सोर्स संदर्भ, ozone और multi-planet सपोर्ट)।</li>
<li>Epic Games, <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/sky-atmosphere-component-in-unreal-engine" target="_blank" rel="noreferrer">Sky Atmosphere Component</a> (UE5 डॉक्स)।</li>
</ul>
<h2 id="_2-perlin-worley-noise-के-साथ-वॉल्यूमेट्रिक-बादल" tabindex="-1">2. Perlin-Worley noise के साथ वॉल्यूमेट्रिक बादल <a class="header-anchor" href="#_2-perlin-worley-noise-के-साथ-वॉल्यूमेट्रिक-बादल" aria-label="Permalink to &quot;2. Perlin-Worley noise के साथ वॉल्यूमेट्रिक बादल&quot;"></a></h2>
<p>आधुनिक गेम्स में बादलों की बुनियादी तकनीक Andrew Schneider के 2015 के Horizon Zero Dawn टॉक से शुरू हुई। बादल mesh नहीं होते। वे layered noise से बने एक 3D density function होते हैं: एक low-frequency Perlin-Worley मिश्रण बादल का समग्र आकार देता है, और एक higher-frequency Worley noise silhouette को पतले धुँधले किनारों में घिसता है। एक weather map (एक 2D टेक्सचर जिसे world XZ से sample किया जाता है) हर क्षेत्र के लिए coverage, बादल का प्रकार और वर्षा को नियंत्रित करता है। एक height-based gradient ऊँचाई के हिसाब से cumulus, stratus और cirrus प्रोफ़ाइल के बीच ब्लेंड करता है।</p>
<p>रेंडरर कैमरे से बादल वॉल्यूम के बीच से एक ray मार्च करता है, density और scattering इकट्ठा करता हुआ। 2017 के &quot;Nubis&quot; संस्करण ने regional-scale authoring और animation जोड़ा, और मूल PS4 इम्प्लीमेंटेशन पूरे आसमान के लिए लगभग 2 ms में चलता था। आज जो ज़्यादातर स्टूडियो वॉल्यूमेट्रिक बादल शिप करते हैं वे अब भी अपनी विरासत इसी पेपर तक खींचते हैं।</p>
<img src="/img/blog/clouds_weather_noise.webp" alt="A 3D cloud shape decomposed into stacked Perlin and Worley noise patterns showing how detail erodes the silhouette" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>गहराई से पढ़ें:</p>
<ul>
<li>Schneider, <a href="https://www.guerrilla-games.com/read/the-real-time-volumetric-cloudscapes-of-horizon-zero-dawn" target="_blank" rel="noreferrer">The Real-Time Volumetric Cloudscapes of Horizon Zero Dawn</a> (SIGGRAPH 2015, प्रामाणिक संदर्भ)।</li>
<li>Schneider, <a href="https://advances.realtimerendering.com/s2017/Nubis%20-%20Authoring%20Realtime%20Volumetric%20Cloudscapes%20with%20the%20Decima%20Engine%20-%20Final%20.pdf" target="_blank" rel="noreferrer">Nubis: Authoring Real-Time Volumetric Cloudscapes with the Decima Engine</a> (SIGGRAPH 2017, regional-scale फ़ॉलो-अप)।</li>
<li>Hillaire, <a href="https://media.contentapi.ea.com/content/dam/eacom/frostbite/files/s2016-pbs-frostbite-sky-clouds-new.pdf" target="_blank" rel="noreferrer">Physically Based Sky, Atmosphere and Cloud Rendering in Frostbite</a> (SIGGRAPH 2016, Frostbite संस्करण)।</li>
<li>Häggström, <a href="https://www.diva-portal.org/smash/get/diva2:1223894/FULLTEXT01.pdf" target="_blank" rel="noreferrer">Real-time rendering of volumetric clouds</a> (एक साफ़, सुलभ थीसिस जिसमें पूरा shader कोड है)।</li>
</ul>
<h2 id="_3-voxel-बादल-और-nubis3" tabindex="-1">3. Voxel बादल और Nubis³ <a class="header-anchor" href="#_3-voxel-बादल-और-nubis3" aria-label="Permalink to &quot;3. Voxel बादल और Nubis³&quot;"></a></h2>
<p>Nubis के 2023 के विकास ने 2.5D shape representation को पूरी तरह छोड़कर असली 3D voxels को अपनाया। हर voxel बादल की density सीधे स्टोर करता है, जिससे आर्टिस्ट बादल के आकार को उसी तरह तराश और animate कर सकते हैं जैसे वे terrain गढ़ते हैं। एक घने representation पर जाने की लागत compressed signed distance fields के साथ ray-march acceleration और sparse voxel डेटा के चतुर up-rezzing से वसूल हो जाती है।</p>
<p>नतीजा वह तरह का cloudscape है जिसके बीच से आप उड़ सकते हैं <em>आर-पार</em> बिना अंदरूनी ट्रिक्स को बिखरते देखे। यह ज़्यादातर स्टूडियो के लिए ज़रूरत से ज़्यादा है, पर यही दिशा है जिधर हाई-एंड बढ़ रहा है।</p>
<img src="/img/blog/clouds_weather_voxel_clouds.webp" alt="A cumulus cloud shown decomposed into a 3D voxel grid, with smoothed wispy edges blending the chunky interior" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>गहराई से पढ़ें:</p>
<ul>
<li>Schneider, <a href="https://www.guerrilla-games.com/read/nubis-cubed" target="_blank" rel="noreferrer">Nubis³: Methods (and madness) to model and render immersive real-time voxel-based clouds</a> (SIGGRAPH 2023, voxel-cloud टॉक)।</li>
<li>Schneider, <a href="https://www.guerrilla-games.com/read/nubis-evolved" target="_blank" rel="noreferrer">Nubis, Evolved</a> (SIGGRAPH 2022, 2.5D और पूर्ण 3D के बीच का पुल)।</li>
<li>Schneider, <a href="https://www.schneidervfx.com/" target="_blank" rel="noreferrer">Real-time Volumetrics and VFX</a> (Andrew की निजी साइट, कोर्स नोट्स और ब्रेकडाउन के साथ)।</li>
</ul>
<h2 id="_4-layered-बादल-रेंडरिंग-और-2d-बैकड्रॉप" tabindex="-1">4. Layered बादल रेंडरिंग और 2D बैकड्रॉप <a class="header-anchor" href="#_4-layered-बादल-रेंडरिंग-और-2d-बैकड्रॉप" aria-label="Permalink to &quot;4. Layered बादल रेंडरिंग और 2D बैकड्रॉप&quot;"></a></h2>
<p>हर स्टूडियो full-volume बादल वहन नहीं कर सकता, और हर कैमरा कोण को उनकी ज़रूरत नहीं होती। बहुत से गेम्स तकनीकें मिलाते हैं: high-altitude cirrus को एक scrolling 2D layer के रूप में रेंडर करना, mid-altitude cumulus को वॉल्यूमेट्रिक rays के रूप में, और low-altitude stratus को एक पतले participating-media स्लैब के रूप में। क्षितिज को अक्सर एक pre-baked sky cubemap मिलता है जिसमें वॉल्यूमेट्रिक pass एक fade distance के पार ब्लेंड कर देता है।</p>
<p>यही layering बादल बजट को ईमानदार रखती है। पूरी क्वालिटी पर एक अकेला बादल प्रकार 4-6 ms खा सकता है; अलग-अलग बादल ऊँचाइयों के लिए अलग-अलग क्वालिटी layer करना उसी लुक को आधी लागत पर रोक सकता है।</p>
<img src="/img/blog/clouds_weather_cloud_layers.webp" alt="Sunset sky split into three cloud layers: high cirrus wisps, mid cumulus puffs, and low stratus haze near the horizon" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>गहराई से पढ़ें:</p>
<ul>
<li>Vos, <a href="https://www.gdcvault.com/play/1023327/The-Real-Time-Volumetric-Cloudscapes" target="_blank" rel="noreferrer">The Real-Time Volumetric Cloudscapes of Horizon Zero Dawn</a> (GDC 2016 वीडियो, layering ब्रेकडाउन दूसरे हिस्से में है)।</li>
<li>Bauer, <a href="https://www.youtube.com/watch?v=IYxtqlD1-Ac" target="_blank" rel="noreferrer">Creating the Atmospheric World of Red Dead Redemption 2</a> (SIGGRAPH 2019, RDR2 की संयुक्त sky/clouds/volumetrics पाइपलाइन)।</li>
<li>Hillaire, <a href="https://www.gdcvault.com/play/1029105/Volumetric-Clouds-and" target="_blank" rel="noreferrer">Volumetric clouds and mega particles in REDengine 4</a> (GDC 2025, Cyberpunk 2077 की बादल पाइपलाइन)।</li>
</ul>
<h2 id="_5-froxel-grids-के-साथ-वॉल्यूमेट्रिक-कोहरा" tabindex="-1">5. Froxel grids के साथ वॉल्यूमेट्रिक कोहरा <a class="header-anchor" href="#_5-froxel-grids-के-साथ-वॉल्यूमेट्रिक-कोहरा" aria-label="Permalink to &quot;5. Froxel grids के साथ वॉल्यूमेट्रिक कोहरा&quot;"></a></h2>
<p>कोहरा एक 3D फ़ील्ड है, 2D स्क्रीन इफ़ेक्ट नहीं। मानक आधुनिक तरीका froxel grid है: कैमरे के view frustum से aligned एक 3D टेक्सचर, जिसका हर सेल (&quot;froxel&quot; = frustum + voxel) density और lit color स्टोर करता है। एक compute shader हर light source से scattering को grid में inject करता है, view ray के साथ extinction इकट्ठा करता है, और नतीजे को एक fullscreen pass के रूप में लागू करता है।</p>
<p>यही आपको खिड़कियों से आती light shafts, point lights के आसपास रंगीन कोहरा, और विस्फोटों के चारों ओर दिखने वाले volumes देता है। यही &quot;atmospheric perspective&quot; के पीछे की मशीनरी भी है जो दूर की चीज़ों को हवा में धुँधला कर देती है। यह तकनीक Bart Wronski ने Assassin's Creed 4 के लिए पेश की और Sébastien Hillaire ने Frostbite में मानकीकृत की।</p>
<img src="/img/blog/clouds_weather_froxel_fog.webp" alt="Camera frustum visualized as a 3D froxel grid with smaller cells near the camera and bigger cells far away, fog particles inside" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>गहराई से पढ़ें:</p>
<ul>
<li>Wronski, <a href="https://bartwronski.com/wp-content/uploads/2014/08/bwronski_volumetric_fog_siggraph2014.pdf" target="_blank" rel="noreferrer">Volumetric Fog: Unified Compute Shader Based Solution to Atmospheric Scattering</a> (SIGGRAPH 2014, मूल froxel-grid पेपर)।</li>
<li>Hillaire, <a href="http://www.frostbite.com/2015/08/physically-based-unified-volumetric-rendering-in-frostbite/" target="_blank" rel="noreferrer">Physically Based and Unified Volumetric Rendering in Frostbite</a> (SIGGRAPH 2015, production-grade इम्प्लीमेंटेशन)।</li>
<li>Kovalovs, <a href="https://history.siggraph.org/wp-content/uploads/2022/08/2020-Talks-Kovalovs_Volumetric-Effects-of-The-Last-of-Us-Part-Two.pdf" target="_blank" rel="noreferrer">Volumetric Effects of The Last of Us Part Two</a> (SIGGRAPH 2020, temporal jitter और depth-correct compositing पर नोट्स के साथ)।</li>
<li>Wright et al., <a href="https://advances.realtimerendering.com/s2022/SIGGRAPH2022-Advances-Lumen-Wright%20et%20al.pdf" target="_blank" rel="noreferrer">Lumen: Real-Time Global Illumination in Unreal Engine 5</a> (SIGGRAPH 2022, इसमें वॉल्यूमेट्रिक कोहरे के साथ Lumen का interaction शामिल है)।</li>
</ul>
<h2 id="_6-god-rays-और-crepuscular-shafts" tabindex="-1">6. God rays और crepuscular shafts <a class="header-anchor" href="#_6-god-rays-और-crepuscular-shafts" aria-label="Permalink to &quot;6. God rays और crepuscular shafts&quot;"></a></h2>
<p>धुँधली हवा में सूरज की रोशनी की दिखने वाली किरणें कोई अलग इफ़ेक्ट नहीं हैं। वे उसी कोहरा सिस्टम से निकलती हैं, बशर्ते कोहरे की density और shadow map दोनों उसी compute shader को उपलब्ध हों। जब shader एक froxel में रोशनी inject करता है, तो वह उस froxel की world position पर shadow map को sample करता है। छाया में पड़े सेल अँधेरे रहते हैं, रोशनी में पड़े सेल सूरज का रंग पकड़ लेते हैं। कैमरा ray को नतीजे के बीच से मार्च करें और चमकीले सेल लगातार shafts बना देते हैं।</p>
<p>सस्ते screen-space वैरिएंट मौजूद हैं (सूरज की position से depth buffer में radial blur) और मोबाइल या low-end हार्डवेयर पर अब भी सही चुनाव हैं। वे ऑफ़-स्क्रीन सूरज की positions छोड़ देते हैं पर लगभग कुछ खर्च नहीं करते।</p>
<img src="/img/blog/clouds_weather_god_rays.webp" alt="Dawn forest with sun rays slicing through tree trunks and ground fog, forming clear god ray shafts" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>गहराई से पढ़ें:</p>
<ul>
<li>Mitchell, <a href="https://developer.nvidia.com/gpugems/gpugems3/part-ii-light-and-shadows/chapter-13-volumetric-light-scattering-post-process" target="_blank" rel="noreferrer">Volumetric Light Scattering as a Post-Process</a> (GPU Gems 3, screen-space radial-blur तरीका)।</li>
<li>Engelhardt and Dachsbacher, <a href="https://cg.ivd.kit.edu/publications/2010/epipolar/EpipolarSampling.pdf" target="_blank" rel="noreferrer">Epipolar Sampling for Shadows and Crepuscular Rays in Participating Media</a> (I3D 2010, ज़्यादा सटीक GPU तकनीक)।</li>
<li>Vos, <a href="https://www.guerrilla-games.com/read/volumetric-light-effects-in-killzone-shadow-fall" target="_blank" rel="noreferrer">Volumetric Light Effects in Killzone: Shadow Fall</a> (SIGGRAPH 2014, shadow integration के साथ production संस्करण)।</li>
</ul>
<h2 id="_7-बिजली-और-stochastic-मौसम-घटनाएँ" tabindex="-1">7. बिजली और stochastic मौसम घटनाएँ <a class="header-anchor" href="#_7-बिजली-और-stochastic-मौसम-घटनाएँ" aria-label="Permalink to &quot;7. बिजली और stochastic मौसम घटनाएँ&quot;"></a></h2>
<p>बिजली एक one-frame इफ़ेक्ट है जिसके दो हिस्से होते हैं: bolt mesh, और पूरे सीन का tonemap और लाइटिंग प्रतिक्रिया। bolt खुद आमतौर पर एक procedural billboard mesh होता है जो एक recursive line-segment subdivision एल्गोरिथ्म से बनाया जाता है, अराजकता के लिए jittered और ज़मीन की ओर tapered। कुछ engine इसे एक screen-space additive flash के रूप में रेंडर करते हैं, अन्य एक पूरी तरह lit emissive geometry के रूप में जो एक one-frame point-light injection के ज़रिए दुनिया पर रोशनी डालती है।</p>
<p>दिलचस्प हिस्सा है बाकी <em>सब कुछ</em>: बादलों के पेंदे नीचे से रोशन होते हैं, ज़मीन दो frames के लिए चमकती है, auto-exposure metering को उबरने में कुछ frames लगते हैं, और दूरी के आधार पर एक देर से आने वाली गरज की आवाज़ बजती है। अच्छी तरह किया जाए तो यह एक 16 ms की चमक को पाँच-सेकंड के क्रम में बदल देता है जो मौसम को दुनिया में होती किसी चीज़ की तरह बेचता है, सिर्फ़ उसके ऊपर नहीं।</p>
<img src="/img/blog/clouds_weather_lightning.webp" alt="Lightning fork striking from a thundercloud at dusk, lighting the cloud bottoms and a small village silhouette" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>गहराई से पढ़ें:</p>
<ul>
<li>Reed and Wyvill, <a href="https://dl.acm.org/doi/10.1145/192161.192256" target="_blank" rel="noreferrer">Visual Simulation of Lightning</a> (SIGGRAPH 1994, recursive bolt एल्गोरिथ्म जो आज भी सब इस्तेमाल करते हैं)।</li>
<li>Kim and Lin, <a href="https://gamma.cs.unc.edu/POWER/" target="_blank" rel="noreferrer">Fast Animation of Lightning Using an Adaptive Mesh</a> (IEEE TVCG 2007, ज़्यादा physically grounded)।</li>
<li>Bauer, <a href="https://www.youtube.com/watch?v=IYxtqlD1-Ac" target="_blank" rel="noreferrer">Creating the Atmospheric World of Red Dead Redemption 2</a> (SIGGRAPH 2019, RDR2 की storm पाइपलाइन जिसमें बिजली की timing शामिल है)।</li>
</ul>
<h2 id="_8-बारिश-के-particles-बारिश-के-meshes-और-screen-space-बूँदें" tabindex="-1">8. बारिश के particles, बारिश के meshes, और screen-space बूँदें <a class="header-anchor" href="#_8-बारिश-के-particles-बारिश-के-meshes-और-screen-space-बूँदें" aria-label="Permalink to &quot;8. बारिश के particles, बारिश के meshes, और screen-space बूँदें&quot;"></a></h2>
<p>आधुनिक गेम्स में गिरती बारिश शायद ही कभी सिर्फ़ particles होती है। सस्ता और विश्वसनीय समाधान scrolling टेक्सचर का एक छोटा सेट है जो vertical या screen-aligned quads पर खिंचा होता है, और बाकी हर चीज़ की तरह उन्हीं सूरज और आसमान probes से रोशन होता है। कैमरे के पास, अलग-अलग streak particles विस्तार जोड़ते हैं। कैमरे के lens पर ही, droplet टेक्सचर, फिसलते trails, और impact ripples &quot;आप तूफ़ान के अंदर हैं&quot; का अहसास बेचते हैं।</p>
<p>हवा बारिश की दिशा को प्रभावित करती है। वही wind वेक्टर बादल weather map को धकेलता है, घास को मोड़ता है, और बारिश के quads को झुकाता है। एक पूरे सीन का वेक्टर, दर्जनों उपभोक्ता।</p>
<img src="/img/blog/clouds_weather_rain_storm.webp" alt="Heavy night rainstorm with sheets of rain illuminated by distant headlights and ripples on a wet road" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>गहराई से पढ़ें:</p>
<ul>
<li>Tatarchuk, <a href="https://gpuopen.com/wp-content/uploads/2018/04/Tatarchuk-Rain-Rendering-EGSR2006.pdf" target="_blank" rel="noreferrer">Artist-Directable Real-Time Rain Rendering in City Environments</a> (EGSR 2006, प्रामाणिक layered-rain संदर्भ)।</li>
<li>Garg and Nayar, <a href="https://www1.cs.columbia.edu/CAVE/projects/rain_ren/rain_ren.php" target="_blank" rel="noreferrer">Photorealistic Rendering of Rain Streaks</a> (SIGGRAPH 2006, बारिश की बूँदों से होकर रोशनी की physics)।</li>
<li>Wojciechowski, <a href="https://www.gdcvault.com/play/1027382/Rain-In-Cyberpunk-2077" target="_blank" rel="noreferrer">Rain in Cyberpunk 2077</a> (GDC 2021, एक आधुनिक production वॉकथ्रू)।</li>
</ul>
<h2 id="_9-गीली-सतहें-पोखर-और-ripples" tabindex="-1">9. गीली सतहें, पोखर, और ripples <a class="header-anchor" href="#_9-गीली-सतहें-पोखर-और-ripples" aria-label="Permalink to &quot;9. गीली सतहें, पोखर, और ripples&quot;"></a></h2>
<p>ऐसी बारिश जो ज़मीन को नहीं बदलती, तुरंत नकली दिखती है। गीली सतहें अपना albedo गहरा करके (पानी आती रोशनी को सोख लेता है), अपने normals को चपटा करके (पानी की परत microsurface को चिकना कर देती है), और अपनी roughness घटाकर (पानी तीखे कोणों पर लगभग एक संपूर्ण आईना है) प्रतिक्रिया देती हैं। shader में बदलाव छोटा है, विज़ुअल बदलाव बहुत बड़ा।</p>
<p>पोखर mask-driven होते हैं: एक height-based या vertex-painted mask उन निचली जगहों को परिभाषित करता है जो &quot;wetness&quot; parameter बढ़ने पर पानी से भर जाती हैं। Ripples flipbook normal-map टेक्सचर होते हैं जो बारिश की बूँदों के impacts से trigger होते हैं। वाकई अच्छे इम्प्लीमेंटेशन wetness state को समय के साथ बनाते हैं, ताकि एक लंबा तूफ़ान दुनिया को धीरे-धीरे भिगो दे और एक छोटी फुहार सिर्फ़ ऊँची जगहों को गहरा करे।</p>
<img src="/img/blog/clouds_weather_wet_surfaces.webp" alt="Wet cobblestone street at night with shallow puddles reflecting neon signs and ripple rings from raindrop impacts" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>गहराई से पढ़ें:</p>
<ul>
<li>Lagarde and de Rousiers, <a href="https://seblagarde.wordpress.com/2015/07/14/siggraph-2014-moving-frostbite-to-physically-based-rendering/" target="_blank" rel="noreferrer">Moving Frostbite to Physically Based Rendering 3.0, section 5.5</a> (SIGGRAPH 2014, प्रामाणिक wet-surface PBR समायोजन)।</li>
<li>Lagarde, <a href="https://seblagarde.wordpress.com/2011/08/17/feeding-a-physical-based-lighting-mode/" target="_blank" rel="noreferrer">Adopting a Physically Based Shading Model</a> (मूल ब्लॉग सीरीज़ जिसमें wet-PBR गणित है)।</li>
<li>Cyanilux, <a href="https://www.cyanilux.com/tutorials/rain-effects-breakdown/" target="_blank" rel="noreferrer">Rain Effects Breakdown</a> (पोखर, ripples, और droplets का एक सुलभ Shader Graph वॉकथ्रू)।</li>
</ul>
<h2 id="_10-बर्फ-का-जमाव-और-deformation" tabindex="-1">10. बर्फ का जमाव और deformation <a class="header-anchor" href="#_10-बर्फ-का-जमाव-और-deformation" aria-label="Permalink to &quot;10. बर्फ का जमाव और deformation&quot;"></a></h2>
<p>बर्फ बारिश की सममित समस्या है: दुनिया को इसे याद रखना होता है, सिर्फ़ पाना नहीं। मानक तरीका एक top-down &quot;snow accumulation&quot; टेक्सचर इस्तेमाल करता है जो समय के साथ वहाँ जमता है जहाँ आसमान दिखता है (एक top-down depth या shadow map के विरुद्ध कैलकुलेट किया गया)। terrain shader इस mask को sample करता है और छायादार क्षेत्रों में बर्फ का material और खुले इलाकों में snow-deep displacement ब्लेंड करता है।</p>
<p>पैरों के निशान और टायर के निशान खिलाड़ी पर केंद्रित एक sliding deformation map में रेंडर होते हैं। जैसे-जैसे कैमरा हिलता है, पुराने पैरों के निशान scroll होकर बाहर निकलते हैं और टेक्सचर चारों ओर wrap हो जाता है। terrain या snow shader इस deformation map को sample करता है और जहाँ लिखा गया है वहाँ vertices को नीचे धकेलता है। Battlefield 5 की बर्फ यह हार्डवेयर tessellation से करती है; सस्ते तरीके सिर्फ़ vertex displacement के साथ एक high-density terrain mesh इस्तेमाल करते हैं।</p>
<img src="/img/blog/clouds_weather_snow_deformation.webp" alt="Stylized snowy landscape with fresh footprints, drifts piled against rocks, falling snowflakes, and hazy distant mountains" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>गहराई से पढ़ें:</p>
<ul>
<li>Barré-Brisebois, <a href="https://www.digitalfoundry.net/articles/digitalfoundry-2018-hands-on-with-battlefield-5s-closed-alpha" target="_blank" rel="noreferrer">Hands-on with Battlefield 5: how the small things matter</a> (Frostbite बर्फ का production लेख)।</li>
<li>St-Amour, <a href="https://is.muni.cz/th/m2v6i/real-time_snow_deformation.txt?lang=cs" target="_blank" rel="noreferrer">Real-time snow deformation</a> (पूरे GPU इम्प्लीमेंटेशन विवरण के साथ एक थीसिस)।</li>
<li>Andersson, <a href="https://media.contentapi.ea.com/content/dam/eacom/frostbite/files/chapter5-andersson-terrain-rendering-in-frostbite.pdf" target="_blank" rel="noreferrer">Terrain Rendering in Frostbite Using Procedural Shader Splatting</a> (वह splat-सिस्टम बुनियाद जिसके ऊपर snow accumulation सवार होता है)।</li>
</ul>
<h2 id="_11-एक-global-सिस्टम-के-रूप-में-हवा" tabindex="-1">11. एक global सिस्टम के रूप में हवा <a class="header-anchor" href="#_11-एक-global-सिस्टम-के-रूप-में-हवा" aria-label="Permalink to &quot;11. एक global सिस्टम के रूप में हवा&quot;"></a></h2>
<p>हवा कोई particle इफ़ेक्ट नहीं है। production engines में यह एक अकेला global वेक्टर है (कभी-कभी एक low-resolution 3D फ़ील्ड) जिसे <em>हर</em> डायनामिक सिस्टम अपने vertex shader में पढ़ता है। घास की पत्तियाँ झुकती हैं, पेड़ की शाखाएँ डोलती हैं, कपड़ा फड़फड़ाता है, पत्तियाँ बहती हैं, बारिश झुकती है, धुआँ बहता है, बादल weather maps scroll होते हैं। हर frame पर अपडेट होने वाला एक uniform, दर्जनों उपभोक्ता।</p>
<p>समृद्ध संस्करण एक &quot;wind grid&quot; है जो world position से sample की गई दिशा और ताकत स्टोर करता है, जिससे स्थानीय झोंकों वाले तूफ़ान, सुरक्षित घाटियाँ, और इमारतों के पीछे की wakes संभव होती हैं। Foliage को आमतौर पर authoring समय पर bake किया गया एक per-vertex offset भी मिलता है ताकि एक जैसे पेड़ एक साथ ताल में न डोलें। नतीजा एक ऐसी दुनिया है जो एक ही गति से साँस लेती है।</p>
<img src="/img/blog/clouds_weather_wind_foliage.webp" alt="Strong wind blowing grass and trees sideways with leaves swirling in the foreground under stormy clouds" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>गहराई से पढ़ें:</p>
<ul>
<li>McAuley, <a href="https://www.gdcvault.com/play/1022235/Rendering-the-World-of-Far" target="_blank" rel="noreferrer">Rendering the World of Far Cry 4</a> (GDC 2015, इसमें वनस्पति के लिए Far Cry 4 का wind grid शामिल है)।</li>
<li>Habel and Wimmer, <a href="https://www.cg.tuwien.ac.at/research/publications/2007/HABEL-2007-IIM/" target="_blank" rel="noreferrer">Realistic Real-Time Rendering of Landscapes Using Billboard Clouds</a> (पुराना, पर वनस्पति पर हवा का गणित अब भी वही है)।</li>
<li>Frostbite, <a href="https://www.guerrilla-games.com/read/the-vegetation-of-horizon-zero-dawn" target="_blank" rel="noreferrer">The Vegetation of Horizon Zero Dawn</a> (SIGGRAPH 2017, wind-सिस्टम architecture के साथ)।</li>
</ul>
<h2 id="_12-रेतीले-तूफ़ान-बर्फ़ीले-तूफ़ान-और-घना-मौसम" tabindex="-1">12. रेतीले तूफ़ान, बर्फ़ीले तूफ़ान, और घना मौसम <a class="header-anchor" href="#_12-रेतीले-तूफ़ान-बर्फ़ीले-तूफ़ान-और-घना-मौसम" aria-label="Permalink to &quot;12. रेतीले तूफ़ान, बर्फ़ीले तूफ़ान, और घना मौसम&quot;"></a></h2>
<p>भीषण मौसम अपनी अलग रेंडरिंग श्रेणी है। एक रेतीला तूफ़ान एक मोटा, अपारदर्शी, ground-aligned कोहरा है जिसमें एक मज़बूत दिशात्मक झुकाव और आक्रामक distance fog होता है। एक बर्फ़ीला तूफ़ान कैमरे के पास एक particle धमाका और घटी हुई दृश्यता जोड़ता है। ज्वालामुखीय राख और धुआँ अलग रंगों के साथ वही architecture हैं।</p>
<p>जो चीज़ इन्हें बेचती है वह particles नहीं है, वह है <em>coupling</em>: सूरज मद्धम पड़ता है, आसमान का रंग बदलता है, post-process color grading खिसकती है, ambient ऑडियो बदलता है, पैरों की आवाज़ बदलती है, खिलाड़ी की आवाज़ दबी हुई हो जाती है अगर उसकी कोई हो। रेंडरर संदेशवाहक है; immersion गेम के हर सिस्टम के एक ही समय पर प्रतिक्रिया देने से आता है।</p>
<img src="/img/blog/clouds_weather_sandstorm.webp" alt="A wall of orange dust and sand rolling across a desert plain with bruised sky above and clear blue behind" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>गहराई से पढ़ें:</p>
<ul>
<li>Burley, <a href="https://www.gdcvault.com/play/1024954/The-Real-time-Sky-and" target="_blank" rel="noreferrer">The Real-Time Sky and Atmosphere of Uncharted: The Lost Legacy</a> (GDC 2018, घने-मौसम composition पर नोट्स के साथ)।</li>
<li>Khalifa, <a href="https://www.gdcvault.com/play/1027587/Atmospheric-Weather-Effects-in-Forza" target="_blank" rel="noreferrer">Atmospheric Weather Effects in Forza Horizon 5</a> (GDC 2022, आधुनिक open-world मौसम)।</li>
<li>Karis, <a href="https://advances.realtimerendering.com/s2021/" target="_blank" rel="noreferrer">The Technology Behind the Unreal Engine 5 &quot;Lumen in the Land of Nanite&quot; Demo</a> (SIGGRAPH 2021, गुफा की धूल वाले सीन का वॉल्यूमेट्रिक stack)।</li>
</ul>
<h2 id="_13-time-of-day-और-डायनामिक-आसमान" tabindex="-1">13. Time of day और डायनामिक आसमान <a class="header-anchor" href="#_13-time-of-day-और-डायनामिक-आसमान" aria-label="Permalink to &quot;13. Time of day और डायनामिक आसमान&quot;"></a></h2>
<p>रियल-टाइम time of day वह गुणक है जो इस सूची के हर दूसरे सिस्टम को शिप करने लायक बना देता है। सूरज की दिशा और रंग एक 24-मिनट या 24-घंटे के चक्र पर अपडेट होते हैं। atmosphere LUT सूरज के कोण के साथ अपडेट होता है। बादलों की लाइटिंग हर frame पर फिर से कैलकुलेट होती है। shadow cascades फिर से इंगित होती हैं। reflection probes रीफ़्रेश होते हैं। ambient रंग खिसकता है। post-process exposure adapt होता है।</p>
<p>इसे बिना दिखने वाले artifacts के करना ज़्यादातर texture caching और temporal stability की कहानी है। तेज़ तकनीकें आसमान को निश्चित सूरज कोणों पर precompute करती हैं और interpolate करती हैं; धीमी तकनीकें हर frame फिर से कैलकुलेट करती हैं। Hillaire 2020 का atmosphere मॉडल फिर से कैलकुलेट करने लायक तेज़ है, यही वजह है कि UE5 इसे शिप करता है। बादल weather map हवा के साथ scroll होता है, इसलिए coverage बिना किसी के keyframes authoring के स्वाभाविक रूप से खिसक जाता है।</p>
<img src="/img/blog/clouds_weather_time_of_day.webp" alt="Three vertical bands across one landscape: dawn pink, noon blue, sunset red, all sharing the same hill silhouette" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>गहराई से पढ़ें:</p>
<ul>
<li>Hillaire, <a href="https://sebh.github.io/publications/egsr2020.pdf" target="_blank" rel="noreferrer">A Scalable and Production Ready Sky and Atmosphere Rendering Technique</a> (EGSR 2020, डायनामिक time-of-day चर्चा के साथ)।</li>
<li>Pesce, <a href="https://www.realtimerendering.com/raytracinggems/rtg2/index.html" target="_blank" rel="noreferrer">Real-Time Sky Rendering: Techniques and Tradeoffs</a> (Ray Tracing Gems II अध्याय, आधुनिक सर्वेक्षण)।</li>
<li>Bauer, <a href="https://www.youtube.com/watch?v=IYxtqlD1-Ac" target="_blank" rel="noreferrer">Creating the Atmospheric World of Red Dead Redemption 2</a> (SIGGRAPH 2019, 24-घंटे पाइपलाइन के साथ)।</li>
</ul>
<h2 id="_14-मौसम-state-machine" tabindex="-1">14. मौसम state machine <a class="header-anchor" href="#_14-मौसम-state-machine" aria-label="Permalink to &quot;14. मौसम state machine&quot;"></a></h2>
<p>इस सब के नीचे एक छोटी सी state machine है। ज़्यादातर गेम्स 4 से 12 मौसम states के बीच कहीं शिप करते हैं (साफ़, आंशिक रूप से बादल, घना बादल, हल्की बारिश, तेज़ बारिश, गरज वाला तूफ़ान, कोहरा, बर्फ, बर्फ़ीला तूफ़ान, रेतीला तूफ़ान), हर एक parameters के एक सेट से परिभाषित: बादल coverage और प्रकार, हवा की गति और दिशा, वर्षा का प्रकार और तीव्रता, ambient रंग, ऑडियो प्रोफ़ाइल, post-process grade।</p>
<p>Transitions 30 से 120 सेकंड में parameter सेट के बीच linear interpolations होती हैं। transition कोई विशेष मामला नहीं है, यह बस दो states के बीच lerp होना है, जिसमें हर रेंडरिंग सबसिस्टम उस frame के मौजूदा parameter मानों को पढ़ता है। मौसम scripted हो सकता है (cutscene को एक तूफ़ान चाहिए), seeded (हर क्षेत्र के लिए हर इन-गेम दिन पर deterministic ताकि एक ही दुनिया में दो खिलाड़ी एक जैसा मौसम देखें), या एक region grid पर पूरी तरह authored। सबसे साफ़ पाइपलाइन इन तीनों को एक ही parameter buffer में लिखने वाले अलग-अलग schedulers की तरह मानती हैं।</p>
<img src="/img/blog/clouds_weather_state_machine.webp" alt="Side-by-side of the same scene under clear sun on the left and stormy rain on the right with wet glistening surfaces" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>गहराई से पढ़ें:</p>
<ul>
<li>Bauer, <a href="https://www.youtube.com/watch?v=IYxtqlD1-Ac" target="_blank" rel="noreferrer">Creating the Atmospheric World of Red Dead Redemption 2</a> (SIGGRAPH 2019, weather-state पाइपलाइन के साथ)।</li>
<li>Khalifa, <a href="https://www.gdcvault.com/play/1027587/Atmospheric-Weather-Effects-in-Forza" target="_blank" rel="noreferrer">Atmospheric Weather Effects in Forza Horizon 5</a> (GDC 2022, parameter-blend तरीके के साथ)।</li>
<li>Schneider, <a href="https://www.guerrilla-games.com/read/the-real-time-volumetric-cloudscapes-of-horizon-zero-dawn" target="_blank" rel="noreferrer">The Real-Time Volumetric Cloudscapes of Horizon Zero Dawn</a> (SIGGRAPH 2015, weather-map-driven बादल विकास के साथ)।</li>
</ul>
<h2 id="_15-सिनेमाई-पल" tabindex="-1">15. सिनेमाई पल <a class="header-anchor" href="#_15-सिनेमाई-पल" aria-label="Permalink to &quot;15. सिनेमाई पल&quot;"></a></h2>
<p>यह पूरा stack कुछ हस्ताक्षर पलों के लिए मौजूद है। एक रिज पर खड़े होना जब एक storm front लुढ़कता हुआ आता है। canopy में एक खुली जगह से एक sun shaft को जलते देखना। एक गुफा से बाहर बर्फ में निकलना। एक cumulus बादल के बीच से उड़ना और अंदर की रोशनी देखना।</p>
<p>ये वे पल हैं जिनके खिलाड़ी screenshots लेते हैं। ये वे पल भी हैं जहाँ ऊपर का हर सिस्टम एक ही समय पर काम कर रहा होना चाहिए: cloud volumetrics, atmospheric scattering, shadow integration के साथ कोहरा, wet PBR, foliage पर हवा, time-of-day color grading, और मौसम states के बीच एक transition, सब एक frame में composing होते हुए। इनमें से कोई एक भी गलत करें और जादू टूट जाता है।</p>
<img src="/img/blog/clouds_weather_cloud_sea.webp" alt="Looking down across a sea of clouds onto a single mountain peak rising through, with sunlit cloud tops and shadowed valleys below" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<h2 id="इसका-browser-के-लिए-क्या-मतलब-है" tabindex="-1">इसका browser के लिए क्या मतलब है <a class="header-anchor" href="#इसका-browser-के-लिए-क्या-मतलब-है" aria-label="Permalink to &quot;इसका browser के लिए क्या मतलब है&quot;"></a></h2>
<p>इनमें से ज़्यादातर तकनीकें WebGPU पर साफ़-साफ़ map हो जाती हैं। हमने <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">open-world browser engine</a> में बुनियादी atmospheric कोहरा, equirectangular skybox ब्लेंडिंग, और screen-space distance haze शिप किया है। मुश्किल हिस्से (पूर्ण वॉल्यूमेट्रिक बादल, froxel grid कोहरा, डायनामिक पोखरों के साथ wet PBR, snow deformation maps) अब अगला स्पष्ट कदम हैं जब terrain पाइपलाइन स्थिर है। Spike 24 का skybox से per-fragment fog color sampling इस पहेली का एक टुकड़ा है। एक compute-shader cloud raymarcher जो उसी atmosphere LUT में feed करता है, अगला टुकड़ा है।</p>
<p>अच्छी खबर यह है कि browser हार्डवेयर का फ़र्श अब काफ़ी ऊँचा है। WebGPU compute, 3D टेक्सचर, indirect dispatch, और timestamp queries सब मौजूद हैं। Hillaire 2020 atmosphere को WebGL पर कई बार पोर्ट किया गया है। Schneider के Nubis के GLSL में ओपन-सोर्स reference implementations हैं जो यांत्रिक संपादनों के साथ WGSL में बदल जाते हैं। अब कोई रेंडरिंग वजह नहीं बची है कि एक browser गेम के पास वही आसमान न हो जो एक console के पास है। बस इंजीनियरिंग वजहें हैं, और इंजीनियरिंग वजहें वह तरह की हैं जो हमें पसंद हैं।</p>
<h2 id="पूरे-stack-में-आगे-पढ़ने-के-लिए" tabindex="-1">पूरे stack में आगे पढ़ने के लिए <a class="header-anchor" href="#पूरे-stack-में-आगे-पढ़ने-के-लिए" aria-label="Permalink to &quot;पूरे stack में आगे पढ़ने के लिए&quot;"></a></h2>
<p>अगर आप एक ऐसा स्रोत चाहते हैं जो इस सब को एक साथ खींचे, तो SIGGRAPH &quot;Advances in Real-Time Rendering in Games&quot; आर्काइव (<a href="https://advances.realtimerendering.com/" target="_blank" rel="noreferrer">advances.realtimerendering.com</a>) में 2014 तक के प्रामाणिक मौसम और वातावरण टॉक्स हैं। विशिष्ट गेम्स अपना आसमान और मौसम कैसे रेंडर करते हैं, इसके production tear-downs के लिए <a href="http://www.adriancourreges.com/blog/" target="_blank" rel="noreferrer">Adrian Courrèges के GPU profiling लेखों</a> में GTA V, Horizon Zero Dawn, और Doom Eternal के विस्तृत frame-by-frame ब्रेकडाउन शामिल हैं। खासकर आसमान और वातावरण के गणित के लिए, <a href="https://www.scratchapixel.com/lessons/3d-basic-rendering/volume-rendering-for-developers/intro-volume-rendering.html" target="_blank" rel="noreferrer">scratchapixel.com का volume rendering अध्याय</a> सबसे सहज परिचय है, और Hillaire की ओपन-सोर्स <a href="https://github.com/sebh/UnrealEngineSkyAtmosphere" target="_blank" rel="noreferrer">implementation repository</a> production-quality reference है।</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[आधुनिक AAA games में इस्तेमाल होने वाली rendering तकनीकों की एक छोटी सूची]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-05-03-aaa-rendering-techniques</link>
            <guid>https://app.cinevva.com/hi/blog/2026-05-03-aaa-rendering-techniques</guid>
            <pubDate>Sun, 03 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[आज के AAA visuals के पीछे काम करने वाली मुख्य rendering तकनीकें, Nanite virtualized geometry से लेकर ReSTIR path tracing और ML आधारित upscaling तक, हर एक के लिए गहरे technical references के साथ।]]></description>
            <content:encoded><![CDATA[<h1 id="आधुनिक-aaa-games-में-इस्तेमाल-होने-वाली-rendering-तकनीकों-की-एक-छोटी-सूची" tabindex="-1">आधुनिक AAA games में इस्तेमाल होने वाली rendering तकनीकों की एक छोटी सूची <a class="header-anchor" href="#आधुनिक-aaa-games-में-इस्तेमाल-होने-वाली-rendering-तकनीकों-की-एक-छोटी-सूची" aria-label="Permalink to &quot;आधुनिक AAA games में इस्तेमाल होने वाली rendering तकनीकों की एक छोटी सूची&quot;"></a></h1>
<p><em>लिखा है <a href="/hi/about.html">Oleg Sidorkin</a> ने, Cinevva के CTO और Co-Founder</em></p>
<img src="/img/blog/aaa_rendering_hero.webp" alt="Composite scene showing PBR materials, virtualized geometry, and ray-traced lighting in a modern AAA game" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>अगर आप 2026 के किसी AAA game की rendering pipeline खोलकर देखें, तो उसमें से ज़्यादातर चीज़ें तकनीकों के एक छोटे से समूह से जुड़ी मिलेंगी, जो सभी studios में इस्तेमाल होती हैं। engines के बीच नाम बदल जाते हैं, पर विचार वही रहते हैं। यहाँ एक छोटी सूची है कि screen पर असल में काम क्या कर रहा है, हर एक के लिए एक figure और कुछ गहरे technical references के साथ।</p>
<h2 id="_1-physically-based-rendering-pbr" tabindex="-1">1. Physically based rendering (PBR) <a class="header-anchor" href="#_1-physically-based-rendering-pbr" aria-label="Permalink to &quot;1. Physically based rendering (PBR)&quot;"></a></h2>
<p>Materials को albedo, roughness, metallic, normal और ambient occlusion textures से बताया जाता है, और energy-conserving shaders (Cook-Torrance specular, Lambertian या Disney diffuse) से रोशनी दी जाती है। यह वह आधार है जिसे हर आधुनिक AAA engine मानकर चलता है। अगर कोई surface धूप में, lamp की रोशनी में और flashlight में एक जैसा दिखता है, तो उसकी वजह PBR है।</p>
<img src="/img/blog/aaa_pbr_materials.webp" alt="Iron helmet rendered with PBR materials, with floating texture swatches showing albedo, roughness, metallic, and normal maps" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>गहराई से जानें:</p>
<ul>
<li>Burley, <a href="https://media.disneyanimation.com/uploads/production/publication_asset/48/asset/s2012_pbs_disney_brdf_notes_v3.pdf" target="_blank" rel="noreferrer">Physically-Based Shading at Disney</a> (मूल &quot;Disney BRDF&quot; course notes, SIGGRAPH 2012)।</li>
<li>Karis, <a href="https://cdn2.unrealengine.com/Resources/files/2013SiggraphPresentationsNotes-26915738.pdf" target="_blank" rel="noreferrer">Real Shading in Unreal Engine 4</a> (SIGGRAPH 2013, canonical UE4 PBR talk)।</li>
<li>Lagarde और de Rousiers, <a href="https://seblagarde.wordpress.com/2015/07/14/siggraph-2014-moving-frostbite-to-physically-based-rendering/" target="_blank" rel="noreferrer">Moving Frostbite to Physically Based Rendering 3.0</a> (SIGGRAPH 2014, पूरी Frostbite pipeline)।</li>
<li><a href="https://www.realtimerendering.com/" target="_blank" rel="noreferrer">Real-Time Rendering, 4th edition, chapter 9</a> (textbook reference)।</li>
</ul>
<h2 id="_2-deferred-और-visibility-buffer-shading" tabindex="-1">2. Deferred और visibility-buffer shading <a class="header-anchor" href="#_2-deferred-और-visibility-buffer-shading" aria-label="Permalink to &quot;2. Deferred और visibility-buffer shading&quot;"></a></h2>
<p>Geometry सबसे पहले attributes (normals, material IDs, depth) को एक G-buffer या visibility buffer में लिखती है। Lighting एक fullscreen pass की तरह चलती है जो उन buffers को पढ़कर हर pixel को एक बार shade करती है। Visibility buffers (Nanite और इससे मिलती-जुलती तकनीकों में इस्तेमाल होते हैं) इसे और आगे ले जाते हैं, सिर्फ़ triangle IDs को store करके और material parameters को बाद में per pixel resolve करके, जिससे dense geometry पर overdraw सस्ता रहता है।</p>
<img src="/img/blog/aaa_deferred_gbuffer.webp" alt="Deferred shading G-buffer split into final color, world normals, depth, and material ID panels" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>गहराई से जानें:</p>
<ul>
<li>Engel, <a href="https://download.nvidia.com/developer/presentations/2004/6800_Leagues/6800_Leagues_Deferred_Shading.pdf" target="_blank" rel="noreferrer">Deferred Shading</a> (NVIDIA, नींव रखने वाला talk)।</li>
<li>Burns और Hunt, <a href="http://jcgt.org/published/0002/02/04/" target="_blank" rel="noreferrer">The Visibility Buffer: A Cache-Friendly Approach to Deferred Shading</a> (JCGT 2013, मूल visibility buffer paper)।</li>
<li>Wihlidal, <a href="http://www.frostbite.com/2016/03/optimizing-the-graphics-pipeline-with-compute/" target="_blank" rel="noreferrer">&quot;Optimizing the Graphics Pipeline with Compute&quot;</a> (GDC 2016, Frostbite का compute आधारित deferred path)।</li>
<li>Karis, Stubbe, Wihlidal, <a href="https://advances.realtimerendering.com/s2021/Karis_Nanite_SIGGRAPH_Advances_2021_final.pdf" target="_blank" rel="noreferrer">A Deep Dive into Nanite Virtualized Geometry</a> (SIGGRAPH 2021, इसमें Nanite visibility buffer विस्तार से है)।</li>
</ul>
<h2 id="_3-virtualized-geometry-nanite-style" tabindex="-1">3. Virtualized geometry (Nanite-style) <a class="header-anchor" href="#_3-virtualized-geometry-nanite-style" aria-label="Permalink to &quot;3. Virtualized geometry (Nanite-style)&quot;"></a></h2>
<p>Meshes को पहले से clusters की एक hierarchy में बना लिया जाता है। runtime पर GPU clusters को उस resolution पर stream और select करता है जो हर pixel से मेल खाती है, जिससे बिना manual LODs के sub-pixel-accurate detail मिलती है। Unreal का Nanite इसका सबसे जाना-पहचाना उदाहरण है। अब दूसरे engines भी अपने-अपने variants देते हैं। इसका असली नतीजा है बिना LOD authoring के real time में film-quality assets।</p>
<img src="/img/blog/aaa_virtualized_geometry.webp" alt="Smooth render on the left, sub-pixel meshlet clusters in vivid colors on the right" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>गहराई से जानें:</p>
<ul>
<li>Karis, Stubbe, Wihlidal, <a href="https://advances.realtimerendering.com/s2021/Karis_Nanite_SIGGRAPH_Advances_2021_final.pdf" target="_blank" rel="noreferrer">A Deep Dive into Nanite Virtualized Geometry</a> (SIGGRAPH 2021)।</li>
<li>Brian Karis, <a href="https://www.youtube.com/watch?v=eviSykqSUUw" target="_blank" rel="noreferrer">Nanite GDC 2021 talk</a> (आसानी से समझ आने वाला video walkthrough)।</li>
<li>Liktor, <a href="https://research.activision.com/publications/2021/09/geometry-rendering-pipeline-architecture-at-activision" target="_blank" rel="noreferrer">Geometry Rendering Pipeline Architecture at Activision</a> (cluster आधारित rendering, 2021)।</li>
<li>Schied et al., <a href="https://research.nvidia.com/publication/2017-07_spatiotemporal-variance-guided-filtering-real-time-reconstruction-path-traced" target="_blank" rel="noreferrer">Spatiotemporal Variance-Guided Filtering</a> (इससे जुड़ी cluster culling तकनीकें)।</li>
</ul>
<h2 id="_4-shadows-reflections-और-ao-के-लिए-real-time-ray-tracing" tabindex="-1">4. Shadows, reflections और AO के लिए real-time ray tracing <a class="header-anchor" href="#_4-shadows-reflections-और-ao-के-लिए-real-time-ray-tracing" aria-label="Permalink to &quot;4. Shadows, reflections और AO के लिए real-time ray tracing&quot;"></a></h2>
<p>Hardware ray tracing (DXR, Vulkan RT) हर frame में बने एक BVH के विरुद्ध shadow rays, mirror और glossy reflection rays, और ambient occlusion rays trace करती है। per pixel कुछ rays भी screen-space तकनीकों से बेहतर नतीजा देती हैं, खासकर off-screen reflections और contact shadows के लिए। ज़्यादातर games इसका इस्तेमाल सोच-समझकर करते हैं, हर चीज़ के लिए नहीं।</p>
<img src="/img/blog/aaa_hardware_raytracing.webp" alt="Glossy red sports car in a luxury showroom with accurate ray-traced reflections and contact shadows" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>गहराई से जानें:</p>
<ul>
<li>Microsoft, <a href="https://microsoft.github.io/DirectX-Specs/d3d/Raytracing.html" target="_blank" rel="noreferrer">DirectX Raytracing (DXR) Functional Spec</a> (API reference)।</li>
<li>Wyman, <a href="http://intro-to-dxr.cwyman.org/" target="_blank" rel="noreferrer">Introduction to DirectX Raytracing</a> (SIGGRAPH course notes, बहुत आसान)।</li>
<li>Boksansky और Marrs, <a href="https://www.realtimerendering.com/raytracinggems/rtg2/index.html" target="_blank" rel="noreferrer">Ray Tracing Gems II, chapters 17-19</a> (मुफ़्त PDF, आधुनिक DXR तकनीकें)।</li>
<li>Stachowiak, <a href="https://www.ea.com/frostbite/news/stochastic-screen-space-reflections" target="_blank" rel="noreferrer">Stochastic Screen-Space Reflections</a> (Frostbite, SSR से RT तक का पुल)।</li>
</ul>
<h2 id="_5-software-ray-tracing-lumen-style" tabindex="-1">5. Software ray tracing (Lumen-style) <a class="header-anchor" href="#_5-software-ray-tracing-lumen-style" aria-label="Permalink to &quot;5. Software ray tracing (Lumen-style)&quot;"></a></h2>
<p>हर player के पास RTX card नहीं होता, इसलिए engines distance-field या surface-cache fallbacks भी देते हैं। Unreal का Lumen, उदाहरण के लिए, सस्ती diffuse GI के लिए signed distance fields और surface caches के विरुद्ध trace करता है, और ज़रूरत पड़ने पर ही hardware rays तक बढ़ता है। AAA games consoles पर &quot;ray-traced look&quot; इसी तरह हासिल करते हैं।</p>
<img src="/img/blog/aaa_software_rt_lumen.webp" alt="Cathedral interior with stained-glass color bleed and an SDF wireframe overlay revealing approximated geometry" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>गहराई से जानें:</p>
<ul>
<li>Wright et al., <a href="https://advances.realtimerendering.com/s2022/SIGGRAPH2022-Advances-Lumen-Wright%20et%20al.pdf" target="_blank" rel="noreferrer">Lumen: Real-Time Global Illumination in Unreal Engine 5</a> (SIGGRAPH 2022, Lumen paper)।</li>
<li>Epic Games, <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/lumen-technical-details-in-unreal-engine" target="_blank" rel="noreferrer">Lumen Technical Details</a> (आधिकारिक engine docs)।</li>
<li>Wright, <a href="https://advances.realtimerendering.com/s2021/Wright%20et%20al%20-%20Radiance%20Caching%20for%20Real-Time%20Global%20Illumination%20-%20SIGGRAPH%202021.pdf" target="_blank" rel="noreferrer">Radiance Caching for Real-Time Global Illumination</a> (SIGGRAPH 2021)।</li>
<li>Wright, <a href="https://www.youtube.com/watch?v=2GYXuM10riw" target="_blank" rel="noreferrer">Lumen GDC 2022 talk</a> (video version)।</li>
</ul>
<h2 id="_6-restir-और-reservoir-sampling" tabindex="-1">6. ReSTIR और reservoir sampling <a class="header-anchor" href="#_6-restir-और-reservoir-sampling" aria-label="Permalink to &quot;6. ReSTIR और reservoir sampling&quot;"></a></h2>
<p>हज़ारों light sources के साथ direct और indirect lighting के लिए, ReSTIR (Reservoir Spatio-Temporal Importance Resampling) pixels और frames के बीच light samples दोबारा इस्तेमाल करता है। Path Tracing के साथ Cyberpunk 2077 जैसे games per pixel एक या दो rays पर noise इसी तरह कम रखते हैं। जैसे-जैसे path tracing high-end target बनता जाएगा, इसे और engines में देखने को मिलेगा।</p>
<img src="/img/blog/aaa_ray_tracing_restir.webp" alt="Cyberpunk street with ray-traced reflections in wet pavement and visible bounced light paths" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>गहराई से जानें:</p>
<ul>
<li>Bitterli et al., <a href="https://research.nvidia.com/sites/default/files/pubs/2020-07_Spatiotemporal-reservoir-resampling/ReSTIR.pdf" target="_blank" rel="noreferrer">Spatiotemporal Reservoir Resampling for Real-Time Ray Tracing with Dynamic Direct Lighting</a> (SIGGRAPH 2020, मूल ReSTIR paper)।</li>
<li>Ouyang et al., <a href="https://research.nvidia.com/publication/2021-06_restir-gi-path-resampling-real-time-path-tracing" target="_blank" rel="noreferrer">ReSTIR GI: Path Resampling for Real-Time Path Tracing</a> (HPG 2021, indirect-illumination ReSTIR)।</li>
<li>Lin et al., <a href="https://research.nvidia.com/publication/2022-07_generalized-resampled-importance-sampling-foundations-restir" target="_blank" rel="noreferrer">Generalized Resampled Importance Sampling</a> (SIGGRAPH 2022, गणितीय आधार)।</li>
<li>NVIDIA, <a href="https://www.nvidia.com/en-us/geforce/news/cyberpunk-2077-ray-tracing-overdrive-technology-preview-on-rtx-4090/" target="_blank" rel="noreferrer">Cyberpunk 2077 Path Tracing Tech Deep Dive</a> (engineering blog)।</li>
</ul>
<h2 id="_7-volumetric-clouds-fog-और-atmosphere" tabindex="-1">7. Volumetric clouds, fog और atmosphere <a class="header-anchor" href="#_7-volumetric-clouds-fog-और-atmosphere" aria-label="Permalink to &quot;7. Volumetric clouds, fog और atmosphere&quot;"></a></h2>
<p>Skies को 3D noise और density volumes के बीच से ray-march किया जाता है। Atmosphere सूरज और चाँद के transitions के लिए precomputed scattering tables (Bruneton-style) इस्तेमाल करती है। Fog एक froxel grid है (view frustum से aligned एक 3D texture की तरह सोचिए) जो local lighting को पकड़ता है। मिलकर ये आपको skybox की जगह &quot;weather as a system&quot; देते हैं।</p>
<img src="/img/blog/aaa_volumetrics.webp" alt="Mountain valley at sunset with volumetric clouds and god rays piercing through misty air" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>गहराई से जानें:</p>
<ul>
<li>Schneider, <a href="https://www.guerrilla-games.com/read/the-real-time-volumetric-cloudscapes-of-horizon-zero-dawn" target="_blank" rel="noreferrer">The Real-Time Volumetric Cloudscapes of Horizon Zero Dawn</a> (SIGGRAPH 2015, canonical clouds reference)।</li>
<li>Hillaire, <a href="https://sebh.github.io/publications/egsr2020.pdf" target="_blank" rel="noreferrer">A Scalable and Production Ready Sky and Atmosphere Rendering Technique</a> (EGSR 2020, UE5 में इस्तेमाल होने वाला आधुनिक Bruneton successor)।</li>
<li>Wronski, <a href="https://bartwronski.com/2014/08/22/volumetric-fog-siggraph-2014/" target="_blank" rel="noreferrer">Volumetric Fog: Unified Compute Shader Based Solution to Atmospheric Scattering</a> (SIGGRAPH 2014, Assassin's Creed 4 froxel fog)।</li>
<li>Hillaire, <a href="https://www.ea.com/frostbite/news/physically-based-unified-volumetric-rendering-in-frostbite" target="_blank" rel="noreferrer">Physically Based and Unified Volumetric Rendering in Frostbite</a> (SIGGRAPH 2015)।</li>
</ul>
<h2 id="_8-cascaded-shadow-maps-और-virtual-shadow-maps" tabindex="-1">8. Cascaded shadow maps और virtual shadow maps <a class="header-anchor" href="#_8-cascaded-shadow-maps-और-virtual-shadow-maps" aria-label="Permalink to &quot;8. Cascaded shadow maps और virtual shadow maps&quot;"></a></h2>
<p>सूरज की shadows के लिए, cascaded shadow maps frustum को ranges में बाँटते हैं और हर एक को उचित resolution पर render करते हैं। Virtual shadow maps इससे आगे जाते हैं: एक विशाल shadow map को pages में बाँटा जाता है और सिर्फ़ वही pages render होते हैं जो camera से दिखते हैं। AAA games player के पास crisp shadows बिना भारी memory खर्च के इसी तरह रखते हैं।</p>
<img src="/img/blog/aaa_cascaded_shadows.webp" alt="Outdoor scene with three colored cascade frustums overlaid showing shadow detail near the camera" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>गहराई से जानें:</p>
<ul>
<li>Dimitrov, <a href="https://developer.download.nvidia.com/SDK/10.5/opengl/src/cascaded_shadow_maps/doc/cascaded_shadow_maps.pdf" target="_blank" rel="noreferrer">Cascaded Shadow Maps</a> (NVIDIA whitepaper, standard reference)।</li>
<li>Microsoft, <a href="https://learn.microsoft.com/en-us/windows/win32/dxtecharts/cascaded-shadow-maps" target="_blank" rel="noreferrer">Common Techniques to Improve Shadow Depth Maps</a> (DirectX docs)।</li>
<li>Wright, <a href="https://advances.realtimerendering.com/s2023/index.html#VirtualShadowMaps" target="_blank" rel="noreferrer">Virtual Shadow Maps in Fortnite Battle Royale Chapter 4</a> (SIGGRAPH 2023, UE5 VSM talk)।</li>
<li>Epic Games, <a href="https://dev.epicgames.com/documentation/en-us/unreal-engine/virtual-shadow-maps-in-unreal-engine" target="_blank" rel="noreferrer">Virtual Shadow Maps documentation</a>।</li>
</ul>
<h2 id="_9-screen-space-effects-ssao-ssr-ssgi-sssss" tabindex="-1">9. Screen-space effects (SSAO, SSR, SSGI, SSSSS) <a class="header-anchor" href="#_9-screen-space-effects-ssao-ssr-ssgi-sssss" aria-label="Permalink to &quot;9. Screen-space effects (SSAO, SSR, SSGI, SSSSS)&quot;"></a></h2>
<p>depth और normal buffers को सस्ते में पढ़कर आपको ambient occlusion (SSAO), reflections (SSR), one-bounce global illumination (SSGI), और त्वचा के लिए subsurface scattering (SSSSS) मिलते हैं। ये off-screen detail को छोड़ देते हैं, इसीलिए ray tracing आगे बढ़ रहा है, पर एक तेज़ आधार के तौर पर ये अब भी हर जगह हैं।</p>
<img src="/img/blog/aaa_screen_space_effects.webp" alt="Side-by-side kitchen scene comparing flat lighting on the left with SSAO, SSR, and SSGI on the right" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>गहराई से जानें:</p>
<ul>
<li>Mittring, <a href="https://www.crytek.com/wp-content/uploads/Finding%20Next%20Gen%20-%20CryEngine%202.pdf" target="_blank" rel="noreferrer">Finding Next Gen: CryENGINE 2</a> (SIGGRAPH 2007, मूल SSAO paper)।</li>
<li>McGuire et al., <a href="https://research.nvidia.com/publication/scalable-ambient-obscurance" target="_blank" rel="noreferrer">Scalable Ambient Obscurance</a> (HPG 2012, आधुनिक SSAO)।</li>
<li>Stachowiak और Uludag, <a href="https://www.ea.com/frostbite/news/stochastic-screen-space-reflections" target="_blank" rel="noreferrer">Stochastic Screen-Space Reflections</a> (Frostbite, SSR reference)।</li>
<li>Jimenez, <a href="https://www.iryoku.com/separable-sss/" target="_blank" rel="noreferrer">Separable Subsurface Scattering</a> (ज़्यादातर AAA engines में त्वचा के लिए इस्तेमाल होने वाली तकनीक)।</li>
<li>Mara et al., <a href="https://research.activision.com/publications/2016/09/deep-g-buffers-for-stable-global-illumination-approximation" target="_blank" rel="noreferrer">Deep Screen Space</a> (Activision, एक SSGI lineage)।</li>
</ul>
<h2 id="_10-temporal-anti-aliasing-और-ml-upscaling-dlss-fsr-xess" tabindex="-1">10. Temporal anti-aliasing और ML upscaling (DLSS, FSR, XeSS) <a class="header-anchor" href="#_10-temporal-anti-aliasing-और-ml-upscaling-dlss-fsr-xess" aria-label="Permalink to &quot;10. Temporal anti-aliasing और ML upscaling (DLSS, FSR, XeSS)&quot;"></a></h2>
<p>Frame को कम internal resolution पर render किया जाता है और motion vectors, depth और history का इस्तेमाल करके फिर से बनाया जाता है। ML आधारित upscalers (DLSS 3/4, FSR 3, XeSS) ऊपर से frame generation जोड़ते हैं, optical flow से बीच के frames interpolate करते हुए। ज़्यादातर AAA titles अब यह मानकर ship करते हैं कि कोई upscaler चालू है, जो बदल देता है कि आप बाकी frame का budget कैसे तय करते हैं।</p>
<img src="/img/blog/aaa_ml_upscaling.webp" alt="Side-by-side of a low-resolution input and a sharp ML-reconstructed output of the same character" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>गहराई से जानें:</p>
<ul>
<li>Karis, <a href="http://advances.realtimerendering.com/s2014/index.html#_HIGH-QUALITY_TEMPORAL_SUPERSAMPLING" target="_blank" rel="noreferrer">High Quality Temporal Supersampling</a> (SIGGRAPH 2014, canonical TAA talk)।</li>
<li>Salvi, <a href="https://research.nvidia.com/sites/default/files/pubs/2016-03_An-Excursion-in/dlss_DTAA-2-2.pdf" target="_blank" rel="noreferrer">An Excursion in Temporal Supersampling</a> (NVIDIA, DLSS की राह पर)।</li>
<li>Edelsten, <a href="https://www.gdcvault.com/play/1026184/" target="_blank" rel="noreferrer">Truly Next-Gen: Adding Deep Learning to Games and Graphics</a> (GDC 2019, DLSS architecture)।</li>
<li>AMD, <a href="https://gpuopen.com/fidelityfx-super-resolution-3/" target="_blank" rel="noreferrer">FidelityFX Super Resolution 3 technical details</a> और Intel, <a href="https://www.intel.com/content/www/us/en/developer/articles/technical/intel-xess-technical-paper.html" target="_blank" rel="noreferrer">XeSS technical paper</a>।</li>
</ul>
<h2 id="_11-gpu-driven-rendering-और-mesh-shaders" tabindex="-1">11. GPU-driven rendering और mesh shaders <a class="header-anchor" href="#_11-gpu-driven-rendering-और-mesh-shaders" aria-label="Permalink to &quot;11. GPU-driven rendering और mesh shaders&quot;"></a></h2>
<p>Culling, LOD selection और draw submission सब GPU पर चलते हैं। Mesh shaders vertex/geometry/tessellation pipeline की जगह एक ज़्यादा लचीली compute-style stage ले आते हैं जो meshlets emit करती है। multi-draw indirect के साथ मिलकर, यह CPU को per-object hot loop से पूरी तरह बाहर रखता है।</p>
<img src="/img/blog/aaa_gpu_driven_meshlets.webp" alt="Alien spaceport scene with colored meshlet cluster overlay showing GPU-driven rendering" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>गहराई से जानें:</p>
<ul>
<li>Haar और Aaltonen, <a href="https://advances.realtimerendering.com/s2015/aaltonenhaar_siggraph2015_combined_final_footer_220dpi.pdf" target="_blank" rel="noreferrer">GPU-Driven Rendering Pipelines</a> (SIGGRAPH 2015, नींव रखने वाला Assassin's Creed Unity talk)।</li>
<li>Wihlidal, <a href="https://www.frostbite.com/2016/03/optimizing-the-graphics-pipeline-with-compute/" target="_blank" rel="noreferrer">Optimizing the Graphics Pipeline with Compute</a> (GDC 2016, Frostbite GPU-driven culling)।</li>
<li>Kubisch, <a href="https://developer.nvidia.com/blog/introduction-turing-mesh-shaders/" target="_blank" rel="noreferrer">Introduction to Turing Mesh Shaders</a> (NVIDIA, mesh shader primer)।</li>
<li>Pesce, <a href="https://www.bartwronski.com/" target="_blank" rel="noreferrer">A Whirlwind Tour of Mesh Shaders</a> (और इससे मिलते-जुलते engineering blogs, जो <a href="http://www.adriancourreges.com/blog/" target="_blank" rel="noreferrer">Adrian Courrèges के RenderDoc tear-downs</a> पर इकट्ठा हैं)।</li>
</ul>
<h2 id="_12-hair-cloth-और-skin-rendering" tabindex="-1">12. Hair, cloth और skin rendering <a class="header-anchor" href="#_12-hair-cloth-और-skin-rendering" aria-label="Permalink to &quot;12. Hair, cloth और skin rendering&quot;"></a></h2>
<p>Hair strand आधारित geometry के साथ Marschner-style anisotropic shading इस्तेमाल करता है (NVIDIA HairWorks, AMD TressFX, या engine-native systems)। Cloth को GPU पर position-based dynamics से simulate किया जाता है और anisotropic specular के साथ render किया जाता है। Skin screen-space subsurface scattering और pre-integrated wrap lighting इस्तेमाल करती है। आमतौर पर इन्हीं तीनों में AAA और indie के बीच budget का फ़र्क़ नज़र आता है।</p>
<img src="/img/blog/aaa_hair_cloth_skin.webp" alt="Close-up of a warrior with strand-based hair, cloth cloak, and subsurface-scattered skin" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>गहराई से जानें:</p>
<ul>
<li>Marschner et al., <a href="https://www.cs.cornell.edu/~srm/publications/SG03-hair.pdf" target="_blank" rel="noreferrer">Light Scattering from Human Hair Fibers</a> (SIGGRAPH 2003, नींव रखने वाला hair model)।</li>
<li>Chiang et al., <a href="https://benedikt-bitterli.me/pchfm/pchfm.pdf" target="_blank" rel="noreferrer">A Practical and Controllable Hair and Fur Model for Production Path Tracing</a> (Disney 2016, real-time approximations में व्यापक रूप से इस्तेमाल)।</li>
<li>Müller et al., <a href="https://matthias-research.github.io/pages/publications/posBasedDyn.pdf" target="_blank" rel="noreferrer">Position Based Dynamics</a> (standard cloth simulation reference)।</li>
<li>Jimenez et al., <a href="https://www.iryoku.com/separable-sss/" target="_blank" rel="noreferrer">Separable Subsurface Scattering</a> और <a href="https://www.iryoku.com/translucency/" target="_blank" rel="noreferrer">Real-Time Realistic Skin Translucency</a>।</li>
</ul>
<h2 id="_13-decals-virtual-texturing-और-material-layering" tabindex="-1">13. Decals, virtual texturing और material layering <a class="header-anchor" href="#_13-decals-virtual-texturing-और-material-layering" aria-label="Permalink to &quot;13. Decals, virtual texturing और material layering&quot;"></a></h2>
<p>Surface में विविधता layered decals (bullet holes, धूल, खून, मैल) से आती है जो depth buffer पर project होते हैं, साथ ही virtual textures जो high-resolution detail को ठीक समय पर stream करती हैं। Material layering masks और triplanar projection का इस्तेमाल करके per pixel कई PBR sets को blend करती है, जिससे एक ही चट्टान पाँच चट्टानों जैसी दिखती है।</p>
<img src="/img/blog/aaa_decals_virtual_textures.webp" alt="Weathered concrete bunker wall with bullet decals, graffiti, and a virtual texture page atlas inset" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>गहराई से जानें:</p>
<ul>
<li>Pranckevičius, <a href="https://aras-p.info/blog/2009/02/27/deferred-decals/" target="_blank" rel="noreferrer">Deferred Decals</a> और follow-ups (Aras की classic blog series)।</li>
<li>Mittring, <a href="http://advances.realtimerendering.com/s2012/Epic/UnrealEngine4_Mittring_SIGGRAPH2012_Final_Cleaned.pdf" target="_blank" rel="noreferrer">The Technology Behind the &quot;Unreal Engine 4 Elemental Demo&quot;</a> (SIGGRAPH 2012, इसमें virtual texturing की जानकारी है)।</li>
<li>van Waveren, <a href="https://www.realtimerendering.com/blog/id-tech-5-challenges-from-texture-virtualization-to-massive-parallelization/" target="_blank" rel="noreferrer">id Tech 5 Challenges: From Texture Virtualization to Massive Parallelization</a> (SIGGRAPH 2009, MegaTexture talk)।</li>
<li>Williams, <a href="https://www.gdcvault.com/play/1022144/Crafting-the-World-of-The" target="_blank" rel="noreferrer">Material Layering in The Order: 1886</a> (GDC 2014, layered PBR materials)।</li>
</ul>
<h2 id="_14-order-independent-transparency" tabindex="-1">14. Order-independent transparency <a class="header-anchor" href="#_14-order-independent-transparency" aria-label="Permalink to &quot;14. Order-independent transparency&quot;"></a></h2>
<p>Hair, foliage, particles और glass साफ़-साफ़ sort नहीं होते। AAA engines उन्हें CPU sort step के बिना सही ढंग से render करने के लिए weighted blended OIT, depth peeling, या per-pixel linked lists जैसी तकनीकें इस्तेमाल करते हैं। foliage से भरे scene में यह चुपचाप frame के सबसे महँगे हिस्सों में से एक होता है।</p>
<img src="/img/blog/aaa_oit_transparency.webp" alt="Forest scene with overlapping translucent foliage, smoke, glass droplets, and translucent hair" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>गहराई से जानें:</p>
<ul>
<li>McGuire और Bavoil, <a href="http://jcgt.org/published/0002/02/09/" target="_blank" rel="noreferrer">Weighted Blended Order-Independent Transparency</a> (JCGT 2013, WBOIT paper)।</li>
<li>Bavoil और Myers, <a href="https://developer.download.nvidia.com/SDK/10/opengl/src/dual_depth_peeling/doc/DualDepthPeeling.pdf" target="_blank" rel="noreferrer">Order Independent Transparency with Dual Depth Peeling</a> (NVIDIA whitepaper)।</li>
<li>Yang et al., <a href="https://www.cse.chalmers.se/edu/year/2017/course/TDA362/Per-Pixel%20Linked%20List.pdf" target="_blank" rel="noreferrer">Real-Time Concurrent Linked List Construction on the GPU</a> (per-pixel linked list reference)।</li>
<li>Wyman, <a href="https://research.nvidia.com/publication/2016-06_exploring-and-expanding-continuum-oit-algorithms" target="_blank" rel="noreferrer">Exploring and Expanding the Continuum of OIT Algorithms</a> (HPG 2016, तुलनात्मक survey)।</li>
</ul>
<h2 id="_15-neural-radiance-caching-और-ml-denoisers" tabindex="-1">15. Neural radiance caching और ML denoisers <a class="header-anchor" href="#_15-neural-radiance-caching-और-ml-denoisers" aria-label="Permalink to &quot;15. Neural radiance caching और ML denoisers&quot;"></a></h2>
<p>सबसे नई परत। NVIDIA का neural radiance cache हर scene के indirect lighting को सीखता है और और rays trace करने की बजाय उसे query करता है। ML denoisers (OptiX, Intel Open Image Denoise, custom in-house) sparse ray-traced signals को मिलीसेकंड में साफ़ कर देते हैं। उम्मीद कीजिए कि यह श्रेणी अगले दो सालों में तेज़ी से बढ़ेगी।</p>
<img src="/img/blog/aaa_neural_radiance_denoise.webp" alt="Noisy 1-spp ray-traced cathedral on the left, clean ML-denoised result on the right" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>गहराई से जानें:</p>
<ul>
<li>Müller et al., <a href="https://research.nvidia.com/publication/2021-06_real-time-neural-radiance-caching-path-tracing" target="_blank" rel="noreferrer">Real-Time Neural Radiance Caching for Path Tracing</a> (SIGGRAPH 2021, NRC paper)।</li>
<li>Schied et al., <a href="https://research.nvidia.com/publication/2017-07_spatiotemporal-variance-guided-filtering-real-time-reconstruction-path-traced" target="_blank" rel="noreferrer">Spatiotemporal Variance-Guided Filtering: Real-Time Reconstruction for Path-Traced Global Illumination</a> (HPG 2017, SVGF)।</li>
<li>Chaitanya et al., <a href="https://research.nvidia.com/publication/interactive-reconstruction-monte-carlo-image-sequences-using-recurrent-denoising" target="_blank" rel="noreferrer">Interactive Reconstruction of Monte Carlo Image Sequences using a Recurrent Denoising Autoencoder</a> (SIGGRAPH 2017, पहला recurrent ML denoiser)।</li>
<li>Intel, <a href="https://www.openimagedenoise.org/documentation.html" target="_blank" rel="noreferrer">Open Image Denoise documentation</a> (open-source production denoiser)।</li>
</ul>
<h2 id="browser-के-लिए-इसका-क्या-मतलब-है" tabindex="-1">browser के लिए इसका क्या मतलब है <a class="header-anchor" href="#browser-के-लिए-इसका-क्या-मतलब-है" aria-label="Permalink to &quot;browser के लिए इसका क्या मतलब है&quot;"></a></h2>
<p>हमने इनमें से कई तकनीकें अपने <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">open-world browser engine</a> में WebGPU पर ship की हैं। Cascaded shadow maps, GPU-driven instancing, triplanar PBR, screen-space fog, और clipmap आधारित virtualized terrain, ये सब एक tab में 120 FPS पर चलते हैं। बाकी (hardware ray tracing, mesh shaders, ML upscaling) web पर तब आ रहा है जब WebGPU spec इन्हें पकड़ रहा है। और गहराई से जानने के लिए, <a href="/hi/guides/browser-3d-open-world-tech.html">browser open-world tech</a> और <a href="/hi/guides/landscape-generation-browser.html">landscape generation</a> पर हमारी guides देखें।</p>
<h2 id="पूरे-stack-पर-और-पढ़ने-के-लिए" tabindex="-1">पूरे stack पर और पढ़ने के लिए <a class="header-anchor" href="#पूरे-stack-पर-और-पढ़ने-के-लिए" aria-label="Permalink to &quot;पूरे stack पर और पढ़ने के लिए&quot;"></a></h2>
<p>अगर आप एक किताब पढ़ना चाहते हैं, तो <a href="https://www.realtimerendering.com/" target="_blank" rel="noreferrer">Real-Time Rendering, 4th edition</a> standard reference है जो ऊपर बताए ज़्यादातर विषयों को कवर करती है। चलते-फिरते research के लिए, SIGGRAPH की &quot;Advances in Real-Time Rendering in Games&quot; course archive (<a href="https://advances.realtimerendering.com/" target="_blank" rel="noreferrer">advances.realtimerendering.com</a>) में 2006 से लेकर अब तक के AAA-engine deep dives की मुफ़्त PDFs हैं। किसी खास game अपने frame को कैसे render करता है इसके production tear-downs के लिए, <a href="http://www.adriancourreges.com/blog/" target="_blank" rel="noreferrer">Adrian Courrèges के GPU profiling articles</a> ज़रूर पढ़ें।</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ब्राउज़र में open world बनाना, भाग 18: एक scatter brush जो AI-placed महसूस होता है]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-05-02-open-world-browser-part-18-ai-scattering</link>
            <guid>https://app.cinevva.com/hi/blog/2026-05-02-open-world-browser-part-18-ai-scattering</guid>
            <pubDate>Sat, 02 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Spike 37 ने एक heuristic scatter brush बनाया जो trees को cliffs से दूर और pebbles को waterline पर रखता है, बिना किसी LLM के, फिर उसे instancing, distance LOD और bugs के एक ढेर से होकर 4 ms के paint stroke तक पहुंचाया।]]></description>
            <content:encoded><![CDATA[<h1 id="ब्राउज़र-में-open-world-बनाना-भाग-18-एक-scatter-brush-जो-ai-placed-महसूस-होता-है" tabindex="-1">ब्राउज़र में open world बनाना, भाग 18: एक scatter brush जो AI-placed महसूस होता है <a class="header-anchor" href="#ब्राउज़र-में-open-world-बनाना-भाग-18-एक-scatter-brush-जो-ai-placed-महसूस-होता-है" aria-label="Permalink to &quot;ब्राउज़र में open world बनाना, भाग 18: एक scatter brush जो AI-placed महसूस होता है&quot;"></a></h1>
<p><em>लेखक <a href="/hi/about.html">Oleg Sidorkin</a>, Cinevva के CTO और सह-संस्थापक</em></p>
<p>यहां नए हैं? <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">सीरीज़ गाइड</a> का इस्तेमाल करें। इसमें बताया गया है कि spike क्या होता है और सभी भागों के लिंक दिए गए हैं।</p>
<p><a href="/hi/blog/2026-05-01-open-world-browser-part-17-animations-and-search.html">भाग 17</a> ने player को एक combat-grade animation set दिया और किसी भी CC0 model को world में खींचने का तरीका दिया। यह भाग वापस creator के पक्ष पर आता है। Spike 34 का palette हर click पर एक prop रखता है, जो किसी hero object को सेट करने के लिए ठीक है और एक forest के लिए बेकार है। Spike 37 वह brush है: terrain पर drag करें और trees वहां भर जाते हैं जहां trees होने चाहिए।</p>
<h2 id="बिना-किसी-ai-के-ai-placed" tabindex="-1">बिना किसी AI के &quot;AI-placed&quot; <a class="header-anchor" href="#बिना-किसी-ai-के-ai-placed" aria-label="Permalink to &quot;बिना किसी AI के &quot;AI-placed&quot;&quot;"></a></h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/37-ai-scattering/" title="Spike 37 AI-Assisted Prop Scattering" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/37-ai-scattering/" target="_blank">Spike 37 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=37-ai-scattering">Source देखें</a></p>
<p>यह spike जिस सवाल का जवाब देता है वह यह है कि क्या एक पूरी तरह heuristic brush इतना intelligent महसूस होता है कि LLM को छोड़ा जा सके। &quot;AI-placed&quot; की कसौटी ठोस है: trees cliffs से दूर रहें, rocks ढलान में झुकें, beach pebbles waterline पर रुक जाएं, और यह सब पहले ही stroke में। हम वहां slope और altitude predicates, weighted draws, और per-family spacing से पहुंचे, और एक भी model call नहीं किया।</p>
<p>यह brush एक 257×257 CPU heightmap पर काम करता है जिसके features हाथ से tune किए गए हैं ताकि हर preset को कहीं न कहीं landing जगह मिले: mixed-slope picks के लिए northern mountains, scree के लिए एक eastern cliff strip, beach और meadow के लिए एक southern coastal plain, और south-west में एक lake bowl। Terrain एक <code>(altitude, slope)</code> biome classifier से vertex colors bake करता है, इसलिए एक भी tree paint करने से पहले आप देख सकते हैं कि कोई preset कहां fire करेगा। पांच presets flat data के रूप में आते हैं, हर एक <code>{ category, weight, slopeMin, slopeMax, altMin, altMax, minSpacing, alignToSlope }</code> जैसे picks की एक list है। Cliff और Scree <code>slopeMin: 0.3</code> सेट करते हैं ताकि rocks केवल वास्तविक slopes पर ही उतरें और <code>alignToSlope: true</code> ताकि हर boulder का up vector surface normal का अनुसरण करे।</p>
<p>हर stroke के लिए scatter engine brush disc के अंदर <code>densityPerM2 × area</code> candidate points sample करता है, हर candidate के लिए height और slope पढ़ता है, preset के picks को उन तक filter करता है जिनके predicates pass होते हैं, एक को weighted-draw करता है, फिर एक in-radius spatial hash के खिलाफ spacing check चलाता है। पूरी चीज़ deterministic है: एक seedable Mulberry32 RNG हर draw का मालिक है, इसलिए <code>(seed, brush events)</code> किसी भी session को बिल्कुल वैसा का वैसा reproduce करता है। boot terrain पर flat meadow पर एक Mixed Forest stroke ने 158 में से 139 candidates 5 ms में रखे, जबकि वही preset एक cliff पर केवल 226 में से 106 ही रख पाया और HUD ने बताया कि उनमें से 81 slope की वजह से reject हुए। वह rejection breakdown ही पूरा UX है: आप देख सकते हैं कि <em>क्यों</em> cliff ने कुछ ही trees लिए, बजाय अनुमान लगाने के।</p>
<p>presets को flat data के रूप में रखने का मकसद यह है कि LLM version, जब वह आएगा, एक JSON swap होगा न कि एक rewrite। <code>paint({ preset })</code> को इससे फर्क नहीं पड़ता कि <code>preset.picks</code> किसी हाथ से tune की गई recipe से आए या किसी ऐसे worker से जिसने &quot;deciduous forest with mossy boulders&quot; को weights में फैला दिया। Engine कभी किसी prop id को hardcode भी नहीं करता, इसलिए एक अलग catalog डालने के लिए engine में कोई बदलाव नहीं चाहिए।</p>
<h2 id="_300-draw-calls-से-49-तक" tabindex="-1">300 draw calls से 49 तक <a class="header-anchor" href="#_300-draw-calls-से-49-तक" aria-label="Permalink to &quot;300 draw calls से 49 तक&quot;"></a></h2>
<p>पहले cut ने हर placement को एक multi-mesh group के <code>clone(true)</code> के रूप में render किया, जो कुछ सौ props पर तो ठीक है पर 2,500 के cap पर एक दीवार बन जाता है, जहां draw calls हज़ारों में पहुंच जाते हैं। उसके आने से पहले ही हमने <code>InstancedMesh</code> पर switch कर लिया, हर <code>(propId, partIndex)</code> के लिए एक bucket के साथ। हर bucket doubling से बढ़ता है: एक बड़ा <code>InstancedMesh</code> allocate करो, live matrices copy करो, scene parent swap करो, पुराने attribute को dispose करो। Erase एक swap-remove है, इसलिए एक instance को हटाना bucket size चाहे जो हो O(1) रहता है। Determinism, spacing, और rejection HUD सब बिना बदले चलते रहते हैं क्योंकि यह swap पूरी तरह placement record के नीचे रहता है।</p>
<p>MegaKit pack पर एक diagnostic ने एक असली architecture सवाल सुलझा दिया। एक multi-primitive glTF mesh (trunk और leaves) three.js तक या तो एक mesh के रूप में array material और <code>geometry.groups</code> के साथ पहुंच सकता है, या अलग-अलग sibling meshes के रूप में जिनमें से हर एक के पास एक material हो। इस pack के लिए loader दूसरा रास्ता लेता है: हर part empty groups वाला एक single-material mesh है। scatter के लिए यही बेहतर shape है, क्योंकि per-primitive अलग buckets trunk bucket को leaf bucket से स्वतंत्र रूप से बढ़ने देते हैं अगर उनकी counts अलग हो जाएं। draw-call count दोनों ही तरह से एक जैसी, split के साथ बेहतर memory shape। नापी गई जीत टिकी रही: एक forest stroke जो ~300 draw calls था वह 49 बन गया, और एक पूरे multi-stroke session ने 51 draw calls में 75 FPS पर 3,221 instances तक पहुंचा, एक ऐसा cap जिस तक clone path कभी पहुंच ही नहीं सकता था इससे पहले कि frame budget ढह जाता।</p>
<h2 id="distance-lod-और-उसमें-छिपे-चार-bugs" tabindex="-1">Distance LOD, और उसमें छिपे चार bugs <a class="header-anchor" href="#distance-lod-और-उसमें-छिपे-चार-bugs" aria-label="Permalink to &quot;Distance LOD, और उसमें छिपे चार bugs&quot;"></a></h2>
<p>Instancing ने draw calls काट दिए पर हर instance अब भी अपनी पूरी triangle count draw करता था, यहां तक कि 90 m दूर वाले trees भी जो leaf detail के दो pixels योगदान कर रहे थे। तो हमने meshoptimizer के साथ हर prop part के लिए तीन LOD levels bake किए (full, 50%, 15%), bucket key को <code>(propId, partIndex, lod)</code> तक बढ़ाया, और एक <code>move()</code> जोड़ा जो किसी placement को sibling buckets के बीच बिना allocation शिफ्ट करता है। Distance bands 0 से 30 m, 30 से 90 m, और उससे आगे हैं, हर boundary के आसपास ±4 m hysteresis के साथ ताकि किसी band edge के पास मंडराता camera किसी placement को बार-बार आगे-पीछे न झटके और हर frame उसकी matrix दोबारा upload न करे। Re-evaluation 4 Hz पर capped है और तभी होती है जब camera वास्तव में हिला हो, इसलिए एक स्थिर camera per frame केवल एक squared-distance compare का खर्च लेता है।</p>
<p>वह LOD path ही वह जगह है जहां शिक्षाप्रद bugs रहते थे। पहला bug ऐसे दिखा कि जैसे-जैसे camera orbit करता placements गायब या duplicate होने लगते, और scene भरने के साथ और बदतर होते। वजह एक shared scratch matrix थी: <code>move()</code> किसी placement का transform module-scoped <code>_tmpMat</code> में पढ़ता था, पर source bucket का swap-remove अपनी internal shuffle के लिए उसी <code>_tmpMat</code> का इस्तेमाल करता था, और destination के लिखने से पहले ही carry की गई matrix को मिटा देता था। यह bug केवल उस case को छोड़ता था जहां move किया गया slot पहले से ही अपने bucket में आखिरी हो, लगभग <code>1/count</code> की संभावना, जो ठीक वही &quot;दुर्लभ flicker जो scene बढ़ने के साथ बदतर होती है&quot; है जो playtest ने देखा। Fix <code>move()</code> के लिए अकेले reserved एक dedicated <code>_carryMat</code> था। 1,274 cumulative moves पर stress-test करने पर cluster pixel-identical रहा।</p>
<p>दूसरा bug ज़्यादा सूक्ष्म था: हर LOD transition smooth महसूस होता था <em>सिवाय</em> पहले वाले के। LOD1 में जाते trees साफ़-साफ़ shading बदलते दिखते थे भले ही उनका silhouette मुश्किल से बदलता था, जबकि ladder में बाद में बड़े triangle drops ठीक लगते थे। <code>LockBorder</code> वाला simplifier कभी vertices को न हिलाता है न नए बनाता है, इसलिए बचे हुए vertices अपने normals बिल्कुल वैसे ही रखते हैं, पर हम फिर भी हर simplification के बाद <code>computeVertexNormals()</code> call कर रहे थे। LOD0 artist के बनाए मूल normals को बिना छुए लौटाता है; LOD1 और उससे ऊपर को three.js का generic face-average recompute मिलता था। 0-से-1 boundary ladder में अकेली जगह थी जहां normal regime बदलता था, इसलिए pop वहीं रहता था। उस एक defensive line को हटाने से shading ठीक हुई और, एक bonus के रूप में, per-prop bake time लगभग आधा कट गया क्योंकि हमने हर part के चार LODs पर normals दोबारा compute करना बंद कर दिया।</p>
<p>simplifier ने क्या produce किया उसका audit करने से एक तीसरी जीत सामने आई। हर LOD एक नए index के साथ <code>original.clone()</code> था, और <code>BufferGeometry.clone()</code> हर attribute को deep-copy करता है, इसलिए पांच LODs position, normal, UV, और color buffers की पांच स्वतंत्र copies रखते थे जिनकी values सब में bit-identical थीं। हमने attribute references share करने के लिए refactor किया और per LOD केवल एक private index buffer अपने पास रखा, एक typical tree part को 20 अलग attribute identities से घटाकर 9 कर दिया और हर vertex buffer को GPU पर एक बार upload किया। aliased storage के साथ दो contracts आते हैं: किसी एक LOD के ज़रिए attribute data को mutate मत करो, और किसी एक LOD geometry को <code>dispose()</code> मत करो, क्योंकि दोनों ही उस buffer को share करने वाले हर sibling पर असर डालेंगे।</p>
<p>चौथे bug का painting से कोई लेना-देना नहीं था। बस cursor को terrain के ऊपर हिलाने से ही frame rate गिर जाता था, बिना कोई button दबाए। <code>pointermove</code> handler terrain mesh के खिलाफ raycast करता था, एक 131,072-triangle plane जिसमें कोई spatial structure नहीं थी, इसलिए three.js per event पूरे index buffer पर चलता था, और वह भी प्रति सेकंड 1,000 events तक। उस lookup के लिए हमें mesh की ज़रूरत थी ही नहीं, क्योंकि terrain एक parametric heightmap है। <code>sampleHeight</code> के खिलाफ एक adaptive ray-march (surface से ऊपर बड़े strides, उसके पास एक 0.4 m floor, फिर sign flip पर 12 bisections) per ray लगभग 8 से 30 samples का खर्च लेता है बजाय 131,072 triangle tests के, लगभग तीन orders of magnitude सस्ता, और hover फिर से frame cap पर टिका रहता है।</p>
<h2 id="cost-बस-जगह-बदलता-है-पक्का-करो-कि-वह-click-से-हट-जाए" tabindex="-1">Cost बस जगह बदलता है; पक्का करो कि वह click से हट जाए <a class="header-anchor" href="#cost-बस-जगह-बदलता-है-पक्का-करो-कि-वह-click-से-हट-जाए" aria-label="Permalink to &quot;Cost बस जगह बदलता है; पक्का करो कि वह click से हट जाए&quot;"></a></h2>
<p>spike को three r184 (production target) पर <code>WebGPURenderer</code> पर switch करने के बाद, एक DevTools profile ने दिखाया कि सबसे पहला paint 265 ms के लिए block हो रहा है, उसका 79% meshoptimizer WASM के अंदर। Bake असली काम था, एक cold preset के लिए लगभग 180 simplify calls, पर वह click handler के अंदर चल रहा था क्योंकि <code>preloadProps</code> केवल scenes fetch और parse करता था, कभी LOD bake trigger नहीं करता था। Fix यह था कि preset selection को background में पूरा bake कराया जाए: <code>preloadProps</code> अब part-resolution path call करता है, in-flight promise को cache करता है ताकि एक तेज़ click उसमें शामिल हो जाए बजाय एक duplicate fork करने के, और per-geometry preprocessing को memoize करता है जिसे simplifier per part चार बार दोबारा कर रहा था। HUD में first paint 209 ms से घटकर 4 ms हो गया। WASM time गायब नहीं हुआ, वह बस user के critical path से निकल गया और तब चलता है जब वे terrain को देखते हुए तय कर रहे होते हैं कि कहां paint करना है।</p>
<p>यही इस spike का बार-बार आने वाला सबक है। इनमें से लगभग किसी fix ने यह नहीं बदला कि brush <em>क्या करता है</em>। उन्होंने यह बदला कि cost <em>कब</em> उतरता है: click से हटकर, hover से हटकर, उस boundary से हटकर जिसके पास camera मंडरा रहा है। एक scatter tool जो instant महसूस होता है वह कम काम नहीं कर रहा होता, वह काम वहां कर रहा होता है जहां user उसका इंतज़ार नहीं कर रहा होता।</p>
<h2 id="इस-अध्याय-में-संदर्भित-technology" tabindex="-1">इस अध्याय में संदर्भित technology <a class="header-anchor" href="#इस-अध्याय-में-संदर्भित-technology" aria-label="Permalink to &quot;इस अध्याय में संदर्भित technology&quot;"></a></h2>
<p><strong>Heuristic suitability scatter.</strong> एक brush एक disc में candidate points sample करता है, हर point के लिए एक CPU heightmap से <code>(height, slope)</code> पढ़ता है, slope और altitude predicates से एक preset के picks को filter करता है, एक को weighted-draw करता है, और उसे reject कर देता है अगर वह एक spatial hash में tracked per-family minimum spacing का उल्लंघन करता है। Slope-aligned picks अपने up vector को surface normal की ओर rotate करते हैं। यह ऐसा placement produce करता है जो इरादतन पढ़ा जाता है (trees cliffs से दूर, rocks ढलानों में झुके, pebbles waterline पर रुके) बिना किसी learned weights के, और preset को flat data के रूप में रखता है ताकि एक LLM-generated pick list एक drop-in swap हो।</p>
<p><strong>Async loads के तहत deterministic placement.</strong> एक seedable Mulberry32 RNG हर draw का मालिक है, इसलिए <code>(seed, brush events)</code> एक session को बिल्कुल वैसा reproduce करता है। RNG draws किसी भी <code>await</code> से पहले होते हैं, और spacing reservations glTF clone के resolve होने से पहले spatial index में डाल दी जाती हैं, इसलिए concurrent candidates एक-दूसरे का सम्मान करते हैं और async asset loading sequence को गड़बड़ नहीं कर सकती।</p>
<p><strong>O(1) edits के साथ bucketed InstancedMesh.</strong> हर <code>(propId, partIndex, lod)</code> के लिए एक <code>InstancedMesh</code>, मांग पर live matrices को एक बड़े buffer में copy करके capacity दोगुनी की जाती है। Erase और FIFO-evict swap-remove हैं जिसमें एक back-reference array move किए गए instance का index patch करता है, इसलिए एक removal bucket size चाहे जो हो O(1) है। एक diagnostic ने पुष्टि की कि glTF parts single-material meshes के रूप में आते हैं, जिससे one-bucket-per-primitive active path बनता है और हर primitive को एक स्वतंत्र रूप से बढ़ने वाला bucket मिलता है।</p>
<p><strong>Hysteresis और shared attribute buffers के साथ distance LOD.</strong> हर part के लिए तीन meshopt-simplified levels, ±4 m hysteresis वाले distance bands से चुने जाते हैं ताकि किसी boundary के पास का camera न झटके, एक capped rate पर re-evaluate किए जाते हैं और असली camera motion पर gated। चूंकि <code>LockBorder</code> simplification कभी vertices नहीं हिलाता, सभी LODs position/normal/UV/color buffers का एक set share करते हैं और केवल अपने private index buffer में फर्क रखते हैं, distinct GPU vertex buffers को लगभग आधा काट देते हैं। एक defensive <code>computeVertexNormals</code> को छोड़ने से artist normals सभी LODs में एक जैसे रहते हैं और ladder में अकेली shading discontinuity हट जाती है। देखें <a href="/hi/guides/landscape-generation-browser.html#gpu-driven-lod-with-webgpu">LOD और meshoptimizer</a>।</p>
<p><strong>High-frequency lookups के लिए analytic heightmap raycast.</strong> एक 131k-triangle plane mesh के खिलाफ <code>pointermove</code>-rate cursor lookup per event पूरे index buffer पर चलता है। इसे analytic height function के खिलाफ एक adaptive ray-march से बदलना (surface से दूर बड़े strides, उसके पास एक छोटा floor, <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.869ex;" xmlns="http://www.w3.org/2000/svg" width="16.358ex" height="2.566ex" role="img" focusable="false" viewBox="0 -750 7230.4 1134.3" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(389,0)"><g data-mml-node="mtext"><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(392,0)" style="stroke-width: 3;"/><path data-c="79" d="M69 -66Q91 -66 104 -80T118 -116Q118 -134 109 -145T91 -160Q84 -163 97 -166Q104 -168 111 -168Q131 -168 148 -159T175 -138T197 -106T213 -75T225 -43L242 0L170 183Q150 233 125 297Q101 358 96 368T80 381Q79 382 78 382Q66 385 34 385H19V431H26L46 430Q65 430 88 429T122 428Q129 428 142 428T171 429T200 430T224 430L233 431H241V385H232Q183 385 185 366L286 112Q286 113 332 227L376 341V350Q376 365 366 373T348 383T334 385H331V431H337H344Q351 431 361 431T382 430T405 429T422 429Q477 429 503 431H508V385H497Q441 380 422 345Q420 343 378 235T289 9T227 -131Q180 -204 113 -204Q69 -204 44 -177T19 -116Q19 -89 35 -78T69 -66Z" transform="translate(892,0)" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(1453,-239.4) scale(0.707)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(2460.7,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(3460.9,0)"><g data-mml-node="mtext"><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(389,0)" style="stroke-width: 3;"/><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(833,0)" style="stroke-width: 3;"/><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(1225,0)" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(1617,0)" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(2117,0)" style="stroke-width: 3;"/><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(2395,0)" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(2984,-150) scale(0.707)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(6841.4,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo stretchy="false">(</mo><msub><mtext>ray</mtext><mi>y</mi></msub><mo>−</mo><msub><mtext>terrain</mtext><mi>y</mi></msub><mo stretchy="false">)</mo></math></mjx-assistive-mml></mjx-container> के sign flip पर bisection) हज़ारों triangle tests के बजाय दर्जनों samples का खर्च लेता है, लगभग तीन orders of magnitude सस्ता, और एक pre-allocated output vector hot path को allocation-free रखता है।</p>
<p><strong>Interaction के critical path से काम हटाओ.</strong> महंगा one-time काम (meshopt LOD bakes, WGSL pipeline compiles) idle gaps के दौरान चलना चाहिए, click handler के अंदर नहीं। preset selection पर active preset का पूरा bake preload करना, in-flight promise को cache करना ताकि एक तेज़ click fork करने के बजाय उसमें शामिल हो जाए, और per-geometry preprocessing को memoize करना, इन सबने कुल काम कम किए बिना first-paint latency 209 ms से 4 ms तक गिरा दी।</p>
<hr>
<p>29 में से भाग 18।
पिछला: <a href="/hi/blog/2026-05-01-open-world-browser-part-17-animations-and-search.html">भाग 17 - ऐसी animations जिन्हें retargeting की ज़रूरत नहीं पड़ी, और एक live asset search</a>
अगला: <a href="/hi/blog/2026-05-04-open-world-browser-part-19-imposters.html">भाग 19 - वह imposter जिसे एक forest में टिकना है</a>
सीरीज़ गाइड: <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">/hi/blog/2026-02-25-open-world-browser-series-guide</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ब्राउज़र में open world बनाना, भाग 17: ऐसी animations जिन्हें retargeting की ज़रूरत नहीं पड़ी, और एक live asset search]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-05-01-open-world-browser-part-17-animations-and-search</link>
            <guid>https://app.cinevva.com/hi/blog/2026-05-01-open-world-browser-part-17-animations-and-search</guid>
            <pubDate>Fri, 01 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Spike 35 ने 262 combat और locomotion clips को player rig पर retarget किया, और उन्हें ईमानदार रखने के लिए एक offline parity test बनाया। Spike 36 ने बिना किसी build step के एक live Polyhaven model search जोड़ी।]]></description>
            <content:encoded><![CDATA[<h1 id="ब्राउज़र-में-open-world-बनाना-भाग-17-ऐसी-animations-जिन्हें-retargeting-की-ज़रूरत-नहीं-पड़ी-और-एक-live-asset-search" tabindex="-1">ब्राउज़र में open world बनाना, भाग 17: ऐसी animations जिन्हें retargeting की ज़रूरत नहीं पड़ी, और एक live asset search <a class="header-anchor" href="#ब्राउज़र-में-open-world-बनाना-भाग-17-ऐसी-animations-जिन्हें-retargeting-की-ज़रूरत-नहीं-पड़ी-और-एक-live-asset-search" aria-label="Permalink to &quot;ब्राउज़र में open world बनाना, भाग 17: ऐसी animations जिन्हें retargeting की ज़रूरत नहीं पड़ी, और एक live asset search&quot;"></a></h1>
<p><em>लेखक <a href="/hi/about.html">Oleg Sidorkin</a>, Cinevva के CTO और सह-संस्थापक</em></p>
<p>यहां नए हैं? <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">सीरीज़ गाइड</a> का इस्तेमाल करें। इसमें बताया गया है कि spike क्या होता है और सभी भागों के लिंक दिए गए हैं।</p>
<p><a href="/hi/blog/2026-04-28-open-world-browser-part-16-structure-and-authoring.html">भाग 16</a> ने हमें एक ऐसा world दिया जिसमें आप objects रख सकते हैं। यह भाग player को उसमें करने के लिए कुछ बेहतर देता है: एक combat-grade animation set, और एक तरीका जिससे आप search टाइप करके हज़ारों CC0 models में से कोई भी world में खींच सकते हैं।</p>
<h2 id="_262-clips-एक-skeleton-तीन-retargeting-fixes" tabindex="-1">262 clips, एक skeleton, तीन retargeting fixes <a class="header-anchor" href="#_262-clips-एक-skeleton-तीन-retargeting-fixes" aria-label="Permalink to &quot;262 clips, एक skeleton, तीन retargeting fixes&quot;"></a></h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/35-combat-animations/" title="Spike 35 Combat Animations" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/35-combat-animations/" target="_blank">Spike 35 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=35-combat-animations">View source</a></p>
<p>Player rig एक CC4-style <code>3MIKE</code> skeleton है जिसमें 213 bones हैं, जिनमें एक 80 से ज़्यादा bones वाला facial rig और पूरे finger joints शामिल हैं। Animation sources इससे मेल नहीं खाते। पहली कोशिश में हाथ से चुने हुए Mixamo combat clips को retarget किया गया था, लेकिन source pool पतला था और locomotion Mixamo और कुछ Kimodo BVH idles के बीच अजीब तरह से बंटा हुआ था। असली जीत तब मिली जब हमने source library को Quaternius के दो Universal Animation Library packs पर शिफ्ट किया, कुल 262 clips एक ही consistent UE5-style 65-bone mannequin पर: sword combos, bow archery, climbs, wallruns, dodges, hit reactions, emotes, और एक कहीं ज़्यादा साफ-सुथरा locomotion set।</p>
<p>यह एक 65-bone source से 213-bone target तक का मामला है, जिसमें न कोई shared bone names हैं, न T-pose orientations, न limb proportions। हर clip तीन steps में remap होता है: एक bone-name map, एक bind-pose alignment ताकि दोनों rigs एक reference orientation साझा करें, और position-track scaling ताकि छोटा source rig character को फर्श में घुटनों तक न धंसा दे। इसे सही करने का मतलब था bugs की एक श्रृंखला का पीछा करना, जिनमें से हर एक ने कुछ खास सिखाया।</p>
<p>Character ज़रूरत से ज़्यादा मुड़ा हुआ निकला, हर shoulder और elbow करीब 30° ज़्यादा घूमा हुआ। वजह थी एक pose mismatch: UAL source एक सच्चा T-pose देता है, CC4 का bind एक A-pose है, और retargeter ने मान लिया कि दोनों rigs मेल खाते reference poses में बैठे हैं, इसलिए A-to-T का फर्क हर per-frame delta में जुड़ गया। Fix CC4 के arm chain को एक सच्चे T-pose में मजबूर करता है ताकि bind को capture किया जा सके, फिर retarget करता है, ताकि deltas छोटे रहें।</p>
<p>फिर body translate होना बंद हो गई। Knockbacks ऊपरी body को पीछे झटक देते थे लेकिन पैर जमे रहते थे। UAL displacement को <code>root</code> bone पर रखता है, pelvis पर नहीं, इसलिए pelvis position पढ़ने से लगभग शून्य motion मिलती थी। Fix <code>root.position</code> और <code>pelvis.position</code> को जोड़ता है, horizontal हिस्से को scale करता है, और एक single hip-position track लिखता है। यह करते वक्त हमें पता चला कि vertical offsets करीब 12% गलत थे, क्योंकि हमने Y axis के लिए global limb-proportion ratio का इस्तेमाल किया था जबकि pelvis height को hip-to-floor ratio चाहिए। दो ratios, दो axes: Y के लिए <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="40.854ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 18057.6 1000" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mtext"><path data-c="76" d="M338 431Q344 429 422 429Q479 429 503 431H508V385H497Q439 381 423 345Q421 341 356 172T288 -2Q283 -11 263 -11Q244 -11 239 -2Q99 359 98 364Q93 378 82 381T43 385H19V431H25L33 430Q41 430 53 430T79 430T104 429T122 428Q217 428 232 431H240V385H226Q187 384 184 370Q184 366 235 234L286 102L377 341V349Q377 363 367 372T349 383T335 385H331V431H338Z" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(528,0)" style="stroke-width: 3;"/><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(972,0)" style="stroke-width: 3;"/><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" transform="translate(1364,0)" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(1753,0)" style="stroke-width: 3;"/><path data-c="63" d="M370 305T349 305T313 320T297 358Q297 381 312 396Q317 401 317 402T307 404Q281 408 258 408Q209 408 178 376Q131 329 131 219Q131 137 162 90Q203 29 272 29Q313 29 338 55T374 117Q376 125 379 127T395 129H409Q415 123 415 120Q415 116 411 104T395 71T366 33T318 2T249 -11Q163 -11 99 53T34 214Q34 318 99 383T250 448T370 421T404 357Q404 334 387 320Z" transform="translate(2031,0)" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(2475,0)" style="stroke-width: 3;"/><path data-c="6C" d="M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z" transform="translate(2975,0)" style="stroke-width: 3;"/><path data-c="52" d="M130 622Q123 629 119 631T103 634T60 637H27V683H202H236H300Q376 683 417 677T500 648Q595 600 609 517Q610 512 610 501Q610 468 594 439T556 392T511 361T472 343L456 338Q459 335 467 332Q497 316 516 298T545 254T559 211T568 155T578 94Q588 46 602 31T640 16H645Q660 16 674 32T692 87Q692 98 696 101T712 105T728 103T732 90Q732 59 716 27T672 -16Q656 -22 630 -22Q481 -16 458 90Q456 101 456 163T449 246Q430 304 373 320L363 322L297 323H231V192L232 61Q238 51 249 49T301 46H334V0H323Q302 3 181 3Q59 3 38 0H27V46H60Q102 47 111 49T130 61V622ZM491 499V509Q491 527 490 539T481 570T462 601T424 623T362 636Q360 636 340 636T304 637H283Q238 637 234 628Q231 624 231 492V360H289Q390 360 434 378T489 456Q491 467 491 499Z" transform="translate(3253,0)" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(3989,0)" style="stroke-width: 3;"/><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" transform="translate(4489,0)" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(4878,0)" style="stroke-width: 3;"/><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z" transform="translate(5156,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(5933.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(6989.6,0) translate(0 -0.5)"><path data-c="7C" d="M139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(7267.6,0)"><g data-mml-node="mtext"><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(389,0)" style="stroke-width: 3;"/><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(889,0)" style="stroke-width: 3;"/><path data-c="67" d="M329 409Q373 453 429 453Q459 453 472 434T485 396Q485 382 476 371T449 360Q416 360 412 390Q410 404 415 411Q415 412 416 414V415Q388 412 363 393Q355 388 355 386Q355 385 359 381T368 369T379 351T388 325T392 292Q392 230 343 187T222 143Q172 143 123 171Q112 153 112 133Q112 98 138 81Q147 75 155 75T227 73Q311 72 335 67Q396 58 431 26Q470 -13 470 -72Q470 -139 392 -175Q332 -206 250 -206Q167 -206 107 -175Q29 -140 29 -75Q29 -39 50 -15T92 18L103 24Q67 55 67 108Q67 155 96 193Q52 237 52 292Q52 355 102 398T223 442Q274 442 318 416L329 409ZM299 343Q294 371 273 387T221 404Q192 404 171 388T145 343Q142 326 142 292Q142 248 149 227T179 192Q196 182 222 182Q244 182 260 189T283 207T294 227T299 242Q302 258 302 292T299 343ZM403 -75Q403 -50 389 -34T348 -11T299 -2T245 0H218Q151 0 138 -6Q118 -15 107 -34T95 -74Q95 -84 101 -97T122 -127T170 -155T250 -167Q319 -167 361 -139T403 -75Z" transform="translate(1281,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(1781,0)" style="stroke-width: 3;"/><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" transform="translate(2225,0)" style="stroke-width: 3;"/><path data-c="48" d="M128 622Q121 629 117 631T101 634T58 637H25V683H36Q57 680 180 680Q315 680 324 683H335V637H302Q262 636 251 634T233 622L232 500V378H517V622Q510 629 506 631T490 634T447 637H414V683H425Q446 680 569 680Q704 680 713 683H724V637H691Q651 636 640 634T622 622V61Q628 51 639 49T691 46H724V0H713Q692 3 569 3Q434 3 425 0H414V46H447Q489 47 498 49T517 61V332H232V197L233 61Q239 51 250 49T302 46H335V0H324Q303 3 180 3Q45 3 36 0H25V46H58Q100 47 109 49T128 61V622Z" transform="translate(2614,0)" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(3364,0)" style="stroke-width: 3;"/><path data-c="70" d="M36 -148H50Q89 -148 97 -134V-126Q97 -119 97 -107T97 -77T98 -38T98 6T98 55T98 106Q98 140 98 177T98 243T98 296T97 335T97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 61 434T98 436Q115 437 135 438T165 441T176 442H179V416L180 390L188 397Q247 441 326 441Q407 441 464 377T522 216Q522 115 457 52T310 -11Q242 -11 190 33L182 40V-45V-101Q182 -128 184 -134T195 -145Q216 -148 244 -148H260V-194H252L228 -193Q205 -192 178 -192T140 -191Q37 -191 28 -194H20V-148H36ZM424 218Q424 292 390 347T305 402Q234 402 182 337V98Q222 26 294 26Q345 26 384 80T424 218Z" transform="translate(3642,0)" style="stroke-width: 3;"/><path data-c="59" d="M518 0Q497 3 374 3Q253 3 232 0H221V46H254Q313 47 321 58Q324 62 324 167V273L221 446Q117 620 114 623Q106 631 91 634T31 637H11V683H20Q29 680 148 680Q273 680 294 683H305V637H287Q239 636 236 621Q236 619 321 475L407 332L483 460Q502 492 527 534Q563 594 563 604Q563 632 517 637H508V683H517H525Q533 683 545 683T571 682T600 681T626 681Q695 681 731 683H738V637H723Q640 633 613 588Q612 587 517 427L425 273V169V95Q425 66 428 59T444 49Q459 46 506 46H528V0H518Z" transform="translate(4198,0)" style="stroke-width: 3;"/></g></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(12215.6,0)"><g data-mml-node="mo"><path data-c="2F" d="M423 750Q432 750 438 744T444 730Q444 725 271 248T92 -240Q85 -250 75 -250Q68 -250 62 -245T56 -231Q56 -221 230 257T407 740Q411 750 423 750Z" style="stroke-width: 3;"/></g></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(12715.6,0)"><g data-mml-node="mtext"><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" style="stroke-width: 3;"/><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z" transform="translate(394,0)" style="stroke-width: 3;"/><path data-c="75" d="M383 58Q327 -10 256 -10H249Q124 -10 105 89Q104 96 103 226Q102 335 102 348T96 369Q86 385 36 385H25V408Q25 431 27 431L38 432Q48 433 67 434T105 436Q122 437 142 438T172 441T184 442H187V261Q188 77 190 64Q193 49 204 40Q224 26 264 26Q290 26 311 35T343 58T363 90T375 120T379 144Q379 145 379 161T380 201T380 248V315Q380 361 370 372T320 385H302V431Q304 431 378 436T457 442H464V264Q464 84 465 81Q468 61 479 55T524 46H542V0Q540 0 467 -5T390 -11H383V58Z" transform="translate(894,0)" style="stroke-width: 3;"/><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(1450,0)" style="stroke-width: 3;"/><path data-c="63" d="M370 305T349 305T313 320T297 358Q297 381 312 396Q317 401 317 402T307 404Q281 408 258 408Q209 408 178 376Q131 329 131 219Q131 137 162 90Q203 29 272 29Q313 29 338 55T374 117Q376 125 379 127T395 129H409Q415 123 415 120Q415 116 411 104T395 71T366 33T318 2T249 -11Q163 -11 99 53T34 214Q34 318 99 383T250 448T370 421T404 357Q404 334 387 320Z" transform="translate(1842,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(2286,0)" style="stroke-width: 3;"/><path data-c="48" d="M128 622Q121 629 117 631T101 634T58 637H25V683H36Q57 680 180 680Q315 680 324 683H335V637H302Q262 636 251 634T233 622L232 500V378H517V622Q510 629 506 631T490 634T447 637H414V683H425Q446 680 569 680Q704 680 713 683H724V637H691Q651 636 640 634T622 622V61Q628 51 639 49T691 46H724V0H713Q692 3 569 3Q434 3 425 0H414V46H447Q489 47 498 49T517 61V332H232V197L233 61Q239 51 250 49T302 46H335V0H324Q303 3 180 3Q45 3 36 0H25V46H58Q100 47 109 49T128 61V622Z" transform="translate(2730,0)" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(3480,0)" style="stroke-width: 3;"/><path data-c="70" d="M36 -148H50Q89 -148 97 -134V-126Q97 -119 97 -107T97 -77T98 -38T98 6T98 55T98 106Q98 140 98 177T98 243T98 296T97 335T97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 61 434T98 436Q115 437 135 438T165 441T176 442H179V416L180 390L188 397Q247 441 326 441Q407 441 464 377T522 216Q522 115 457 52T310 -11Q242 -11 190 33L182 40V-45V-101Q182 -128 184 -134T195 -145Q216 -148 244 -148H260V-194H252L228 -193Q205 -192 178 -192T140 -191Q37 -191 28 -194H20V-148H36ZM424 218Q424 292 390 347T305 402Q234 402 182 337V98Q222 26 294 26Q345 26 384 80T424 218Z" transform="translate(3758,0)" style="stroke-width: 3;"/><path data-c="59" d="M518 0Q497 3 374 3Q253 3 232 0H221V46H254Q313 47 321 58Q324 62 324 167V273L221 446Q117 620 114 623Q106 631 91 634T31 637H11V683H20Q29 680 148 680Q273 680 294 683H305V637H287Q239 636 236 621Q236 619 321 475L407 332L483 460Q502 492 527 534Q563 594 563 604Q563 632 517 637H508V683H517H525Q533 683 545 683T571 682T600 681T626 681Q695 681 731 683H738V637H723Q640 633 613 588Q612 587 517 427L425 273V169V95Q425 66 428 59T444 49Q459 46 506 46H528V0H518Z" transform="translate(4314,0)" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(17779.6,0) translate(0 -0.5)"><path data-c="7C" d="M139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mtext>verticalRatio</mtext><mo>=</mo><mo data-mjx-texclass="ORD" stretchy="false">|</mo><mrow data-mjx-texclass="ORD"><mtext>targetHipY</mtext></mrow><mrow data-mjx-texclass="ORD"><mo>/</mo></mrow><mrow data-mjx-texclass="ORD"><mtext>sourceHipY</mtext></mrow><mo data-mjx-texclass="ORD" stretchy="false">|</mo></math></mjx-assistive-mml></mjx-container>, horizontal के लिए proportion ratio। Overshoot खत्म। और <code>RL_BoneRoot.position</code> NaN warnings की एक झड़ी इस बात से जुड़ी थी कि UAL के <code>root</code> (जो <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.186ex;" xmlns="http://www.w3.org/2000/svg" width="5.875ex" height="1.731ex" role="img" focusable="false" viewBox="0 -683 2596.6 765" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D44C" d="M66 637Q54 637 49 637T39 638T32 641T30 647T33 664T42 682Q44 683 56 683Q104 680 165 680Q288 680 306 683H316Q322 677 322 674T320 656Q316 643 310 637H298Q242 637 242 624Q242 619 292 477T343 333L346 336Q350 340 358 349T379 373T411 410T454 461Q546 568 561 587T577 618Q577 634 545 637Q528 637 528 647Q528 649 530 661Q533 676 535 679T549 683Q551 683 578 682T657 680Q684 680 713 681T746 682Q763 682 763 673Q763 669 760 657T755 643Q753 637 734 637Q662 632 617 587Q608 578 477 424L348 273L322 169Q295 62 295 57Q295 46 363 46Q379 46 384 45T390 35Q390 33 388 23Q384 6 382 4T366 1Q361 1 324 1T232 2Q170 2 138 2T102 1Q84 1 84 9Q84 14 87 24Q88 27 89 30T90 35T91 39T93 42T96 44T101 45T107 45T116 46T129 46Q168 47 180 50T198 63Q201 68 227 171L252 274L129 623Q128 624 127 625T125 627T122 629T118 631T113 633T105 634T96 635T83 636T66 637Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(1040.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(2096.6,0)"><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>Y</mi><mo>=</mo><mn>0</mn></math></mjx-assistive-mml></mjx-container> पर है) को एक ऐसे target bone पर map किया जा रहा था जिसका position track उसके bind Y से भाग देकर normalize होता है। शून्य से भाग, NaN, चुपचाप गिरा हुआ track। Fix था root mapping को पूरी तरह हटा देना, क्योंकि उसका translation पहले से ही hip track में मौजूद है।</p>
<p>सबसे छोटा fix देखने में सबसे संतोषजनक था। Character तलवार को limp bind-pose उंगलियों से पकड़ता था क्योंकि bone map में कोई finger entries नहीं थीं, और retargeter सिर्फ mapped bones के लिए tracks लिखता है। 30 finger bones जोड़ने (पांच उंगलियां, तीन segments, दो हाथ, UAL के चौथे tip helper को छोड़कर जो deform नहीं करता) से हाथ grip पर बंद हुआ और release पर खुला।</p>
<h2 id="_262-clips-को-262-clips-देखे-बिना-साबित-करना" tabindex="-1">262 clips को 262 clips देखे बिना साबित करना <a class="header-anchor" href="#_262-clips-को-262-clips-देखे-बिना-साबित-करना" aria-label="Permalink to &quot;262 clips को 262 clips देखे बिना साबित करना&quot;"></a></h2>
<p>आप 262-clip library को आंखों से verify नहीं कर सकते, इसलिए हमने एक offline trajectory parity test बनाया: एक headless Node script जो हर pack को load करता है, source skeleton को 60Hz पर sample करता है, retargeting pipeline चलाता है, और scaling के बाद per-bone world positions और rotations की तुलना source से करता है। Pelvis Y drift अधिकतम 0.003 m आई। हाथों ने एक स्थिर 2.5° offset दिखाया जो पहले &quot;उंगलियां track नहीं हो रहीं&quot; जैसा लगा, लेकिन एक स्थिर offset flat UAL hand और CC4 के थोड़े cupped bind के बीच का bind delta है, और यह पूरे clip में invariant रहता है। असली animation errors उस drift के रूप में दिखती हैं जो frame दर frame बदलती है। एक बार यह साफ हो गया, तो test एक one-shot regression check बन गया: अगर किसी clip का drift उस स्थिर baseline को पकड़े रखना बंद कर दे, तो किसी हालिया बदलाव ने retargeting तोड़ दी है।</p>
<p>एक side-by-side reference mannequin ने debugging के visual हिस्से को निर्णायक बना दिया। Backslash दबाने पर जो भी source rig मौजूदा clip का मालिक है वह player के बगल में दिखता है, इसलिए &quot;मुड़ा हुआ shoulder&quot; वाला सवाल बन जाता है &quot;क्या मुड़ाव source में है, या retargeting ने जोड़ा?&quot; Numerical tests regressions पकड़ते हैं, visual reference उन bind-pose गलतियों को पकड़ता है जो numbers सामने नहीं लातीं, और दोनों ने मिलकर अनुमान लगाने का खेल खत्म कर दिया।</p>
<p>Pipeline ठोस होने के बाद, WASD/jump/swim baseline को Mixamo से UAL पर बदलना एक पतला alias map था: FSM अब भी <code>idle</code> और <code>walk</code> जैसे generic state names बोलता है, जो playback के वक्त UAL clip names में resolve होते हैं। Swimming को per-clip rig offsets चाहिए थे क्योंकि freestyle और tread-water poses pelvis को अलग-अलग anatomical heights पर anchor करते हैं, इसलिए हम active swimming के लिए rig को आधा मीटर डुबाते हैं और treading के लिए और गहरा, उनके बीच एक smooth 5Hz पर blend करते हुए।</p>
<h2 id="एक-शब्द-टाइप-करें-एक-model-पाएं" tabindex="-1">एक शब्द टाइप करें, एक model पाएं <a class="header-anchor" href="#एक-शब्द-टाइप-करें-एक-model-पाएं" aria-label="Permalink to &quot;एक शब्द टाइप करें, एक model पाएं&quot;"></a></h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/36-polyhaven-models/" title="Spike 36 Polyhaven Models" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/36-polyhaven-models/" target="_blank">Spike 36 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=36-polyhaven-models">View source</a></p>
<p>Spike 34 ने एक CC0 pack हाथ से curate करने में एक दिन खा लिया। लंबे समय का जवाब एक search box है। Polyhaven एक permissive JSON API और एक deterministic CDN के पीछे करीब 1,100 CC0 models publish करता है, और यह spike पूरे path (query, thumbnails, load, render) को एक static page से बिना किसी build step के जोड़ता है, करीब 300 lines vanilla JS plus three.js में।</p>
<p>Boot पर यह पूरा catalog एक बार fetch करता है, करीब 600 KB। Search पूरी तरह client-side scoring है (name id को हराता है, id category को, category tag को) एक 120 ms debounce के साथ, top 60 cards render करता है। Thumbnails एक <code>IntersectionObserver</code> के ज़रिए lazy-load होते हैं ताकि typing एक साथ 60 requests न दागे। दिलचस्प हिस्सा loading है। Polyhaven का file endpoint multi-file glTF देता है, GLB नहीं, जिसमें textures resolutions के बीच साझा होते हैं और अलग files में बंटे होते हैं, और यह relative path से absolute CDN URL का एक <code>include</code> map लौटाता है। JSON को खुद download और patch करने के बजाय, हम उस map को <code>LoadingManager.setURLModifier</code> के ज़रिए feed करते हैं, जो loader को जिस भी dependency की ज़रूरत हो (वह <code>.bin</code>, हर texture) उसके लिए fire होता है और उसे CDN के ज़रिए resolve करता है। एक click, एक प्रतीत होने वाली file। API और CDN दोनों permissive CORS set करते हैं, जिसे किसी client code से पहले <code>curl</code> से verify किया गया, इसलिए कोई proxy नहीं। PBR materials <code>RoomEnvironment</code> और ACES tone mapping defaults के साथ बिना किसी per-asset fix-up के सही render होते हैं, और 1k textures एक typical model को 4k पर 20 से 40 MB के बजाय 2 से 5 MB पर रखते हैं।</p>
<p>एक meshoptimizer WASM pass इसे एक non-destructive reducer के साथ पूरा करता है: हर mesh अपनी original geometry का एक clone रख लेता है, और ratio बदलने पर उस clone से एक index buffer फिर बनाता है, बजाय इसके कि cumulatively simplify करे। Multi-material geometry per group simplify होती है और <code>geometry.groups</code> फिर बनाती है ताकि material slots न ढहें। एक armchair full पर 5,626 triangles से half पर 2,812 तक जाती है।</p>
<h2 id="इस-अध्याय-में-संदर्भित-technology" tabindex="-1">इस अध्याय में संदर्भित technology <a class="header-anchor" href="#इस-अध्याय-में-संदर्भित-technology" aria-label="Permalink to &quot;इस अध्याय में संदर्भित technology&quot;"></a></h2>
<p><strong>Bind-pose alignment के साथ skeleton retargeting।</strong> एक skeleton से दूसरे पर animation map करने के लिए, जब bone names, proportions और reference poses अलग हों, तीन corrections चाहिए: एक bone-name map, एक bind-pose alignment ताकि दोनों rigs एक reference orientation साझा करें (target के A-pose arm chain को source के T-pose में मजबूर करते हुए), और position-track scaling। एक pose mismatch हर per-frame delta में A-to-T rotation जोड़ देता है, joint rotation को दोगुना करता है। Unmapped helper bones को हटाना ज़रूरी है, क्योंकि <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.186ex;" xmlns="http://www.w3.org/2000/svg" width="5.875ex" height="1.731ex" role="img" focusable="false" viewBox="0 -683 2596.6 765" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D44C" d="M66 637Q54 637 49 637T39 638T32 641T30 647T33 664T42 682Q44 683 56 683Q104 680 165 680Q288 680 306 683H316Q322 677 322 674T320 656Q316 643 310 637H298Q242 637 242 624Q242 619 292 477T343 333L346 336Q350 340 358 349T379 373T411 410T454 461Q546 568 561 587T577 618Q577 634 545 637Q528 637 528 647Q528 649 530 661Q533 676 535 679T549 683Q551 683 578 682T657 680Q684 680 713 681T746 682Q763 682 763 673Q763 669 760 657T755 643Q753 637 734 637Q662 632 617 587Q608 578 477 424L348 273L322 169Q295 62 295 57Q295 46 363 46Q379 46 384 45T390 35Q390 33 388 23Q384 6 382 4T366 1Q361 1 324 1T232 2Q170 2 138 2T102 1Q84 1 84 9Q84 14 87 24Q88 27 89 30T90 35T91 39T93 42T96 44T101 45T107 45T116 46T129 46Q168 47 180 50T198 63Q201 68 227 171L252 274L129 623Q128 624 127 625T125 627T122 629T118 631T113 633T105 634T96 635T83 636T66 637Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(1040.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(2096.6,0)"><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>Y</mi><mo>=</mo><mn>0</mn></math></mjx-assistive-mml></mjx-container> पर एक root bone position-track normalization में एक चुपचाप होने वाला divide-by-zero trigger करता है।</p>
<p><strong>एक rig के लिए दो scale ratios।</strong> Horizontal displacement global limb-proportion ratio (समग्र skeleton size) इस्तेमाल करता है, लेकिन vertical pelvis offset hip-to-floor ratio <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="25.041ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 11068 1000" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo" transform="translate(0 -0.5)"><path data-c="7C" d="M139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(278,0)"><g data-mml-node="mtext"><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(389,0)" style="stroke-width: 3;"/><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(889,0)" style="stroke-width: 3;"/><path data-c="67" d="M329 409Q373 453 429 453Q459 453 472 434T485 396Q485 382 476 371T449 360Q416 360 412 390Q410 404 415 411Q415 412 416 414V415Q388 412 363 393Q355 388 355 386Q355 385 359 381T368 369T379 351T388 325T392 292Q392 230 343 187T222 143Q172 143 123 171Q112 153 112 133Q112 98 138 81Q147 75 155 75T227 73Q311 72 335 67Q396 58 431 26Q470 -13 470 -72Q470 -139 392 -175Q332 -206 250 -206Q167 -206 107 -175Q29 -140 29 -75Q29 -39 50 -15T92 18L103 24Q67 55 67 108Q67 155 96 193Q52 237 52 292Q52 355 102 398T223 442Q274 442 318 416L329 409ZM299 343Q294 371 273 387T221 404Q192 404 171 388T145 343Q142 326 142 292Q142 248 149 227T179 192Q196 182 222 182Q244 182 260 189T283 207T294 227T299 242Q302 258 302 292T299 343ZM403 -75Q403 -50 389 -34T348 -11T299 -2T245 0H218Q151 0 138 -6Q118 -15 107 -34T95 -74Q95 -84 101 -97T122 -127T170 -155T250 -167Q319 -167 361 -139T403 -75Z" transform="translate(1281,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(1781,0)" style="stroke-width: 3;"/><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" transform="translate(2225,0)" style="stroke-width: 3;"/><path data-c="48" d="M128 622Q121 629 117 631T101 634T58 637H25V683H36Q57 680 180 680Q315 680 324 683H335V637H302Q262 636 251 634T233 622L232 500V378H517V622Q510 629 506 631T490 634T447 637H414V683H425Q446 680 569 680Q704 680 713 683H724V637H691Q651 636 640 634T622 622V61Q628 51 639 49T691 46H724V0H713Q692 3 569 3Q434 3 425 0H414V46H447Q489 47 498 49T517 61V332H232V197L233 61Q239 51 250 49T302 46H335V0H324Q303 3 180 3Q45 3 36 0H25V46H58Q100 47 109 49T128 61V622Z" transform="translate(2614,0)" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(3364,0)" style="stroke-width: 3;"/><path data-c="70" d="M36 -148H50Q89 -148 97 -134V-126Q97 -119 97 -107T97 -77T98 -38T98 6T98 55T98 106Q98 140 98 177T98 243T98 296T97 335T97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 61 434T98 436Q115 437 135 438T165 441T176 442H179V416L180 390L188 397Q247 441 326 441Q407 441 464 377T522 216Q522 115 457 52T310 -11Q242 -11 190 33L182 40V-45V-101Q182 -128 184 -134T195 -145Q216 -148 244 -148H260V-194H252L228 -193Q205 -192 178 -192T140 -191Q37 -191 28 -194H20V-148H36ZM424 218Q424 292 390 347T305 402Q234 402 182 337V98Q222 26 294 26Q345 26 384 80T424 218Z" transform="translate(3642,0)" style="stroke-width: 3;"/><path data-c="59" d="M518 0Q497 3 374 3Q253 3 232 0H221V46H254Q313 47 321 58Q324 62 324 167V273L221 446Q117 620 114 623Q106 631 91 634T31 637H11V683H20Q29 680 148 680Q273 680 294 683H305V637H287Q239 636 236 621Q236 619 321 475L407 332L483 460Q502 492 527 534Q563 594 563 604Q563 632 517 637H508V683H517H525Q533 683 545 683T571 682T600 681T626 681Q695 681 731 683H738V637H723Q640 633 613 588Q612 587 517 427L425 273V169V95Q425 66 428 59T444 49Q459 46 506 46H528V0H518Z" transform="translate(4198,0)" style="stroke-width: 3;"/></g></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(5226,0)"><g data-mml-node="mo"><path data-c="2F" d="M423 750Q432 750 438 744T444 730Q444 725 271 248T92 -240Q85 -250 75 -250Q68 -250 62 -245T56 -231Q56 -221 230 257T407 740Q411 750 423 750Z" style="stroke-width: 3;"/></g></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(5726,0)"><g data-mml-node="mtext"><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" style="stroke-width: 3;"/><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z" transform="translate(394,0)" style="stroke-width: 3;"/><path data-c="75" d="M383 58Q327 -10 256 -10H249Q124 -10 105 89Q104 96 103 226Q102 335 102 348T96 369Q86 385 36 385H25V408Q25 431 27 431L38 432Q48 433 67 434T105 436Q122 437 142 438T172 441T184 442H187V261Q188 77 190 64Q193 49 204 40Q224 26 264 26Q290 26 311 35T343 58T363 90T375 120T379 144Q379 145 379 161T380 201T380 248V315Q380 361 370 372T320 385H302V431Q304 431 378 436T457 442H464V264Q464 84 465 81Q468 61 479 55T524 46H542V0Q540 0 467 -5T390 -11H383V58Z" transform="translate(894,0)" style="stroke-width: 3;"/><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(1450,0)" style="stroke-width: 3;"/><path data-c="63" d="M370 305T349 305T313 320T297 358Q297 381 312 396Q317 401 317 402T307 404Q281 408 258 408Q209 408 178 376Q131 329 131 219Q131 137 162 90Q203 29 272 29Q313 29 338 55T374 117Q376 125 379 127T395 129H409Q415 123 415 120Q415 116 411 104T395 71T366 33T318 2T249 -11Q163 -11 99 53T34 214Q34 318 99 383T250 448T370 421T404 357Q404 334 387 320Z" transform="translate(1842,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(2286,0)" style="stroke-width: 3;"/><path data-c="48" d="M128 622Q121 629 117 631T101 634T58 637H25V683H36Q57 680 180 680Q315 680 324 683H335V637H302Q262 636 251 634T233 622L232 500V378H517V622Q510 629 506 631T490 634T447 637H414V683H425Q446 680 569 680Q704 680 713 683H724V637H691Q651 636 640 634T622 622V61Q628 51 639 49T691 46H724V0H713Q692 3 569 3Q434 3 425 0H414V46H447Q489 47 498 49T517 61V332H232V197L233 61Q239 51 250 49T302 46H335V0H324Q303 3 180 3Q45 3 36 0H25V46H58Q100 47 109 49T128 61V622Z" transform="translate(2730,0)" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(3480,0)" style="stroke-width: 3;"/><path data-c="70" d="M36 -148H50Q89 -148 97 -134V-126Q97 -119 97 -107T97 -77T98 -38T98 6T98 55T98 106Q98 140 98 177T98 243T98 296T97 335T97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 61 434T98 436Q115 437 135 438T165 441T176 442H179V416L180 390L188 397Q247 441 326 441Q407 441 464 377T522 216Q522 115 457 52T310 -11Q242 -11 190 33L182 40V-45V-101Q182 -128 184 -134T195 -145Q216 -148 244 -148H260V-194H252L228 -193Q205 -192 178 -192T140 -191Q37 -191 28 -194H20V-148H36ZM424 218Q424 292 390 347T305 402Q234 402 182 337V98Q222 26 294 26Q345 26 384 80T424 218Z" transform="translate(3758,0)" style="stroke-width: 3;"/><path data-c="59" d="M518 0Q497 3 374 3Q253 3 232 0H221V46H254Q313 47 321 58Q324 62 324 167V273L221 446Q117 620 114 623Q106 631 91 634T31 637H11V683H20Q29 680 148 680Q273 680 294 683H305V637H287Q239 636 236 621Q236 619 321 475L407 332L483 460Q502 492 527 534Q563 594 563 604Q563 632 517 637H508V683H517H525Q533 683 545 683T571 682T600 681T626 681Q695 681 731 683H738V637H723Q640 633 613 588Q612 587 517 427L425 273V169V95Q425 66 428 59T444 49Q459 46 506 46H528V0H518Z" transform="translate(4314,0)" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(10790,0) translate(0 -0.5)"><path data-c="7C" d="M139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo data-mjx-texclass="ORD" stretchy="false">|</mo><mrow data-mjx-texclass="ORD"><mtext>targetHipY</mtext></mrow><mrow data-mjx-texclass="ORD"><mo>/</mo></mrow><mrow data-mjx-texclass="ORD"><mtext>sourceHipY</mtext></mrow><mo data-mjx-texclass="ORD" stretchy="false">|</mo></math></mjx-assistive-mml></mjx-container> इस्तेमाल करता है, क्योंकि leg-to-torso proportion rigs के बीच अलग होता है। दोनों axes के लिए एक ही ratio इस्तेमाल करने से climbs overshoot करते हैं और recoveries फर्श के नीचे धंसते हैं। UAL displacement भी <code>root</code> bone पर रहता है, pelvis पर नहीं, इसलिए knockback, climb और locomotion clips में motion बनाए रखने के लिए दोनों को एक single hip-position track में जोड़ना ज़रूरी है।</p>
<p><strong>Offline trajectory parity testing।</strong> एक headless script source skeleton को 60Hz पर sample करता है, retargeting pipeline चलाता है, और per-bone world transforms की तुलना source से करता है। एक स्थिर per-frame offset हानिरहित bind delta है, जबकि frame दर frame बदलने वाला drift एक असली error है, इसलिए test एक regression check बन जाता है जो तब fire होता है जब कोई बदलाव किसी track को गिरा या विकृत कर दे। Per-pack GLB isolation (नया load, अगले से पहले मुक्त) पूरे sweep में cache contention से बचाता है।</p>
<p><strong>CDN glTF graphs के लिए LoadingManager.setURLModifier।</strong> जब कोई CDN glTF को एक relative-URI graph के रूप में एक साथ include map (relative path से absolute URL) के साथ देता है, तो <code>setURLModifier</code> loader द्वारा मांगी गई हर dependency को JSON को फिर लिखे बिना CDN के ज़रिए resolve करता है। यह एक multi-file, multi-resolution distribution को एक single-click load में ढहा देता है। अगले load से पहले हर पिछले model की geometry, materials और texture maps को dispose करना एक browsing session में सैकड़ों MB GPU memory जमा होने से रोकता है।</p>
<p><strong>Non-destructive mesh simplification।</strong> हर mesh की original geometry का एक clone store करना और per simplification ratio सिर्फ index buffer फिर बनाना बदलावों को तेज़ रखता है और बार-बार simplification से होने वाले cumulative नुकसान से बचाता है। Per <code>geometry.groups</code> slice चलाना और groups को फिर बनाना multi-material assignments को बनाए रखता है। यह distance-based LOD को कैसे feed करता है, इसके लिए <a href="/hi/guides/landscape-generation-browser.html#gpu-driven-lod-with-webgpu">LOD and meshoptimizer</a> देखें।</p>
<hr>
<p>29 में से भाग 17।
पिछला: <a href="/hi/blog/2026-04-28-open-world-browser-part-16-structure-and-authoring.html">भाग 16 - एक ऐसे world के लिए structure जो बढ़ता रहता है</a>
अगला: <a href="/hi/blog/2026-05-02-open-world-browser-part-18-ai-scattering.html">भाग 18 - एक scatter brush जो AI-placed महसूस होता है</a>
सीरीज़ गाइड: <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">/hi/blog/2026-02-25-open-world-browser-series-guide</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[एक AI game engine की शारीरिक रचना: prompt के अंदर असल में क्या है]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-04-30-anatomy-of-an-ai-game-engine</link>
            <guid>https://app.cinevva.com/hi/blog/2026-04-30-anatomy-of-an-ai-game-engine</guid>
            <pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Cinevva देखने में एक अकेला text box लगता है। उसके पीछे एक orchestrator, 26 typed tools, ग्यारह asset providers, एक live game iframe जिसे agent खुद खेल सकता है, और gameplay reels से जुड़ा एक storefront बैठा है। यहाँ पूरी मशीन है, टुकड़ा दर टुकड़ा।]]></description>
            <content:encoded><![CDATA[<h1 id="एक-ai-game-engine-की-शारीरिक-रचना-prompt-के-अंदर-असल-में-क्या-है" tabindex="-1">एक AI game engine की शारीरिक रचना: prompt के अंदर असल में क्या है <a class="header-anchor" href="#एक-ai-game-engine-की-शारीरिक-रचना-prompt-के-अंदर-असल-में-क्या-है" aria-label="Permalink to &quot;एक AI game engine की शारीरिक रचना: prompt के अंदर असल में क्या है&quot;"></a></h1>
<p><em><a href="/hi/about.html">Mariana Muntean</a> द्वारा, Cinevva की CEO</em></p>
<p>अजनबी Cinevva के बारे में सबसे आम बात यही कहते हैं कि यह एक AI wrapper है। वे homepage पर आते हैं, &quot;Describe your game&quot; लिखा एक अकेला input box देखते हैं, और तय कर लेते हैं कि उन्होंने product को समझ लिया। उन्होंने सामने का दरवाज़ा समझा है। Product वह सब कुछ है जो उस वाक्य को टाइप करते वक़्त आपको दिखाई नहीं देता, और इस हफ़्ते से, एक open world भी जिसमें आपके players घूमते हुए आपके game तक पहुँचते हैं।</p>
<p>उस input के पीछे एक पूरा game engine है, 26 typed tools वाला एक orchestrator, generative models का एक बेड़ा, ग्यारह providers में फैली हुई aggregated asset search, एक live game iframe जिसे agent पढ़ और लिख सकता है, और एक storefront जहाँ वही agent आपके तैयार game को एक swipe होने वाली gameplay reel के तौर पर ship करता है। इसमें से कुछ भी अजूबा नहीं है। यह सब plumbing है। दिलचस्प काम यह तय करना था कि किसको किससे जोड़ें।</p>
<p>यह post मशीन को ऊपर से नीचे तक घुमाकर दिखाती है। यही वह समझाइश है जो हम technical investors को देते हैं और यही वह समझाइश है जो हम contribute करने की सोच रहे developers को देते हैं। उन्हें एक ही जवाब चाहिए।</p>
<h2 id="_1-prompt-सतह-है-system-नहीं" tabindex="-1">1. Prompt सतह है, system नहीं <a class="header-anchor" href="#_1-prompt-सतह-है-system-नहीं" aria-label="Permalink to &quot;1. Prompt सतह है, system नहीं&quot;"></a></h2>
<img src="/img/blog/engine-anatomy/cinevva-engine-prompt.png" alt="The Cinevva prompt input on the homepage. A single text field reads 'Make a neon space shooter with asteroids, power-ups, and a synth soundtrack.' Below it are three suggestion chips and the Cinevva logo." style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>पहला design फ़ैसला यह था कि जब तक user का इसमें कुछ दाँव पर न लगे, तब तक सब कुछ छिपाकर रखें। Homepage का एक ही काम है, एक वाक्य लेकर उसे एक project में बदल देना। हमने अनुभव को एक public तरफ़ (prompt, showcases, storefront feed) और एक creator तरफ़ (IDE, asset tools, publish flow) में बाँट दिया, ताकि जो लोग बस खेलना चाहते हैं उन्हें cockpit देखना ही न पड़े।</p>
<p>इसीलिए placeholder &quot;Make a snake game with neon graphics&quot; और &quot;Top-down zombie shooter&quot; जैसी चीज़ों के बीच घूमता रहता है। ये tutorials नहीं हैं। ये एक इजाज़तनामा हैं। User देखता है कि वह &quot;अजीब arcade idea&quot; एक जायज़ input है।</p>
<p>जिस पल आप submit करते हैं, तीन चीज़ें होती हैं। System एक stable ID के साथ एक नया game project बनाता है। यह एक खाली file tree बोता है (<code>index.html</code>, <code>game.js</code>, <code>style.css</code>, <code>assets/</code>, <code>GDD.md</code>)। और यह आपके वाक्य को एक project context window के साथ orchestrator में भेजता है जो उन खाली files की ओर इशारा करता है। यहाँ से आगे आप एक ऐसे agent से बात कर रहे हैं जिसके हाथ हैं।</p>
<h2 id="_2-input-के-पीछे-एक-पूरा-browser-ide" tabindex="-1">2. Input के पीछे, एक पूरा browser IDE <a class="header-anchor" href="#_2-input-के-पीछे-एक-पूरा-browser-ide" aria-label="Permalink to &quot;2. Input के पीछे, एक पूरा browser IDE&quot;"></a></h2>
<img src="/img/blog/engine-anatomy/cinevva-engine-ide.png" alt="The Cinevva creator IDE in dark mode. Three panels: a file tree on the left with GDD.md, index.html, game.js, style.css and an assets folder; a syntax-highlighted code editor in the middle showing a Three.js renderer setup; and a live game preview on the right showing a top-down neon space shooter with a SCORE and LIVES HUD." style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>Creator workspace एक तीन-panel वाला IDE है जो पूरी तरह browser में चलता है। बाईं ओर file tree, बीच में code editor, दाईं ओर live game iframe, और नीचे की ओर चलता हुआ एक chat input। हमने यह layout जानबूझकर चुना। जो लोग पहले से code लिखते हैं वे इसे तुरंत पहचान लेते हैं। जो नहीं लिखते वे बीच वाले panel को नज़रअंदाज़ कर सकते हैं और सिर्फ़ chat से बात करते रह सकते हैं।</p>
<p>File tree कोई रूपक नहीं है। हर project सचमुच HTML, JS, CSS, generated images, GLB models और audio files की एक छोटी static site है, जो R2 से सीधे एक Cloudflare Worker के ज़रिए serve होती है। कोई build step नहीं है। इसकी वजह मायने रखती है। इसका मतलब है कि agent वही files पढ़ और लिख सकता है जो आप असल में ship करेंगे, और इसका मतलब है कि वही artifact iframe में चलता है, Capacitor में लिपटे एक phone पर चलता है, Tauri में लिपटे Steam पर चलता है, और Discord के अंदर एक Embedded Activity के तौर पर चलता है। एक filesystem, छह distribution targets।</p>
<p>हमारे बनाए हर game के लिए ज़रूरी है कि वह <code>window</code> पर दो functions expose करे। <code>getGameState()</code> एक सादा object लौटाता है जो चल रहे game का वर्णन करता है (player position, score, lives, enemies, timers)। <code>setGameState(patch)</code> एक partial update वापस live game पर लगाता है। यह छोटा सा API वह अनुबंध है जो agent को game को reload किए बिना उसे inspect और modify करने देता है। हम section 6 में इसकी वजह पर लौटेंगे।</p>
<h2 id="_3-orchestrator-जहाँ-असल-engine-रहती-है" tabindex="-1">3. Orchestrator, जहाँ असल engine रहती है <a class="header-anchor" href="#_3-orchestrator-जहाँ-असल-engine-रहती-है" aria-label="Permalink to &quot;3. Orchestrator, जहाँ असल engine रहती है&quot;"></a></h2>
<img src="/img/blog/engine-anatomy/cinevva-engine-orchestrator.png" alt="A diagram of the Cinevva orchestrator. A central node labeled 'Orchestrator (LLM)' is connected to eight tool nodes arranged around it: list_game_files, read_files, edit_files, write_files, generate_image (Flux), generate_skybox (Blockade), generate_music (ElevenLabs), and rig_model (Tripo). A dotted line connects the orchestrator to a 'Game iframe' node labeled 'screenshots + console.'" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>जब लोग इसे &quot;एक AI wrapper&quot; कहते हैं तो वे यह बात चूक जाते हैं कि AI इतना code नहीं लिखता जितना कि वह एक छोटे orchestra का संचालन करता है। Orchestrator एक tool-calling loop है जो एक frontier model के ख़िलाफ़ चलता है, जिसका system prompt क़रीब एक हज़ार लाइन लंबा है और 26 functions की एक typed tool surface है। Tool definitions ही engine हैं। Model conductor है।</p>
<p>26 tools पाँच परिवारों में बँटते हैं। Filesystem tools (<code>list_game_files</code>, <code>read_files</code>, <code>search_game_file</code>, <code>edit_files</code>, <code>write_files</code>, <code>delete_files</code>, <code>rename_files</code>) agent को आपके game को किसी भी दूसरे codebase की तरह बरतने देते हैं। Project tools (<code>create_new_game</code>, <code>list_games</code>, <code>open_game</code>, <code>ask_user</code>, <code>game_ready</code>) एक project के जीवनचक्र और इंसान को वापस सौंपने का काम संभालते हैं। Generative tools (<code>generate_image</code>, <code>generate_skybox</code>, <code>generate_music</code>, <code>generate_sfx</code>, <code>rig_model</code>, <code>apply_animation</code>, <code>list_animations</code>, <code>list_skybox_styles</code>) उन specialized models को call करते हैं जिन्हें हम आगे cover करेंगे। Knowledge tools (<code>search_fonts</code>, <code>list_library_docs</code>, <code>search_library_docs</code>, <code>list_generations</code>) agent को hallucinated APIs के बजाय भरोसेमंद, indexed सच्चाई के स्रोत देते हैं। और runtime tools (<code>read_console_logs</code>, <code>execute_js</code>) agent को live game देखने और छूने देते हैं।</p>
<p>एक आम पहली turn कुछ ऐसी दिखती है। User टाइप करता है &quot;Make a neon space shooter&quot;। Model एक <code>write_files</code> call निकालता है जिसमें <code>GDD.md</code> design का वर्णन करता है, फिर दोबारा <code>write_files</code> जिसमें <code>index.html</code>, <code>game.js</code> और <code>style.css</code> होते हैं। यह <code>generate_music</code> को <code>prompt=&quot;synthwave space shooter, 120 BPM, driving bassline&quot;</code> के साथ call करता है जो ElevenLabs Music के ख़िलाफ़ एक job शुरू करता है और R2 के अंदर एक MP3 URL लौटाता है। यह starfield के लिए एक Blockade Labs model 3 style के साथ <code>generate_skybox</code> call करता है। यह iframe को नए build पर पलटने के लिए <code>game_ready(title, message)</code> call करता है, और आख़िर में यह पुष्टि करने के लिए कि game बिना errors के boot हुआ, <code>read_console_logs</code> call करता है। अगर इसे कोई stack trace दिखता है, तो user के कुछ बताने से पहले ही यह <code>edit_files</code> पर लौटकर उसे ठीक कर देता है।</p>
<p>इस design की दिलचस्प बात यह है कि system prompt और tool schemas ही एकमात्र ऐसी चीज़ें हैं जो product-specific हैं। Model बदल दीजिए, फिर भी सब कुछ चलता है। हमने पिछले साल तीन frontier models के बीच migrate किया है बिना surface बदले, क्योंकि surface हमारी है।</p>
<h2 id="_4-asset-वाली-तरफ़-एक-model-fan-out" tabindex="-1">4. Asset वाली तरफ़: एक model fan-out <a class="header-anchor" href="#_4-asset-वाली-तरफ़-एक-model-fan-out" aria-label="Permalink to &quot;4. Asset वाली तरफ़: एक model fan-out&quot;"></a></h2>
<img src="/img/blog/engine-anatomy/cinevva-engine-assets.png" alt="A three-panel asset generation dashboard. The left panel is a music generator with a prompt 'synthwave space shooter, 120 BPM, driving bassline,' a 60-second duration slider, and a Generate button, plus a playing waveform card titled 'Asteroid Drift Theme.' The middle panel is a skybox generator with the prompt 'deep space, distant nebula, two moons' and a grid of four 360 degree environment thumbnails. The right panel shows a rotating 3D model preview of a low-poly purple spaceship with a 'Rig + Walk' button and a status indicator that reads 'Rigging... 1m 42s left.'" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>Agent images, music, sound या 3D ख़ुद नहीं बनाता। यह specialists को call करता है। Cinevva की asset वाली तरफ़ best-in-class models में एक fan-out है, जिसे इस तरह जोड़ा गया है कि एक का output अगले का जायज़ input बन जाए।</p>
<p>Images और sprites के लिए, <code>generate_image</code> Flux Pro 1.1 को एक ऐसी width और height के साथ call करता है जो हमेशा 32 का गुणक होती है, और एक output format के साथ जो prompt में transparency माँगने पर PNG में पलट जाता है। पूरे गानों के लिए agent एक stylistic prompt और seconds में एक duration के साथ ElevenLabs Music को call करता है। इक्का-दुक्का effects के लिए, ElevenLabs SFX &quot;laser gun firing, sci-fi blaster&quot; जैसे text से पाँच से पंद्रह seconds में एक clip बना देता है। 360 degree environments के लिए, <code>generate_skybox</code> Blockade Labs को लगभग नब्बे styles में से किसी एक के साथ call करता है, default में model 3 Digital Painting। 3D characters के लिए, <code>rig_model</code> एक GLB को Tripo को भेजता है ताकि उसे biped, quadruped, hexapod, octopod, serpentine या aquatic creature के रूप में skin और rig किया जाए, फिर <code>apply_animation</code> पंद्रह presets में से कोई भी चला देता है (idle, walk, run, jump, climb, dive, slash, shoot, hurt, fall, turn, साथ ही non-biped marches)।</p>
<p>इनमें से हर एक एक job है, sync call नहीं। इन्हें seconds से लेकर minutes लगते हैं। Orchestrator इन्हें launch करता है, तुरंत एक <code>jobId</code> के साथ लौटता है, और जब asset तैयार हो जाता है तो एक अलग channel नतीजे को वापस conversation में भेज देता है। इससे एहसास पूरी तरह बदल जाता है। Agent game logic बनाता रह सकता है जबकि background में एक 3D model rigging पूरी कर रहा होता है। User को कभी किसी एक critical path पर रुकना नहीं पड़ता।</p>
<p>सारे artifacts एक ही जगह आ गिरते हैं। R2, <code>cdn.cinevva.com</code> के पीछे, सादे URLs की तरह addressable। यानी agent का अगला <code>write_files</code> call बस <code>&lt;audio src=&quot;https://cdn.cinevva.com/audio/abc.mp3&quot;&gt;</code> embed कर सकता है और game बस चल पड़ता है। कोई SDK नहीं, कोई asset bundler नहीं, कोई manifest नहीं।</p>
<h2 id="_5-ग्यारह-providers-में-asset-search" tabindex="-1">5. ग्यारह providers में asset search <a class="header-anchor" href="#_5-ग्यारह-providers-में-asset-search" aria-label="Permalink to &quot;5. ग्यारह providers में asset search&quot;"></a></h2>
<img src="/img/blog/engine-anatomy/cinevva-engine-asset-search.png" alt="The Cinevva asset search page in dark mode. A search bar at the top contains the query 'asteroid rock' and a row of provider filter pills shows All, PolyHaven, Sketchfab, Kenney, Quaternius, AmbientCG, OpenGameArt, Freesound, Smithsonian, Synty, and Jamendo, with Sketchfab highlighted. Below is a four-column grid of asteroid model thumbnails, each card showing its provider badge, a CC0 or CC-BY license tag, and a 'Use in game' button. A small caption in the upper right corner shows a chat bubble that reads 'ChatGPT: one of the best free asset tools for game devs.'" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>जब आपको कुछ ख़ास चाहिए तो generation बढ़िया है। जब कुछ पहले से मौजूद है तो search ज़्यादा तेज़ है। <a href="/hi/assets.html">Asset Library</a> ग्यारह मुफ़्त और licensed providers में फैली एक federated search है, जो एक ही ranked feed में लौटती है।</p>
<p>Provider registry worker में बैठती है और हर query को PolyHaven, Sketchfab, Freesound, Kenney, AmbientCG, Quaternius, OpenGameArt, Smithsonian 3D collection, TurboSquid, Synty और Jamendo के ख़िलाफ़ समानांतर में चलाती है। हर provider एक साझा interface लागू करता है (<code>search</code>, <code>getMetadata</code>, <code>isBrowsable</code>, <code>getSupportedTypes</code>), इसलिए नया जोड़ना सिर्फ़ एक TypeScript file है। Aggregation layer अलग-अलग तरीक़े से paginate करने वाले providers में cursor-based pagination संभालती है, licenses को deduplicate करती है, asset types को एक साझा taxonomy (model, texture, audio, hdri, sprite) में normalize करती है, और हर asset को उसके license के साथ tag कर देती है ताकि agent कभी ऐसा कुछ न चुने जिसे वह redistribute न कर सके।</p>
<p>जब पिछली तिमाही ChatGPT ने इस tool को game devs के लिए बेहतरीन मुफ़्त asset finders में से एक के रूप में सुझाया, तो हमने वह सिफ़ारिश पढ़ी। जो बात मायने रखती है, उस बारे में वह सही था। बात यह नहीं है कि हमारे पास एक अकेली library के ऊपर एक search bar है। बात यह है कि &quot;stone wall texture&quot; खोज रहे एक indie developer को PolyHaven और AmbientCG के नतीजे, साथ-साथ Kenney के stylized version और Smithsonian के एक photogrammetry option के साथ मिलते हैं, एक query में, एक जैसी license metadata के साथ। Agent उसी endpoint को hit कर सकता है और assets वैसे ही चुन सकता है जैसे एक इंसान चुनता है।</p>
<p>Engine का यही हिस्सा अक्सर कम आँका जाता है। ज़्यादातर game-AI demos सब कुछ शून्य से generate करते हैं और एक एक-सी, चमकीली, थोड़ी अटपटी सी शक्ल पर आकर रुक जाते हैं। Cinevva पर दिलचस्प games generated assets को Smithsonian की असली CC0 photogrammetry और Quaternius के एक हाथ से बने low-poly पेड़ के साथ मिलाते हैं। Orchestrator यह एक ही turn में कर सकता है।</p>
<h2 id="_6-agent-game-खेलता-है" tabindex="-1">6. Agent game खेलता है <a class="header-anchor" href="#_6-agent-game-खेलता-है" aria-label="Permalink to &quot;6. Agent game खेलता है&quot;"></a></h2>
<img src="/img/blog/engine-anatomy/cinevva-engine-debug.png" alt="A live debugging view. On the left, a running neon space shooter showing the player ship dodging asteroids with a SCORE of 4820 and 2 lives remaining. On the right, two stacked panels: an execute_js panel showing the call JSON.stringify(getGameState()) and a returned JSON object with player position, velocity, health, score, lives, and asteroid count, and a read_console_logs panel showing the most recent log lines including spawn asteroid, powerup picked, a texture load warning, and an FPS reading of 58." style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>जब हम इसे दिखाते हैं तो यही हिस्सा ज़्यादातर engineers को चौंकाता है। Agent सिर्फ़ files में code नहीं लिखता। यह game को एक sandboxed iframe में चलाता है, उसका console पढ़ता है, UI बनाम 3D scene के लिए layered screenshots लेता है, और state को inspect या बदलने के लिए live runtime के अंदर JavaScript execute करता है।</p>
<p><code>read_console_logs</code> iframe से <code>console.log</code>, <code>console.warn</code>, <code>console.error</code> और uncaught exceptions की आख़िरी पचास लाइनें लौटाता है। हर <code>game_ready</code> call के बाद, system prompt के मुताबिक़ agent के लिए ज़रूरी है कि वह <code>read_console_logs</code> call करे और user को वापस सौंपने से पहले कोई भी errors ठीक करे। वह एक नियम ज़्यादातर ऐसी विफलताओं को ख़त्म कर देता है जैसे &quot;AI ने कहा कि हो गया पर screen काली है&quot;, जो दूसरे tools में होती हैं।</p>
<p><code>execute_js</code> ज़्यादा ताक़तवर वाला है। यह game के global scope के अंदर मनमाना JavaScript चलाता है। चूँकि हर game के लिए <code>getGameState</code> और <code>setGameState</code> लागू करना ज़रूरी है, इसलिए agent चल रहे game की पूरी state पढ़ने के लिए <code>JSON.stringify(getGameState())</code> चला सकता है, फिर player को teleport करने के लिए <code>setGameState({player: {x: 500, y: 100}})</code>, invincibility देने के लिए <code>setGameState({lives: 99})</code>, या आगे skip करने के लिए <code>setGameState({level: 3})</code>। यह नीचे के स्तरों पर भी हाथ डाल सकता है, जैसे Three.js scene graph inspect करने के लिए <code>scene.children.map(c =&gt; c.type)</code> या renderer mount हुआ या नहीं यह पुष्टि करने के लिए <code>document.querySelectorAll('canvas').length</code>।</p>
<p>आप देख सकते हैं कि यह क्यों मायने रखता है। जब कोई user कहता है &quot;level दो पर player दीवार में फँस जाता है&quot;, तो agent को अंदाज़ा नहीं लगाना पड़ता। यह level दो खोलता है, <code>getGameState()</code> चलाता है, collision data जाँचता है, एक fix test करने के लिए एक <code>execute_js</code> patch चलाता है, और तभी fix को disk पर लिखता है। यह उसी तरह debug करता है जैसे आप debug करते हैं। हम iframe को एक साथी मानते हैं, निशाना नहीं।</p>
<h2 id="_7-library-docs-सच्चाई-का-उबाऊ-स्रोत" tabindex="-1">7. Library docs, सच्चाई का उबाऊ स्रोत <a class="header-anchor" href="#_7-library-docs-सच्चाई-का-उबाऊ-स्रोत" aria-label="Permalink to &quot;7. Library docs, सच्चाई का उबाऊ स्रोत&quot;"></a></h2>
<p>जिन libraries को games असल में इस्तेमाल करते हैं (Three.js, Tone.js, Cannon, और बढ़ती जा रही सूची) उनके official documentation को हम एक structured, searchable JSON store में index करते हैं। Agent खुले web की ओर जाने से पहले <code>search_library_docs(&quot;threejs&quot;, &quot;Mesh&quot;)</code> की ओर हाथ बढ़ाता है। यह तेज़ है, यह versioned है, और यह कभी ऐसा method नहीं गढ़ता जिसका नाम दो minor releases पहले बदल दिया गया था।</p>
<p>यह चमक-दमक वाली बात नहीं है। यही वह फ़र्क़ है जो एक ऐसे AI के बीच है जो चलने वाला code बनाता है और एक ऐसे AI के बीच जो देखने में भरोसेमंद लगने वाला code बनाता है जो लाइन चालीस पर crash कर जाता है। Cinevva से बने games की दिखाई देने वाली गुणवत्ता का ज़्यादातर हिस्सा इसी एक फ़ैसले से आता है।</p>
<h2 id="_8-खेलने-योग्य-से-खोजने-योग्य-तक-reels-और-storefront" tabindex="-1">8. खेलने योग्य से खोजने योग्य तक: reels और storefront <a class="header-anchor" href="#_8-खेलने-योग्य-से-खोजने-योग्य-तक-reels-और-storefront" aria-label="Permalink to &quot;8. खेलने योग्य से खोजने योग्य तक: reels और storefront&quot;"></a></h2>
<img src="/img/blog/engine-anatomy/cinevva-engine-reels.png" alt="A short-form gameplay reels storefront. In the center, a phone-shaped card plays a portrait video of a neon space shooter mid-combat with social UI icons stacked on the right (a heart with 14k, a chat bubble with 3.2k, a share arrow with 1.8k, and a 'Play Now' button). The reel label at the bottom reads 'Asteroid Drift • by @indiedev • 3.1M views.' To the left, a small chat snippet titled 'From the creator's chat' shows the assistant message 'Game is live. Reel auto-published to your storefront.' To the right, a Storefront panel lists three trending games: Asteroid Drift, Roadhawk Runner, and Birb Clicker, each with a view count and a 'Trending' badge." style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>जिस game को कोई नहीं खेलता वह एक निजी शौक़ है। Indie development में सबसे कठिन अनसुलझी समस्या अब games बनाना नहीं रह गई। वह distribution है। तो engine &quot;खेलने योग्य&quot; पर आकर नहीं रुकती। यह &quot;players के सामने&quot; पर रुकती है।</p>
<p>Cinevva पर हर project एक stable share URL साथ रखता है जैसे <code>play.cinevva.com/{game-id}</code>, जो game का नवीनतम build एक full-page iframe में खोलता है, साथ में likes और shares के लिए एक नन्हा overlay। जब agent <code>game_ready</code> call करता है, तो यह सिर्फ़ IDE के अंदर वाला preview नहीं पलटता। यह <a href="/hi/play.html">Cinevva storefront</a> पर एक 15-second की gameplay reel publish करने की पेशकश भी करता है। Reel game को खेले जाने की असली recording है, जो सीधे iframe से capture की जाती है (हम एक छोटा recorder script ship करते हैं जिसे agent game runtime में inject करता है), इसलिए viewer जिसके आगे से scroll करता है वह असली gameplay है, कोई marketing edit नहीं।</p>
<p>इससे वह loop बदल जाता है जिसमें एक developer जीता है। पुराना loop था code करो, build करो, package करो, upload करो, एक Steam page लिखो, एक algorithm से लड़ो, एक wishlist counter देखो। नया loop है एक वाक्य टाइप करो, agent को बनाते हुए देखो, publish दबाओ, और अपने game को बाक़ी सब के साथ उसी swipe feed में आते हुए देखो। Discovery उसी product में होती है जहाँ creation होती है, उसी URL पर, उसी login के साथ।</p>
<p>dev community के पाठकों के लिए, यही हिस्सा जाँचने लायक है। Distribution हमेशा वह खाई रही है जो game engines साथ लेकर नहीं आतीं। Unity एक editor ship करता है, game आप Steam पर ship करते हैं। Unreal एक editor ship करता है, आप Epic Store पर ship करते हैं। Cinevva दोनों हिस्से ship करता है। Engine और storefront उसी orchestrator के ज़रिए आपस में बात करते हैं जिसने game बनाया।</p>
<h2 id="_9-top-performers-discovery-flywheel" tabindex="-1">9. Top Performers: discovery flywheel <a class="header-anchor" href="#_9-top-performers-discovery-flywheel" aria-label="Permalink to &quot;9. Top Performers: discovery flywheel&quot;"></a></h2>
<img src="/img/blog/engine-anatomy/cinevva-engine-charts.png" alt="The Cinevva Top Performers chart. Three tabs at the top read Trending, Recent, and Top, with Top selected. Below, a podium row of three featured games: number one The Breaker Belt with 42.1k plays, number two Roadhawk Runner with 27.7k plays, and number three Asteroid Drift with 37.1k plays. Below the podium, a denser grid of six smaller game cards including Pixel Platformer, Zombie Shooter, Fruit Ninja Clone, Tower Defense, Card Battler, and Zombie Builder, each with thumbnails, creator handles, and play counts." style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>Reels feed flywheel का एक आधा हिस्सा है। <a href="/hi/charts.html">Top Performers chart</a> दूसरा है। यह games को trending, recent और all-time top के हिसाब से रैंक करता है, जो raw clicks के बजाय completion rate (क्या player ने एक session पूरा किया) से weighted होता है। Completion को installs के मुक़ाबले गेम करना ज़्यादा मुश्किल है। एक ऐसा game जो साठ seconds तक ध्यान बाँधे रखता है, उस game से बेहतर है जिसे खोलकर बंद कर दिया जाता है।</p>
<p>हर signal वापस orchestrator की अगली turn में feed होता है। जब agent कहता है &quot;चलो एक power-up जोड़ते हैं&quot;, तो यह किसी तय pattern library से नहीं उठा रहा। यह एक ऐसे model से उठा रहा है जिसने देखा है कि इस महीने Cinevva पर कौन-से mechanics असल में players को रोके रखते हैं। Flywheel page के नीचे लगा कोई chart नहीं है। यह पूरी engine के लिए training signal है।</p>
<p>investors के लिए, यही data वाली खाई है। हमारे पास सिर्फ़ generated games नहीं हैं। हमारे पास असली session-level engagement metrics वाले generated games हैं, जो उन prompts से जुड़े हैं जिन्होंने उन्हें बनाया, जो उन asset choices से जुड़े हैं जो agent ने कीं, जो उन players से जुड़े हैं जिन्होंने उन्हें like किया। हर loop अगले को कसता जाता है।</p>
<h2 id="_10-engine-एक-game-बन-जाती-है" tabindex="-1">10. Engine एक game बन जाती है <a class="header-anchor" href="#_10-engine-एक-game-बन-जाती-है" aria-label="Permalink to &quot;10. Engine एक game बन जाती है&quot;"></a></h2>
<p>यहाँ वह हिस्सा है जिसके बारे में मैं महीनों से social पर इशारे करती रही हूँ। Sections 1 से 9 तक सब कुछ एक ऐसे system का वर्णन करता है जो games बनाता है। जिसे वर्णन करना ज़्यादा कठिन है, जब तक आप देख न लें, वह यह है कि क्या होता है जब system ख़ुद एक जगह बन जाती है।</p>
<p>Game बनाना कठिन काम है, हमारे ship किए हर चीज़ के बावजूद। अगर आपने पहले कभी game नहीं बनाया, तो अचानक आप plot, characters, world, mechanics, कौन क्या और कब करता है, light कैसे बरतती है, special effects कैसे layer होते हैं, music, sound effects, camera की चालें, इन सब के ज़िम्मेदार बन जाते हैं। यह बहुत कुछ है। और इन सब के ऊपर आप चाहते हैं कि नतीजा आपका अपना लगे, किसी और के tool से उगले गए template जैसा नहीं। Prompt और orchestrator आपके लिए ज़्यादातर यांत्रिक काम कर देते हैं। जो वे अकेले नहीं कर सकते वह है आपकी तैयार चीज़ को खड़े होने के लिए एक मंच देना जहाँ और लोग देख रहे हों।</p>
<p>तो हमने मंच बनाया। इस साल के ज़्यादातर समय में <a href="/hi/about.html">Oleg</a> और engine team browser में एक open world रखने के बारे में एक <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">14-भाग की श्रृंखला</a> में काम publish करते रहे हैं। ऐसा sculpted terrain जिसे आप real time में तराश सकते हैं। ऐसे biomes जो slope और altitude के आधार पर ख़ुद को rock या grass रंग लेते हैं। compute-generated terrain के ऊपर 80,000 grass blades जो हवा में झुकते हैं। एक ऐसा character जो एक ही चाल में heightmap और volumetric terrain के पार चलता, दौड़ता, कूदता और सरकता है। इनमें से कुछ भी अपने आप में एक tech demo नहीं था। यह इसी के लिए आधार था।</p>
<p>आज open world शुरुआती रूप में live है। आप एक avatar पहनते हैं और अंदर चल पड़ते हैं। आपके published games आपके आसपास घूमने लायक जगहों के तौर पर दिखते हैं, ठीक वैसे ही जैसे <a href="/hi/play.html">storefront reels</a> और <a href="/hi/charts.html">Top Performers chart</a> उन्हें अभी दिखाते हैं, बस इस बार आप swipe करके नहीं बल्कि पैदल पहुँचते हैं। आप world से ही किसी अजनबी के game में, world छोड़े बिना, उतर सकते हैं। आप उस इंसान के बगल में खड़े हो सकते हैं जिसने वह चीज़ बनाई जो आपने अभी खेली और उसे बता सकते हैं कि आप आगे क्या जोड़ते। आप किसी अभी-अभी मिले इंसान के साथ terrain का एक टुकड़ा तराश सकते हैं और उसे एक नए project का बीज बना सकते हैं। Discovery एक feed होना बंद कर देती है। यह एक सैर बन जाती है।</p>
<p>हमारी engine हमेशा से तकनीकी अर्थ में एक game engine रही है। आज यह शाब्दिक अर्थ में भी एक बन जाती है। जो चीज़ आपका game बनाती है वह अब ख़ुद एक game है, और section 3 का वही orchestrator, section 4 के वही asset rails, section 6 का वही <code>getGameState</code> अनुबंध, section 8 की वही reels, और section 9 का वही chart, सब मिलकर उस एक जगह में बन जाते हैं जहाँ आपके players घूमते हैं। बनाने और खेलने के बीच की दीवार हमेशा से बनावटी थी। अब वह चली गई है।</p>
<h2 id="जो-हमें-लगता-है-हमने-सही-किया" tabindex="-1">जो हमें लगता है हमने सही किया <a class="header-anchor" href="#जो-हमें-लगता-है-हमने-सही-किया" aria-label="Permalink to &quot;जो हमें लगता है हमने सही किया&quot;"></a></h2>
<p>पहली चीज़ जो हमने सही की वह थी prompt को एक product के बजाय एक UI affordance की तरह बरतना। Product है orchestrator, tool surface, asset rails और storefront। Prompt एक user को system में लाने का सबसे सस्ता संभव तरीक़ा है।</p>
<p>दूसरी थी बिना build step वाले एक flat, browser-native filesystem पर अड़े रहना। इसी वजह से एक Cinevva game एक ही सच्चाई के स्रोत से mobile, desktop, Steam और Discord पर ship होता है। इसी वजह से agent जो उसने लिखा वह पढ़ सकता है।</p>
<p>तीसरी थी वह अनुबंध कि हर generated game <code>getGameState</code> और <code>setGameState</code> लागू करता है। System prompt में वह एक लाइन ही agent को एक code generator के बजाय एक सहयोगी जैसा महसूस कराती है। Agent खेल सकता है, और जो system खेल सकता है वह debug कर सकता है।</p>
<p>चौथी थी storefront को engine के उसी loop में जोड़ना। हम raw model quality पर नहीं जीतने वाले। एक open-weights generator से दो महीने आगे रहने में कोई बचाव लायक फ़ायदा नहीं है। हम तब जीतते हैं जब वही agent जो आपका game बनाता है उसे publish भी करता है, मापता भी है, और इससे सीखता भी है कि अजनबियों ने उसे कैसे खेला।</p>
<p>अगर आप पूरी मशीन को चलते हुए देखना चाहते हैं, तो homepage का prompt अब भी सामने का दरवाज़ा है। एक वाक्य टाइप करिए। देखिए इसके पीछे क्या होता है। फिर यहाँ वापस आकर हमें बताइए कि engine का कौन सा टुकड़ा अगला लिखें।</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ब्राउज़र में open world बनाना, भाग 16: एक ऐसी structure जो बढ़ते रहने वाली दुनिया को संभाले]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-04-28-open-world-browser-part-16-structure-and-authoring</link>
            <guid>https://app.cinevva.com/hi/blog/2026-04-28-open-world-browser-part-16-structure-and-authoring</guid>
            <pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Spike 33 ने 6,285-लाइन वाले monolith को modules में तोड़ा और तीन छुपे हुए init-order bugs बाहर निकाले। Spike 34 ने उसी structure का इस्तेमाल करके बिना किसी चीज़ को फुलाए 100+ placeable props जोड़े।]]></description>
            <content:encoded><![CDATA[<h1 id="ब्राउज़र-में-open-world-बनाना-भाग-16-एक-ऐसी-structure-जो-बढ़ते-रहने-वाली-दुनिया-को-संभाले" tabindex="-1">ब्राउज़र में open world बनाना, भाग 16: एक ऐसी structure जो बढ़ते रहने वाली दुनिया को संभाले <a class="header-anchor" href="#ब्राउज़र-में-open-world-बनाना-भाग-16-एक-ऐसी-structure-जो-बढ़ते-रहने-वाली-दुनिया-को-संभाले" aria-label="Permalink to &quot;ब्राउज़र में open world बनाना, भाग 16: एक ऐसी structure जो बढ़ते रहने वाली दुनिया को संभाले&quot;"></a></h1>
<p><em>लिखा है <a href="/hi/about.html">Oleg Sidorkin</a> ने, Cinevva के CTO और को-फाउंडर</em></p>
<p>यहाँ नए हैं? <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">सीरीज़ गाइड</a> देखिए। यह बताती है कि spike क्या होता है और सारे भागों के लिंक देती है।</p>
<p><a href="/hi/blog/2026-04-13-open-world-browser-part-13-terrain-sculpting.html">भाग 13</a> के बाद से हर spike एक ही नुस्खे पर चल रहा था: पिछले monolith को copy करो, एक feature जोड़ो। <a href="/hi/blog/2026-04-13-open-world-browser-part-15-multiplayer-and-water.html">spike 32</a> के आते-आते वह monolith एक ही <code>&lt;script type=&quot;module&quot;&gt;</code> के अंदर 6,285 लाइनों का <code>index.html</code> बन चुका था। Code search शोरगुल भरा था, किसी feature को कहाँ जोड़ना है यह ढूँढने में उसे लिखने से ज़्यादा वक़्त लगता था, और कोई भी architectural बदलाव एक ऐसी file को छूता था जो इतनी बड़ी थी कि उसे दिमाग में diff करना मुमकिन नहीं था। अगला feature जोड़ने से पहले हमने structure का कर्ज़ चुकाया।</p>
<h2 id="व्यवहार-में-बिना-किसी-बदलाव-के-monolith-को-तोड़ना" tabindex="-1">व्यवहार में बिना किसी बदलाव के monolith को तोड़ना <a class="header-anchor" href="#व्यवहार-में-बिना-किसी-बदलाव-के-monolith-को-तोड़ना" aria-label="Permalink to &quot;व्यवहार में बिना किसी बदलाव के monolith को तोड़ना&quot;"></a></h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/33-code-structure/" title="Spike 33 Code Structure Refactor" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/33-code-structure/" target="_blank">Spike 33 को नए tab में खोलिए ↗</a> · <a href="/blog/spike-source?spike=33-code-structure">सोर्स देखिए</a></p>
<p>शर्त सख़्त थी: हर split एक pure refactor होना चाहिए, redesign नहीं। Monolith 19 <code>.mjs</code> files और एक 151-line वाले host shell में बदल गया। scene, water, grass, character, physics, multiplayer और UI के लिए top-level modules, एक <code>wgsl.mjs</code> जो हर WGSL source string को GPU सच के इकलौते स्रोत के रूप में रखता है, और heightmap, SDF, chunks, GPU buffer wrappers, brush, LOD और persistence के लिए एक <code>terrain/</code> subtree। कुल code 6,555 लाइनों का निकला, मोटे तौर पर monolith जमा import boilerplate। मात्रा में कोई शुद्ध बदलाव नहीं, navigability में बड़ा बदलाव।</p>
<p>फिर page load हुआ और एक काली स्क्रीन दिखी। दो error messages, दो बिल्कुल अलग root causes। पहला एक zero-byte buffer binding को लेकर WebGPU की शिकायत थी। Monolith में SDF brush buffer तब lazily allocate होता था जब पहला marching-cubes chunk आता था, और bind-group factory संयोग से बाद में चलती थी, buffer के बन जाने के बाद। <code>terrain/gpu.mjs</code> को <code>terrain/brush.mjs</code> से अलग करने पर module evaluation का क्रम बदल गया, इसलिए अब factory पहले चली और एक <code>null</code> placeholder को bind करने की कोशिश की। इसका हल था bind-group creation को पहले dispatch तक टाल देना, एक <code>getOrCreateBindGroup(chunk)</code> helper के ज़रिए। &quot;सब कुछ पहले से बना लो&quot; वाला pattern monolith के इकलौते init path की एक देन था।</p>
<p>दूसरा message एक डरावना दिखने वाला FBX skeleton warning था जो असल में एक झाँसा निकला। यह spike 25 से छप रहा था और बेज़रर था। Character सिर्फ़ इसलिए गायब था क्योंकि पहले bug का सिलसिला चल पड़ा: हर compute dispatch fail हुआ, heightmap कभी लिखा ही नहीं गया, height samples 0 लौटाने लगे, और character origin पर spawn होकर दुनिया के बीच से नीचे गिर गया। Buffer ठीक करो, तो character ठीक से animate करता है, warning समेत।</p>
<p>यही इस refactor का असली सबक है। Monolith ने हर &quot;X को Y बनने से पहले मौजूद होना चाहिए&quot; वाले रिश्ते को top-to-bottom script order के अंदर छुपा रखा था। Modularize करने पर वह क्रम बदल गया और तीन और छुपे हुए ordering bugs सामने आए: heightmap upload से पहले grass scatter होना, environment map के decode पूरा होने से पहले water plane जुड़ना, और पहले frame के बाद persistence load पूरा होना। तीनों एक-लाइन के fixes थे, और split के बिना इनमें से एक भी नहीं पकड़ा जाता।</p>
<h2 id="बिना-किसी-चीज़-को-बढ़ाए-सौ-props" tabindex="-1">बिना किसी चीज़ को बढ़ाए सौ props <a class="header-anchor" href="#बिना-किसी-चीज़-को-बढ़ाए-सौ-props" aria-label="Permalink to &quot;बिना किसी चीज़ को बढ़ाए सौ props&quot;"></a></h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/34-world-authoring/" title="Spike 34 World Authoring" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/34-world-authoring/" target="_blank">Spike 34 को नए tab में खोलिए ↗</a> · <a href="/blog/spike-source?spike=34-world-authoring">सोर्स देखिए</a></p>
<p>Spike 34 इस बात की परीक्षा थी कि structure का फ़ायदा मिला या नहीं। मक़सद था एक first-person palette, जिससे एक CC0 model pack से trees, rocks, bushes, mushrooms और paths रखे जा सकें, terrain-aware alignment, persistence, multiplayer sync और physics colliders के साथ, और यह सब controls छोड़े बिना। नए code की हर लाइन <code>src/props/</code> के नीचे पाँच नई files में आई, और कोई भी मौजूदा module दस hook-up लाइनों से ज़्यादा नहीं बढ़ा।</p>
<p>Asset वाला सफ़र एक ऐसा चक्कर ले बैठा जो दर्ज करने लायक है, क्योंकि यह उस तरह की चीज़ है जो पूरा दिन खा जाती है। हमने Quaternius के Ultimate Nature pack से शुरुआत की, एक FBX library जिसमें embedded textures नहीं थीं। FBX materials बिना map के <code>MeshPhong</code> के रूप में आए, इसलिए हमने एक manual material-name-to-PNG table जोड़ी, Phong को Standard में बदला, और color spaces हाथ से set किए। करीब 30% materials का कोई matching PNG नहीं था और कई नाम एक जैसे trees के बीच confusing थे। एक दूसरे FBX pack में भी वही कमी थी। हल और mapping tables नहीं था, हल एक बेहतर तरीके से authored pack था: Quaternius का Stylized Nature MegaKit 116 पूरे glTFs के साथ आता है, जिनमें embedded PBR materials और baked normals हैं। <code>FBXLoader</code> की जगह <code>GLTFLoader</code> लाने से cm-to-meters scaling, texture table और Phong conversion मिट गए, और <code>library.mjs</code> करीब 80 लाइन छोटा हो गया। सीख यह: जो CC0 packs glTF के साथ PBR भेजते हैं, उनके लिए वही सही pipeline है, और manual texture mapping वाला FBX दोगुना code था आधी quality के लिए।</p>
<p>glTF के रास्ते के साथ कुछ नुकीले किनारे भी आए। Palette 116 thumbnails render करती है, और WebGPU का <code>canvas.toDataURL()</code> एक <code>GPUCanvasContext</code> surface के लिए खाली लौटाता है, इसलिए thumbnails एक <code>RenderTarget</code> में render होती हैं, <code>readRenderTargetPixelsAsync</code> से वापस पढ़ी जाती हैं, और एक 2D canvas में blit होती हैं, WebGPU के 256-byte row alignment का ध्यान रखते हुए। Ghost previews हर material को clone करके उन्हें हरा रंग देती हैं, जो उन meshes पर टूट गया जिनका <code>material</code> एक array है, और इसे एक <code>Array.isArray</code> branch से ठीक किया गया। और जो 16-bit normal maps ~200 MB पर आए थे, उन्हें एक बार के <code>mogrify -depth 8</code> से ~32 MB तक घटाया, और वे देखने में एक जैसे ही रहे, क्योंकि browsers वैसे भी upload पर downsample कर देते हैं।</p>
<h2 id="जब-rendered-geometry-सिर्फ़-gpu-पर-मौजूद-हो" tabindex="-1">जब rendered geometry सिर्फ़ GPU पर मौजूद हो <a class="header-anchor" href="#जब-rendered-geometry-सिर्फ़-gpu-पर-मौजूद-हो" aria-label="Permalink to &quot;जब rendered geometry सिर्फ़ GPU पर मौजूद हो&quot;"></a></h2>
<p>सबसे सिखाने वाला bug यह था कि cursor के हिलने पर ghost preview 1 से 2 meter की छलाँगों में snap कर रहा था। Terrain meshes अपने vertex positions एक <code>StorageBufferAttribute</code> में रखते हैं क्योंकि compute pipeline उन्हें सीधे GPU पर लिखता है, इसलिए three.js का CPU <code>Raycaster</code> उन्हें देख नहीं पाता और कुछ नहीं लौटाता। Fallback analytic heightmap के ख़िलाफ़ एक मोटा 1.5 m ray-march था, और वही तय stride वह grid था जो user को दिखता था। हमने उसकी जगह एक adaptive march लगाया: surface से काफ़ी ऊपर रहते हुए stride 2.5 m, उसके 5 m के भीतर आने पर घटकर 0.4 m, और फिर <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.869ex;" xmlns="http://www.w3.org/2000/svg" width="16.358ex" height="2.566ex" role="img" focusable="false" viewBox="0 -750 7230.4 1134.3" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(389,0)"><g data-mml-node="mtext"><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(392,0)" style="stroke-width: 3;"/><path data-c="79" d="M69 -66Q91 -66 104 -80T118 -116Q118 -134 109 -145T91 -160Q84 -163 97 -166Q104 -168 111 -168Q131 -168 148 -159T175 -138T197 -106T213 -75T225 -43L242 0L170 183Q150 233 125 297Q101 358 96 368T80 381Q79 382 78 382Q66 385 34 385H19V431H26L46 430Q65 430 88 429T122 428Q129 428 142 428T171 429T200 430T224 430L233 431H241V385H232Q183 385 185 366L286 112Q286 113 332 227L376 341V350Q376 365 366 373T348 383T334 385H331V431H337H344Q351 431 361 431T382 430T405 429T422 429Q477 429 503 431H508V385H497Q441 380 422 345Q420 343 378 235T289 9T227 -131Q180 -204 113 -204Q69 -204 44 -177T19 -116Q19 -89 35 -78T69 -66Z" transform="translate(892,0)" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(1453,-239.4) scale(0.707)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(2460.7,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(3460.9,0)"><g data-mml-node="mtext"><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(389,0)" style="stroke-width: 3;"/><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(833,0)" style="stroke-width: 3;"/><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(1225,0)" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(1617,0)" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(2117,0)" style="stroke-width: 3;"/><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(2395,0)" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(2984,-150) scale(0.707)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(6841.4,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo stretchy="false">(</mo><msub><mtext>ray</mtext><mi>y</mi></msub><mo>−</mo><msub><mtext>terrain</mtext><mi>y</mi></msub><mo stretchy="false">)</mo></math></mjx-assistive-mml></mjx-container> का चिह्न पलटने पर 14 बार bisect। इससे प्रति cast करीब 30 चौड़े steps जमा 14 bisections में sub-millimeter precision मिलती है। जब rendered geometry सिर्फ़ GPU पर बसती हो, raycaster से मत लड़िए, analytic source के ख़िलाफ़ march कीजिए।</p>
<h2 id="ऐसे-colliders-जो-edits-के-दौरान-ईमानदार-रहें" tabindex="-1">ऐसे colliders जो edits के दौरान ईमानदार रहें <a class="header-anchor" href="#ऐसे-colliders-जो-edits-के-दौरान-ईमानदार-रहें" aria-label="Permalink to &quot;ऐसे colliders जो edits के दौरान ईमानदार रहें&quot;"></a></h2>
<p>हमने convex hulls या mesh colliders के बजाय primitive proxies चुने। Quaternius props गोल-मटोल और low-poly हैं, बिना किसी मायने रखने वाली concavities के, इसलिए hulls उसी gameplay के लिए करीब 50 गुना code और 10 गुना runtime cost होते। हर prop अपने bounding box से निकले एक shape में सिमट जाता है: trees और cacti एक vertical capsule में, rocks एक sphere में, logs लंबी axis के साथ एक horizontal capsule में, और सजावटी bushes और flowers किसी चीज़ में नहीं। Rocks और logs walkable हैं (सिर्फ़ vertical push, ताकि आप उन पर खड़े हो सकें), trees और cacti blocking हैं (पूरा 3D push, ताकि आप किसी trunk पर चढ़ न सकें)। एक 8 m spatial hash प्रति-frame test को player के 3×3 neighborhood तक सीमित रखता है, आम तौर पर शून्य से छह props तक।</p>
<p>दो design फ़ैसलों ने system को संगत रखा। Terrain alignment code में hard-code किया हुआ कोई category enum नहीं, बल्कि एक manifest flag है, इसलिए ghost preview और committed placement एक ही <code>placement.alignToTerrain</code> value पढ़ते हैं और आपस में असहमत नहीं हो सकते। और रखे गए props terrain edits पर एक helper के ज़रिए react करते हैं: किसी brush stroke के बाद (local हो या किसी peer से replay हुआ), <code>refreshPlacementsInRadius</code> प्रभावित disc के अंदर हर prop के नीचे की ज़मीन फिर से sample करता है, alignment दोबारा लगाता है, और collider endpoints दोबारा निकालता है। किसी tree के नीचे एक पहाड़ी sculpt कीजिए और tree उसके साथ ऊपर चढ़ जाता है। Persistence और multiplayer spike 31 के pattern को हूबहू दोहराते हैं, <code>{uid, propId, x, y, z, rotY, scale}</code> की एक flat list रखते हैं और place, remove तथा nudge events को BroadcastChannel पर mirror करते हैं।</p>
<h2 id="इस-अध्याय-में-संदर्भित-तकनीक" tabindex="-1">इस अध्याय में संदर्भित तकनीक <a class="header-anchor" href="#इस-अध्याय-में-संदर्भित-तकनीक" aria-label="Permalink to &quot;इस अध्याय में संदर्भित तकनीक&quot;"></a></h2>
<p><strong>WebGPU के अंदर ES module decomposition।</strong> एक monolithic <code>&lt;script type=&quot;module&quot;&gt;</code> को bare-path <code>.mjs</code> imports में तोड़ने के लिए किसी bundler की ज़रूरत नहीं होती, जब modules static assets के रूप में serve होते हैं, और three.js TSL module boundaries के आर-पार ठीक चलता है। छुपी हुई लागत है initialization order: एक monolith &quot;Y से पहले X बनाओ&quot; को top-to-bottom script order में दर्ज करता है, जबकि modules import order में evaluate होते हैं, जो किसी GPU bind-group factory को उसके buffer के मौजूद होने से पहले चला सकता है। Fix का pattern है lazy initialization (पहली बार इस्तेमाल पर <code>getOrCreate...</code>) और declaration order पर भरोसा करने के बजाय सही promise का इंतज़ार करना।</p>
<p><strong>embedded PBR वाला glTF बनाम manual mapping वाला FBX।</strong> glTF meters में आता है, अपनी ही textures को reference करता है, और सीधे <code>MeshStandardMaterial</code> देता है, इसलिए glTF के रूप में authored कोई CC0 pack सीधा PBR pipeline में गिर जाता है। texture-binding metadata के बिना FBX packs को एक हाथ से संभाली गई material-name-to-PNG table चाहिए जो हर pack update पर खिसक जाती है, साथ में एक Phong-to-Standard conversion और manual color-space tagging। एक foliage safety net बिना <code>alphaTest</code> वाले <code>transparent</code> materials को <code>alphaTest: 0.5</code> cutout cards में बढ़ा देता है ताकि वे opaque geometry के पीछे ठीक से sort हों।</p>
<p><strong>WebGPU offscreen thumbnails।</strong> <code>canvas.toDataURL()</code> किसी <code>GPUCanvasContext</code>-backed canvas के लिए खाली लौटाता है क्योंकि presentation surface से वापस किसी 2D context तक कोई रास्ता नहीं है। एक <code>RenderTarget</code> में render करना, <code>readRenderTargetPixelsAsync</code> से pixels पढ़ना, और एक 2D canvas में blit करना काम करता है, जब तक कि blit WebGPU के 256-byte-aligned read-back stride पर चले। नतीजे <code>localStorage</code> में एक version-bumped key के नीचे cache होते हैं ताकि pack बदलने पर पुराने renders रद्द हो जाएँ।</p>
<p><strong>analytic heightmap के ख़िलाफ़ adaptive ray-march।</strong> जब terrain vertices एक GPU <code>StorageBufferAttribute</code> में बसते हैं, तो CPU raycaster उन्हें नहीं देख पाता। analytic height function के साथ march करना, surface से दूर बड़े stride के साथ, उसके पास छोटे stride के साथ, और <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.869ex;" xmlns="http://www.w3.org/2000/svg" width="16.358ex" height="2.566ex" role="img" focusable="false" viewBox="0 -750 7230.4 1134.3" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(389,0)"><g data-mml-node="mtext"><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(392,0)" style="stroke-width: 3;"/><path data-c="79" d="M69 -66Q91 -66 104 -80T118 -116Q118 -134 109 -145T91 -160Q84 -163 97 -166Q104 -168 111 -168Q131 -168 148 -159T175 -138T197 -106T213 -75T225 -43L242 0L170 183Q150 233 125 297Q101 358 96 368T80 381Q79 382 78 382Q66 385 34 385H19V431H26L46 430Q65 430 88 429T122 428Q129 428 142 428T171 429T200 430T224 430L233 431H241V385H232Q183 385 185 366L286 112Q286 113 332 227L376 341V350Q376 365 366 373T348 383T334 385H331V431H337H344Q351 431 361 431T382 430T405 429T422 429Q477 429 503 431H508V385H497Q441 380 422 345Q420 343 378 235T289 9T227 -131Q180 -204 113 -204Q69 -204 44 -177T19 -116Q19 -89 35 -78T69 -66Z" transform="translate(892,0)" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(1453,-239.4) scale(0.707)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(2460.7,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(3460.9,0)"><g data-mml-node="mtext"><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(389,0)" style="stroke-width: 3;"/><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(833,0)" style="stroke-width: 3;"/><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(1225,0)" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(1617,0)" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(2117,0)" style="stroke-width: 3;"/><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(2395,0)" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(2984,-150) scale(0.707)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(6841.4,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo stretchy="false">(</mo><msub><mtext>ray</mtext><mi>y</mi></msub><mo>−</mo><msub><mtext>terrain</mtext><mi>y</mi></msub><mo stretchy="false">)</mo></math></mjx-assistive-mml></mjx-container> के चिह्न पलटने पर एक binary-search refinement के साथ, samples की एक सीमित संख्या में sub-millimeter cursor precision देता है। यही primitive brush cursor और prop ghost दोनों को चलाती है।</p>
<p><strong>spatial hash के साथ primitive capsule colliders।</strong> हर prop अपने bounding box से एक category-derived capsule या sphere में सिमटता है, <code>{kind, walkable, radius, p1, p2}</code> के रूप में दर्ज होता है, और हर 8 m hash bucket में register होता है जिससे वह overlap करता है। प्रति frame player सिर्फ़ अपने 3×3 bucket neighborhood के props test करता है, हर एक के लिए एक capsule-vs-capsule resolution। Walkable proxies (rocks, logs) को सिर्फ़ vertical push मिलता है, blocking proxies (trees) को पूरा 3D push। जिस capsule गणित पर यह टिका है उसके लिए <a href="/hi/guides/landscape-generation-browser.html#physics-on-sdf-terrain">SDF terrain collisions</a> देखिए।</p>
<hr>
<p>29 में से भाग 16।
पिछला: <a href="/hi/blog/2026-04-13-open-world-browser-part-15-multiplayer-and-water.html">भाग 15 - Baseline बदलिए, फिर उसे sync कीजिए</a>
अगला: <a href="/hi/blog/2026-05-01-open-world-browser-part-17-animations-and-search.html">भाग 17 - वे animations जिन्हें retargeting की ज़रूरत नहीं पड़ी, और एक live asset search</a>
सीरीज़ गाइड: <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">/hi/blog/2026-02-25-open-world-browser-series-guide</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[2022 में गेमिंग को लेकर मैंने चार दांव लगाए थे। वे कैसे टिक रहे हैं।]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-04-24-2022-predictions-aging-well</link>
            <guid>https://app.cinevva.com/hi/blog/2026-04-24-2022-predictions-aging-well</guid>
            <pubDate>Fri, 24 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[2022 के एक इंटरव्यू में मैंने WebGL game engines, संवादों के लिए GPT-3, रियल-टाइम क्रिएटिव collab और indie की बढ़त की बात कही थी। चार साल बाद, हर एक कहाँ पहुँचा यह यहाँ है।]]></description>
            <content:encoded><![CDATA[<h1 id="_2022-में-गेमिंग-को-लेकर-मैंने-चार-दांव-लगाए-थे।-वे-कैसे-टिक-रहे-हैं।" tabindex="-1">2022 में गेमिंग को लेकर मैंने चार दांव लगाए थे। वे कैसे टिक रहे हैं। <a class="header-anchor" href="#_2022-में-गेमिंग-को-लेकर-मैंने-चार-दांव-लगाए-थे।-वे-कैसे-टिक-रहे-हैं।" aria-label="Permalink to &quot;2022 में गेमिंग को लेकर मैंने चार दांव लगाए थे। वे कैसे टिक रहे हैं।&quot;"></a></h1>
<p><em><a href="/hi/about.html">Mariana Muntean</a> द्वारा, Cinevva की CEO</em></p>
<img src="/img/blog/tech-done-different.jpg" alt="Tech Done Different podcast interview, May 2022" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>मई 2022 में मैं Ted Harrington के <em>Tech Done Different</em> podcast के लिए एक इंटरव्यू में बैठी थी। उसका मूल लेख <a href="https://medium.com/@vio-202020/interview-with-tech-done-different-3b9bf74d99c2" target="_blank" rel="noreferrer">अब भी Medium पर मौजूद है</a>। तब तक मैं करीब दो साल से Cinevva चला रही थी। हमारे पास पाँच लोग थे, $200K जुटाया हुआ था, दीवार पर एक Mozilla Builders अवॉर्ड था, और game development किस ओर जा रहा है इसको लेकर बहुत सारी राय थीं।</p>
<p>उनमें से ज़्यादातर राय 2022 में फैशन में नहीं थीं। Web3 का शोर था, AAA studios बातचीत के मालिक थे, GPT-3 एक रिसर्च खिलौना था, और WebGL वह चीज़ थी जिससे शौकिया लोग jam games बनाते थे। &quot;कोई भी क्रिएटिव game developer बन सकता है&quot; ज़ोर से कहने पर सिर्फ़ शिष्टाचार में सिर हिलते थे, एक भी चेक नहीं मिलता था।</p>
<p>पिछले हफ़्ते मैंने वह इंटरव्यू फिर से पढ़ा। मैंने जो कुछ कहा था, उसका कुछ हिस्सा अब केवल मन की कामना जैसा लगता है। कुछ हिस्सा ऐसा लगता है जैसे मेरे पास टाइम मशीन रही हो। यहाँ वे चार दांव हैं जो सबसे अच्छे ढंग से टिके, और हर एक के साथ 2026 असल में कैसा दिखता है।</p>
<h2 id="दांव-1-game-engines-की-जगह-browser-में-है" tabindex="-1">दांव 1: Game engines की जगह browser में है <a class="header-anchor" href="#दांव-1-game-engines-की-जगह-browser-में-है" aria-label="Permalink to &quot;दांव 1: Game engines की जगह browser में है&quot;"></a></h2>
<p>2022 में मैंने यह कहा था:</p>
<blockquote>
<p>WebGL technology को mobile devices समेत कई platforms पर इस्तेमाल किया जा सकता है, उन दूसरे APIs के उलट जो शायद सिर्फ़ PCs तक सीमित हों। तो चाहे आप घर के आराम में हों या चलते-फिरते, आप फिर भी बना और पब्लिश कर सकते हैं। WebGL games एक पारंपरिक PC game की ज़रूरत के मुक़ाबले CPU और GPU की सिर्फ़ एक छोटी सी मात्रा इस्तेमाल करते हैं।</p>
</blockquote>
<p>2022 में यह एक उलटा दांव था। बड़े engines सब के सब downloads, installs और patch cycles मानकर चलते थे। Browser games का मतलब था Flash की पुरानी यादें और Friv।</p>
<p>2026 में हमारा <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">open-world engine एक browser tab में 120 FPS पर चलता है</a>। Terrain, पेड़, physics, multiplayer sync, सब एक ही URL में। कोई download नहीं, कोई app store नहीं, कोई install नहीं।</p>
<img src="/img/blog/open-world-browser-120fps.png" alt="The Cinevva open-world running at 120 FPS in a browser tab, with terrain, trees, physics, and a player capsule rendered in a single tab" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>Browser ने इसलिए रफ़्तार पकड़ी क्योंकि तीन चीज़ें एक साथ आ गईं। WebGPU हर बड़े browser में आ गया। SharedArrayBuffer और cross-origin isolation भरोसेमंद हो गए। WebAssembly इतना तेज़ हो गया कि Rust से compile हुए असली physics engines चला सके। हमारी टीम ने इनमें से हर कदम की असल लागत पर <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">12 हिस्सों की एक फ़ील्ड जर्नल पब्लिश की</a>। इसका सार यह है कि browser अब एक असली game runtime है, न कि वह जगह जहाँ आप असली game का demo रखते हैं।</p>
<p>इस दांव के अंदर एक दांव मुझसे छूट गया: मैंने यह कम आँका कि कितना काम engineering culture वाले हिस्से पर होगा। Browser game engines को अब browsers नहीं रोकते। उन्हें यह मान्यता रोकती है कि एक असली game का एक launcher होना चाहिए।</p>
<h2 id="दांव-2-ai-pipeline-का-हिस्सा-है-कोई-साइड-फ़ीचर-नहीं" tabindex="-1">दांव 2: AI pipeline का हिस्सा है, कोई साइड फ़ीचर नहीं <a class="header-anchor" href="#दांव-2-ai-pipeline-का-हिस्सा-है-कोई-साइड-फ़ीचर-नहीं" aria-label="Permalink to &quot;दांव 2: AI pipeline का हिस्सा है, कोई साइड फ़ीचर नहीं&quot;"></a></h2>
<p>2022 में मैंने यह कहा था:</p>
<blockquote>
<p>हमारा platform बेहतरीन तरीके से काम करे इसके लिए हम open source game tools इस्तेमाल करते हैं, लेकिन Natural Language Processing, Computer Vision और Open AI solutions, जैसे संवादों के लिए GPT3 और text to image generation के लिए DALL:E, का उपयोग करते हुए अपनी तकनीक भी बनाते हैं।</p>
</blockquote>
<p>मई 2022 में GPT-3 एक paid API था जिसे ज़्यादातर लोगों ने कभी इस्तेमाल नहीं किया था। DALL·E मुश्किल से एक साल पुराना था और wait-list पर था। यह कहना कि हम इन्हें production game-dev tools की तरह इस्तेमाल करेंगे, बेहतर से बेहतर मानें तो एक महत्वाकांक्षी नाटक था।</p>
<p>2026 में हर गंभीर क्रिएटिव pipeline में language models और image generation मौजूद हैं, हमारी भी। आज Cinevva के अंदर: soundtracks के लिए ElevenLabs Music, effects के लिए ElevenLabs SFX, assets के लिए Hunyuan3D और SAM3D, visuals के लिए Flux, adaptive audio के लिए Mubert, instrumentation के लिए AceStep। Prompts अंदर जाते हैं, काम लायक assets बाहर आते हैं, और यह सब editor के अंदर ही होता है।</p>
<img src="/img/blog/prompting-3d-games.png" alt="Prompt-driven 3D asset generation inside the Cinevva editor" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>इसके सबूत GDC 2026 की <em>State of the Game Industry</em> रिपोर्ट में हैं। <a href="/hi/signals/2026-03-28-the-52-52-split.html">52% game companies कहती हैं कि generative AI production में इस्तेमाल हो रहा है</a>। वही 52% developers कहते हैं कि AI का इस्तेमाल इंडस्ट्री पर नकारात्मक असर डाल रहा है। दोनों आँकड़े सच हैं। बात यह है कि अंदरूनी तकनीक इतनी तेज़ी से ज़रूरी बन गई जितना कोई मानना नहीं चाहता था।</p>
<p>मुझसे जो ग़लत हुआ: मैंने सोचा था कि विरोध उन engineers से आएगा जो क्वालिटी को लेकर चिंतित हैं। ज़्यादातर विरोध उन artists से आया जो नौकरियों को लेकर चिंतित थे। वह बातचीत <a href="/hi/signals/2026-03-16-when-ai-overrides-the-artist.html">मेरी उम्मीद से कहीं ज़्यादा उलझी हुई</a> है, और जो लोग इसे एक साफ़-सुथरी जीत मानते हैं वे ध्यान नहीं दे रहे।</p>
<h2 id="दांव-3-game-development-को-google-docs-जैसी-collaboration-चाहिए" tabindex="-1">दांव 3: Game development को Google-Docs जैसी collaboration चाहिए <a class="header-anchor" href="#दांव-3-game-development-को-google-docs-जैसी-collaboration-चाहिए" aria-label="Permalink to &quot;दांव 3: Game development को Google-Docs जैसी collaboration चाहिए&quot;"></a></h2>
<p>2022 में मैंने यह कहा था:</p>
<blockquote>
<p>Source control और app versions के साथ काम अक्सर remote collaboration से जुड़ा होता है। आज ऐसा करने के लिए आपको पता होना चाहिए कि कहाँ जाना है, application का कौन सा version download करना है, सबके साथ in sync रहना है, भगवान न करे कि टीम का कोई सदस्य app के ग़लत version पर हो, तो यह एक समस्या बन जाती है। हमारा लक्ष्य Google doc जैसी क़रीब-क़रीब रियल-टाइम वाली अनुभूति है: सरल, आसान लेकिन मज़ेदार।</p>
</blockquote>
<p>Code tools में रियल-टाइम collaboration 2022 में एक हाशिये का विचार था। Replit के पास यह था। VS Code Live Share मौजूद था। ज़्यादातर professional engines के लिए Perforce, एक VPN और एक senior engineer चाहिए था जो आपकी branch की देखभाल करे।</p>
<p>2026 में रियल-टाइम collab हर उस क्रिएटिव tool के लिए डिफ़ॉल्ट है जो गंभीरता से लिया जाना चाहता है। Figma ने इसे design के लिए सामान्य बना दिया। Cursor और Bolt ने इसे code के लिए सामान्य बना दिया। Lovable ने इसे app prototyping के लिए सामान्य बना दिया। Game engines अगुआ नहीं, पिछड़ने वाले थे।</p>
<img src="/img/blog/open-world-chunk-streaming.png" alt="Streaming chunks of an open-world game between players in real time" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>अपने ही engine के अंदर हमारे पास अब multiplayer sync एक <a href="/hi/blog/2026-02-25-open-world-browser-part-04-streaming-before-fancy.html">first-class spike</a> के रूप में काम कर रहा है, जिसमें chunk streaming, presence और browser में shared state है। अनुभव &quot;लिंक खोलो, अंदर कूदो&quot; के ज़्यादा क़रीब है, बजाय &quot;Perforce सेट करो, Slack पर सही version पूछो, launcher install करो&quot; के।</p>
<p>जो हिस्सा मैंने कम आँका: games में रियल-टाइम collab का सबसे मुश्किल हिस्सा networking नहीं है। यह क्रिएटिव इरादे पर conflict resolution है। एक ही level को एक ही समय पर दो लोगों का एडिट करना sync की समस्या से पहले एक UX समस्या है, और ज़्यादातर tools ने इसे अभी तक हल नहीं किया है।</p>
<h2 id="दांव-4-भविष्य-indie-है" tabindex="-1">दांव 4: भविष्य indie है <a class="header-anchor" href="#दांव-4-भविष्य-indie-है" aria-label="Permalink to &quot;दांव 4: भविष्य indie है&quot;"></a></h2>
<p>2022 में मैंने यह कहा था:</p>
<blockquote>
<p>जो क्रिएटिव लोग game content नहीं बना पा रहे थे, वे बना पाएँगे। हम इसके भरपूर नए तरीके खोजेंगे कि लोग क्रिएटिविटी को कैसे देखते और व्यक्त करते हैं। इस बार यह प्रक्रिया सिर्फ़ corporations या बड़े AAA studios के हाथ में नहीं होगी। भविष्य indie है।</p>
</blockquote>
<p>यह इंटरव्यू की सबसे रोमानी पंक्ति थी, और 2022 में सबसे आसानी से खारिज की जाने वाली। AAA बजट कभी इतने ऊँचे नहीं रहे थे। Indie projects को दिखाई देने में कभी इतनी मुश्किल नहीं हुई थी। गणित ऐसा लग रहा था जैसे वह दूसरी तरफ़ जा रहा हो।</p>
<p>2026 में गणित पलट गया। हमने <a href="/hi/blog/2026-02-18-a-breaker-belt.html">A Breaker Belt</a> तीन दिन में, दो लोगों ने, एक ही codebase से web, mobile और PC पर बनाया। पहले इसमें एक छोटी टीम को एक तिमाही लगती थी। <a href="/hi/signals/2026-03-23-solo-devs-shipping-not-vibing.html">Solo developers सिर्फ़ vibing नहीं, शिप कर रहे हैं</a>, और Steam Next Fest 2026 में एक-एक व्यक्ति की टीमों से रिकॉर्ड entries आईं।</p>
<img src="/img/social/industry-solo-dev-shipping.png" alt="Solo developers shipping production-quality games using AI tooling and browser engines" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>यह पता लगाने की लागत कि कोई अजीब विचार काम करता है या नहीं, ढह गई है। यही असली बदलाव है, और बाकी सब, pipeline में AI, runtime के रूप में browser, रियल-टाइम collab, इसी की सेवा में है। सही tooling वाले एक solo developer के पास अब वह production क्षमता है जो 2018 में एक 20 लोगों के studio के पास थी।</p>
<p>2022 में जो बात मैंने काफ़ी साफ़ ढंग से नहीं देखी: रुकावट production से discovery की ओर खिसक जाती है। जब हर कोई शिप कर सकता है, तो ढूँढा जाना मुश्किल समस्या बन जाती है। यही दांवों का अगला समूह है, और हम उन्हें लगाने के बीच में हैं।</p>
<h2 id="जो-मैंने-जानबूझकर-ग़लत-रखा" tabindex="-1">जो मैंने जानबूझकर ग़लत रखा <a class="header-anchor" href="#जो-मैंने-जानबूझकर-ग़लत-रखा" aria-label="Permalink to &quot;जो मैंने जानबूझकर ग़लत रखा&quot;"></a></h2>
<p>2022 के कुछ दांव अब भी लंबित हैं या उनमें सुधार की ज़रूरत है।</p>
<p>उस इंटरव्यू में Web3 वाला कोण जितना होना चाहिए था उससे ज़्यादा ज़ोरदार था। Encryption और zero-knowledge proof वाला हिस्सा एक content-rights primitive के तौर पर टिकता है। Token-and-marketplace वाला ढाँचा ख़राब ढंग से टिका, और 2022 में मैंने इसे जितनी ऊर्जा दी, वह AI tooling पर बेहतर लगती, जहाँ असली फ़ायदा था।</p>
<p>मैंने यह भी कम आँका कि &quot;कोई भी game बना सकता है&quot; का कितना हिस्सा एक discovery और distribution की समस्या है, न कि tooling की समस्या। बनाना अब आसान है। ढूँढा जाना और पैसा कमाना अब भी मुश्किल हैं, और आज हमारा ज़्यादातर काम वहीं जाता है।</p>
<p>यही वह दांव है जो हम अभी लगा रहे हैं। हमने अभी-अभी <a href="/hi/play.html">cinevva.com/play</a> पर एक TikTok-जैसी reels feed शिप की है। असली gameplay की वर्टिकल-स्वाइप क्लिप्स, हर एक पंद्रह सेकंड की, कोई trailers नहीं और कोई marketing footage नहीं। अगर कुछ आपकी नज़र में आता है, तो एक tap और आप उसे अपने browser में खेल रहे होते हैं। कोई download नहीं, कोई install नहीं, आपके और game के बीच कोई tutorial खड़ा नहीं।</p>
<p>indie developers के लिए यह क्यों मायने रखता है इसका कारण कठोर गणित है। Steam Next Fest 2026 में रिकॉर्ड संख्या में entries आईं, जो शानदार लगता है जब तक आप per-game attention budget न जोड़ें। ज़्यादातर demos को एक हज़ार से कम impressions मिले। AI के इसे और ख़राब करने से पहले ही store-page funnel टूटा हुआ था। एक scroll-and-swipe सतह, जहाँ gameplay ही विज्ञापन है, discovery loop को एक ही गति में समेट देती है। यह solo developers को players के सामने उसी तरह रखती है जैसे TikTok अनजान संगीतकारों को श्रोताओं के सामने रखता है। यही वह छूटा हुआ टुकड़ा है जो &quot;कोई भी शिप कर सकता है&quot; और &quot;कोई भी सफल हो सकता है&quot; के बीच में है।</p>
<p>अगर आप मूल इंटरव्यू पूरा पढ़ना चाहते हैं, <a href="https://medium.com/@vio-202020/interview-with-tech-done-different-3b9bf74d99c2" target="_blank" rel="noreferrer">तो वह यहाँ है</a>। उसे फिर से पढ़ना काम का रहा। 2022 में हमने ज़ोर से जो कुछ कहा था, उसका ज़्यादातर हिस्सा एक काम करने वाला roadmap निकला, बस हमारी सोच से तेज़ रफ़्तार पर।</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ब्राउज़र में open world बनाना, भाग 13: Terrain sculpting और math function की मौत]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-04-13-open-world-browser-part-13-terrain-sculpting</link>
            <guid>https://app.cinevva.com/hi/blog/2026-04-13-open-world-browser-part-13-terrain-sculpting</guid>
            <pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[तीन झूठी शुरुआतें, एक फटता हुआ mesh, और एक seam bug जिसने हमें फिर से सोचने पर मजबूर किया कि terrain data कैसे काम करता है।]]></description>
            <content:encoded><![CDATA[<h1 id="ब्राउज़र-में-open-world-बनाना-भाग-13-terrain-sculpting-और-math-function-की-मौत" tabindex="-1">ब्राउज़र में open world बनाना, भाग 13: Terrain sculpting और math function की मौत <a class="header-anchor" href="#ब्राउज़र-में-open-world-बनाना-भाग-13-terrain-sculpting-और-math-function-की-मौत" aria-label="Permalink to &quot;ब्राउज़र में open world बनाना, भाग 13: Terrain sculpting और math function की मौत&quot;"></a></h1>
<p><em>लिखा है <a href="/hi/about.html">Oleg Sidorkin</a> ने, Cinevva के CTO और को-फाउंडर</em></p>
<p>यहाँ नए हैं? <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">सीरीज़ गाइड</a> देखिए। यह बताती है कि spike क्या होता है और सारे भागों के लिंक देती है।</p>
<p>बारह भागों तक हमने एक terrain engine बनाया जिसे आप देख सकते थे। उसके ऊपर उड़ सकते थे। seams को न फटते देख तारीफ़ कर सकते थे। इस बार हम उसे छूना चाहते थे।</p>
<p>लक्ष्य आसान लग रहा था: एक player को real time में brush से terrain sculpt करने दो, और उन सिस्टम्स में से किसी को न तोड़ो जिन्हें बनाने में हमने 24 spikes लगाए। इसमें तीन कोशिशें लगीं, दो ऐसे bugs जो rendering failures जैसे दिखते थे पर असल में data model failures थे, और इस पर एक बुनियादी फिर से सोच कि terrain data को कैसे काम करना चाहिए।</p>
<h2 id="तीन-झूठी-शुरुआतें" tabindex="-1">तीन झूठी शुरुआतें <a class="header-anchor" href="#तीन-झूठी-शुरुआतें" aria-label="Permalink to &quot;तीन झूठी शुरुआतें&quot;"></a></h2>
<p>Spike 25 आसान वाला होना चाहिए था। production codebase में पहले से एक raycaster था जो terrain meshes को hit करता है। placement tool उसे objects गिराने के लिए इस्तेमाल करता है। एक brush tool उसी shape को follow करता है, बस वह heightmap values को बदलता है, prefab spawn करने के बजाय। आसान।</p>
<p>कोशिश एक: मैंने इसे सीधे production <code>world/client/</code> TypeScript code में बनाया। नया <code>terrain-brush.ts</code>, <code>chunk.ts</code> में बदलाव, protocol changes, Vue component updates. एक घंटे के भीतर मेरे पास एक brush था जो कुछ-कुछ काम करता था, पर chunk boundaries पर दिखने वाली normal discontinuities थीं। मैं बता नहीं सकता था कि bug मेरे brush code में था, मौजूदा chunk stitching में, या full render loop के साथ किसी interaction में। यह ठीक वही स्थिति है जिसे रोकने के लिए spike methodology मौजूद है। मैंने नियम छोड़ दिया था और तुरंत उसकी कीमत चुकाई। सब कुछ revert कर दिया।</p>
<p>कोशिश दो: standalone spike, पर मैंने Three.js 0.170.0 और WebGL की तरफ़ हाथ बढ़ाया। production code WebGL इस्तेमाल करता है, तो यह natural लगा। पर Spikes 13-24 सब WebGPU पर शिफ़्ट हो चुके थे। एक WebGL brush spike बनाना यह साबित करता कि वह legacy renderer पर काम करता है, उस वाले पर नहीं जिसकी तरफ़ हम migrate कर रहे हैं। ग़लत दिशा। फिर से शुरू।</p>
<p>कोशिश तीन: WebGPU, <code>WebGPURenderer</code>, vertex generation के लिए compute shader, Spike 22 stack से मेल खाता हुआ। इस बार architecture सही था। पाँच brush operations काम कर रहे थे: raise, lower, smooth, flatten, noise. M1 पर brush cycle P95 4ms से कम।</p>
<p>और seam bug अब भी वहीं था।</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/25-heightmap-brush/" title="Spike 25 Heightmap Brush" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/25-heightmap-brush/" target="_blank">Spike 25 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=25-heightmap-brush">सोर्स देखें</a></p>
<h2 id="वह-seam-bug-जो-मरता-ही-नहीं-था" tabindex="-1">वह seam bug जो मरता ही नहीं था <a class="header-anchor" href="#वह-seam-bug-जो-मरता-ही-नहीं-था" aria-label="Permalink to &quot;वह seam bug जो मरता ही नहीं था&quot;"></a></h2>
<p>cross-chunk normal computation का standard fix है border overlap: हर chunk अपने neighbors से data का एक extra ring स्टोर करता है, ताकि boundary पर normal calculation दोनों तरफ़ से sample कर सके। मैंने वह किया। neighbor edge data को एक expanded buffer में copy किया। seams फिर भी फटते रहे।</p>
<p>मैंने math में गहराई से देखा। chunk A (cx=-1) और chunk B (cx=0) के बीच की boundary पर, दोनों chunks को shared vertex पर एक ही normal compute करनी थी। chunk A के shader ने <code>mix(own_col31, own_col32, 0.85)</code> sample किया। chunk B ने <code>mix(neighbor_edge, own_col0, 0.85)</code> sample किया। ये अलग-अलग data के ज़रिए अलग-अलग bilinear interpolation paths हैं। सही border data के बावजूद, दोनों chunks एक ही point के लिए अलग normals compute करते हैं।</p>
<p>यही वह पल था जब मुझे समझ आया कि असली bug border copy नहीं था। असली bug data model था।</p>
<p>1 से 24 तक का हर spike <code>height_at()</code> नामक एक procedural math function इस्तेमाल करता था। उसे world coordinates दो, height पाओ। साफ़, global, stateless. brush एक math function को बदल नहीं सकता था, इसलिए मैंने ऊपर एक <code>displacement</code> buffer जोड़ा था। terrain अब <code>height_at(x,z) + displacement[i]</code> था। GPU shader में base terrain के लिए 30 lines के noise functions plus displacement overlay के लिए bilinear interpolation code embedded था। flatten brush को यह पता करने के लिए <code>height_at()</code> घटाना पड़ता था कि कौन-सी displacement value target height बनाएगी। दो सिस्टम, एक के ऊपर एक रखे हुए, अलग sampling strategies के साथ अलग चीज़ें compute करते हुए।</p>
<p>असली game ऐसे काम नहीं करता। production में, authored terrain buffers में स्टोर किया गया sampled data होता है। procedural function शुरुआती spikes से एक सुविधाजनक stand-in थी। उसने अपना काम कर दिया था। अब वह सक्रिय रूप से bugs पैदा कर रही थी।</p>
<p>मैंने उसे मार दिया।</p>
<p>अब हर chunk के पास असली height values वाला एक <code>heightmap</code> Float32Array है। creation पर, procedural noise उसे भरता है। उसके बाद, noise function फिर कभी call नहीं होता। brush stored heights को सीधे बदलता है। GPU shader एक buffer से एक function का इस्तेमाल करके पढ़ता है: <code>hm_at(i,j)</code>. Normals उसी data पर grid-aligned central differences इस्तेमाल करते हैं। कोई bilinear interpolation ambiguity नहीं। कोई two-system mismatch नहीं। shader 90 lines से 40 lines पर आ गया।</p>
<p>seams ख़ुद ठीक हो गए। shared edge पर दोनों chunks अब अपने-अपने buffers से एक ही discrete height values पढ़ते हैं (border overlap में सही neighbor interior points के साथ)। एक ही data अंदर, एक ही normals बाहर।</p>
<p>यह brush का सबक़ नहीं था। यह data architecture का सबक़ था जिसे brush ने उजागर कर दिया।</p>
<h2 id="फटता-हुआ-mesh" tabindex="-1">फटता हुआ mesh <a class="header-anchor" href="#फटता-हुआ-mesh" aria-label="Permalink to &quot;फटता हुआ mesh&quot;"></a></h2>
<p>Spike 26 इसका volumetric समकक्ष था। एक 64-cubed SDF volume को brush से बदलो, फिर marching cubes से re-mesh करो। Spike 25 जैसा ही सवाल, पर 3D में।</p>
<p>जब मैंने इसे पहली बार चलाया, mesh फट गया। हर दिशा में लंबे spikes निकल रहे थे, जैसे एक sea urchin का दिन ख़राब चल रहा हो।</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/26-sdf-brush/" title="Spike 26 SDF Brush" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/26-sdf-brush/" target="_blank">Spike 26 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=26-sdf-brush">सोर्स देखें</a></p>
<p>मैंने जो MC case table generate की थी उसमें 4096 के बजाय 3840 entries थीं। पूरी table है <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.186ex;" xmlns="http://www.w3.org/2000/svg" width="26.441ex" height="1.756ex" role="img" focusable="false" viewBox="0 -694 11687 776" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mn"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/><path data-c="35" d="M164 157Q164 133 148 117T109 101H102Q148 22 224 22Q294 22 326 82Q345 115 345 210Q345 313 318 349Q292 382 260 382H254Q176 382 136 314Q132 307 129 306T114 304Q97 304 95 310Q93 314 93 485V614Q93 664 98 664Q100 666 102 666Q103 666 123 658T178 642T253 634Q324 634 389 662Q397 666 402 666Q410 666 410 648V635Q328 538 205 538Q174 538 149 544L139 546V374Q158 388 169 396T205 412T256 420Q337 420 393 355T449 201Q449 109 385 44T229 -22Q148 -22 99 32T50 154Q50 178 61 192T84 210T107 214Q132 214 148 197T164 157Z" transform="translate(500,0)" style="stroke-width: 3;"/><path data-c="36" d="M42 313Q42 476 123 571T303 666Q372 666 402 630T432 550Q432 525 418 510T379 495Q356 495 341 509T326 548Q326 592 373 601Q351 623 311 626Q240 626 194 566Q147 500 147 364L148 360Q153 366 156 373Q197 433 263 433H267Q313 433 348 414Q372 400 396 374T435 317Q456 268 456 210V192Q456 169 451 149Q440 90 387 34T253 -22Q225 -22 199 -14T143 16T92 75T56 172T42 313ZM257 397Q227 397 205 380T171 335T154 278T148 216Q148 133 160 97T198 39Q222 21 251 21Q302 21 329 59Q342 77 347 104T352 209Q352 289 347 316T329 361Q302 397 257 397Z" transform="translate(1000,0)" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(1500,0)"><path data-c="A0" d="" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(1750,0)"><path data-c="63" d="M370 305T349 305T313 320T297 358Q297 381 312 396Q317 401 317 402T307 404Q281 408 258 408Q209 408 178 376Q131 329 131 219Q131 137 162 90Q203 29 272 29Q313 29 338 55T374 117Q376 125 379 127T395 129H409Q415 123 415 120Q415 116 411 104T395 71T366 33T318 2T249 -11Q163 -11 99 53T34 214Q34 318 99 383T250 448T370 421T404 357Q404 334 387 320Z" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(444,0)" style="stroke-width: 3;"/><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" transform="translate(944,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(1338,0)" style="stroke-width: 3;"/><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" transform="translate(1782,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(4148.2,0)"><path data-c="D7" d="M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(5148.4,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/><path data-c="36" d="M42 313Q42 476 123 571T303 666Q372 666 402 630T432 550Q432 525 418 510T379 495Q356 495 341 509T326 548Q326 592 373 601Q351 623 311 626Q240 626 194 566Q147 500 147 364L148 360Q153 366 156 373Q197 433 263 433H267Q313 433 348 414Q372 400 396 374T435 317Q456 268 456 210V192Q456 169 451 149Q440 90 387 34T253 -22Q225 -22 199 -14T143 16T92 75T56 172T42 313ZM257 397Q227 397 205 380T171 335T154 278T148 216Q148 133 160 97T198 39Q222 21 251 21Q302 21 329 59Q342 77 347 104T352 209Q352 289 347 316T329 361Q302 397 257 397Z" transform="translate(500,0)" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(6148.4,0)"><path data-c="A0" d="" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(6398.4,0)"><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" style="stroke-width: 3;"/><path data-c="6C" d="M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z" transform="translate(394,0)" style="stroke-width: 3;"/><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z" transform="translate(672,0)" style="stroke-width: 3;"/><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" transform="translate(1172,0)" style="stroke-width: 3;"/><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" transform="translate(1561,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(8631.2,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(9687,0)"><path data-c="34" d="M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z" style="stroke-width: 3;"/><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(500,0)" style="stroke-width: 3;"/><path data-c="39" d="M352 287Q304 211 232 211Q154 211 104 270T44 396Q42 412 42 436V444Q42 537 111 606Q171 666 243 666Q245 666 249 666T257 665H261Q273 665 286 663T323 651T370 619T413 560Q456 472 456 334Q456 194 396 97Q361 41 312 10T208 -22Q147 -22 108 7T68 93T121 149Q143 149 158 135T173 96Q173 78 164 65T148 49T135 44L131 43Q131 41 138 37T164 27T206 22H212Q272 22 313 86Q352 142 352 280V287ZM244 248Q292 248 321 297T351 430Q351 508 343 542Q341 552 337 562T323 588T293 615T246 625Q208 625 181 598Q160 576 154 546T147 441Q147 358 152 329T172 282Q197 248 244 248Z" transform="translate(1000,0)" style="stroke-width: 3;"/><path data-c="36" d="M42 313Q42 476 123 571T303 666Q372 666 402 630T432 550Q432 525 418 510T379 495Q356 495 341 509T326 548Q326 592 373 601Q351 623 311 626Q240 626 194 566Q147 500 147 364L148 360Q153 366 156 373Q197 433 263 433H267Q313 433 348 414Q372 400 396 374T435 317Q456 268 456 210V192Q456 169 451 149Q440 90 387 34T253 -22Q225 -22 199 -14T143 16T92 75T56 172T42 313ZM257 397Q227 397 205 380T171 335T154 278T148 216Q148 133 160 97T198 39Q222 21 251 21Q302 21 329 59Q342 77 347 104T352 209Q352 289 347 316T329 361Q302 397 257 397Z" transform="translate(1500,0)" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>256</mn><mtext> </mtext><mtext>cases</mtext><mo>×</mo><mn>16</mn><mtext> </mtext><mtext>slots</mtext><mo>=</mo><mn>4096</mn></math></mjx-assistive-mml></mjx-container>, पर मेरे पास <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.186ex;" xmlns="http://www.w3.org/2000/svg" width="15.964ex" height="1.717ex" role="img" focusable="false" viewBox="0 -677 7056 759" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mn"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/><path data-c="35" d="M164 157Q164 133 148 117T109 101H102Q148 22 224 22Q294 22 326 82Q345 115 345 210Q345 313 318 349Q292 382 260 382H254Q176 382 136 314Q132 307 129 306T114 304Q97 304 95 310Q93 314 93 485V614Q93 664 98 664Q100 666 102 666Q103 666 123 658T178 642T253 634Q324 634 389 662Q397 666 402 666Q410 666 410 648V635Q328 538 205 538Q174 538 149 544L139 546V374Q158 388 169 396T205 412T256 420Q337 420 393 355T449 201Q449 109 385 44T229 -22Q148 -22 99 32T50 154Q50 178 61 192T84 210T107 214Q132 214 148 197T164 157Z" transform="translate(500,0)" style="stroke-width: 3;"/><path data-c="36" d="M42 313Q42 476 123 571T303 666Q372 666 402 630T432 550Q432 525 418 510T379 495Q356 495 341 509T326 548Q326 592 373 601Q351 623 311 626Q240 626 194 566Q147 500 147 364L148 360Q153 366 156 373Q197 433 263 433H267Q313 433 348 414Q372 400 396 374T435 317Q456 268 456 210V192Q456 169 451 149Q440 90 387 34T253 -22Q225 -22 199 -14T143 16T92 75T56 172T42 313ZM257 397Q227 397 205 380T171 335T154 278T148 216Q148 133 160 97T198 39Q222 21 251 21Q302 21 329 59Q342 77 347 104T352 209Q352 289 347 316T329 361Q302 397 257 397Z" transform="translate(1000,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(1722.2,0)"><path data-c="D7" d="M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(2722.4,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/><path data-c="35" d="M164 157Q164 133 148 117T109 101H102Q148 22 224 22Q294 22 326 82Q345 115 345 210Q345 313 318 349Q292 382 260 382H254Q176 382 136 314Q132 307 129 306T114 304Q97 304 95 310Q93 314 93 485V614Q93 664 98 664Q100 666 102 666Q103 666 123 658T178 642T253 634Q324 634 389 662Q397 666 402 666Q410 666 410 648V635Q328 538 205 538Q174 538 149 544L139 546V374Q158 388 169 396T205 412T256 420Q337 420 393 355T449 201Q449 109 385 44T229 -22Q148 -22 99 32T50 154Q50 178 61 192T84 210T107 214Q132 214 148 197T164 157Z" transform="translate(500,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(4000.2,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(5056,0)"><path data-c="33" d="M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z" style="stroke-width: 3;"/><path data-c="38" d="M70 417T70 494T124 618T248 666Q319 666 374 624T429 515Q429 485 418 459T392 417T361 389T335 371T324 363L338 354Q352 344 366 334T382 323Q457 264 457 174Q457 95 399 37T249 -22Q159 -22 101 29T43 155Q43 263 172 335L154 348Q133 361 127 368Q70 417 70 494ZM286 386L292 390Q298 394 301 396T311 403T323 413T334 425T345 438T355 454T364 471T369 491T371 513Q371 556 342 586T275 624Q268 625 242 625Q201 625 165 599T128 534Q128 511 141 492T167 463T217 431Q224 426 228 424L286 386ZM250 21Q308 21 350 55T392 137Q392 154 387 169T375 194T353 216T330 234T301 253T274 270Q260 279 244 289T218 306L210 311Q204 311 181 294T133 239T107 157Q107 98 150 60T250 21Z" transform="translate(500,0)" style="stroke-width: 3;"/><path data-c="34" d="M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z" transform="translate(1000,0)" style="stroke-width: 3;"/><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(1500,0)" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>256</mn><mo>×</mo><mn>15</mn><mo>=</mo><mn>3840</mn></math></mjx-assistive-mml></mjx-container> थीं, case 112 से शुरू होकर सोलह missing rows. उस index के बाद हर lookup shift हो गई, इसलिए case number अब triangulation data से मेल नहीं खाता था। जब marching cubes ग़लत entry पढ़ता है, तो वह ऐसी edges बनाता है जहाँ दोनों endpoints surface के एक ही तरफ़ होते हैं। असली crossing edge पर interpolation parameter</p>
<mjx-container tabindex="0" class="MathJax" jax="SVG" display="true" style="direction: ltr; display: block; text-align: center; margin: 1em 0; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -1.909ex;" xmlns="http://www.w3.org/2000/svg" width="11.698ex" height="4.757ex" role="img" focusable="false" viewBox="0 -1259 5170.4 2102.8" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(638.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mfrac" transform="translate(1694.6,0)"><g data-mml-node="mrow" transform="translate(877.9,676)"><g data-mml-node="mo"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(778,0)"><g data-mml-node="mi"><path data-c="1D463" d="M173 380Q173 405 154 405Q130 405 104 376T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Q21 294 29 316T53 368T97 419T160 441Q202 441 225 417T249 361Q249 344 246 335Q246 329 231 291T200 202T182 113Q182 86 187 69Q200 26 250 26Q287 26 319 60T369 139T398 222T409 277Q409 300 401 317T383 343T365 361T357 383Q357 405 376 424T417 443Q436 443 451 425T467 367Q467 340 455 284T418 159T347 40T241 -11Q177 -11 139 22Q102 54 102 117Q102 148 110 181T151 298Q173 362 173 380Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(518,-150) scale(0.707)"><path data-c="1D44E" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z" style="stroke-width: 3;"/></g></g></g><g data-mml-node="mrow" transform="translate(220,-686)"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D463" d="M173 380Q173 405 154 405Q130 405 104 376T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Q21 294 29 316T53 368T97 419T160 441Q202 441 225 417T249 361Q249 344 246 335Q246 329 231 291T200 202T182 113Q182 86 187 69Q200 26 250 26Q287 26 319 60T369 139T398 222T409 277Q409 300 401 317T383 343T365 361T357 383Q357 405 376 424T417 443Q436 443 451 425T467 367Q467 340 455 284T418 159T347 40T241 -11Q177 -11 139 22Q102 54 102 117Q102 148 110 181T151 298Q173 362 173 380Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(518,-150) scale(0.707)"><path data-c="1D44F" d="M73 647Q73 657 77 670T89 683Q90 683 161 688T234 694Q246 694 246 685T212 542Q204 508 195 472T180 418L176 399Q176 396 182 402Q231 442 283 442Q345 442 383 396T422 280Q422 169 343 79T173 -11Q123 -11 82 27T40 150V159Q40 180 48 217T97 414Q147 611 147 623T109 637Q104 637 101 637H96Q86 637 83 637T76 640T73 647ZM336 325V331Q336 405 275 405Q258 405 240 397T207 376T181 352T163 330L157 322L136 236Q114 150 114 114Q114 66 138 42Q154 26 178 26Q211 26 245 58Q270 81 285 114T318 219Q336 291 336 325Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(1093.6,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(2093.8,0)"><g data-mml-node="mi"><path data-c="1D463" d="M173 380Q173 405 154 405Q130 405 104 376T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Q21 294 29 316T53 368T97 419T160 441Q202 441 225 417T249 361Q249 344 246 335Q246 329 231 291T200 202T182 113Q182 86 187 69Q200 26 250 26Q287 26 319 60T369 139T398 222T409 277Q409 300 401 317T383 343T365 361T357 383Q357 405 376 424T417 443Q436 443 451 425T467 367Q467 340 455 284T418 159T347 40T241 -11Q177 -11 139 22Q102 54 102 117Q102 148 110 181T151 298Q173 362 173 380Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(518,-150) scale(0.707)"><path data-c="1D44E" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z" style="stroke-width: 3;"/></g></g></g><rect width="3235.9" height="60" x="120" y="220"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="block" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; overflow: hidden; width: 100%;"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mi>t</mi><mo>=</mo><mfrac><mrow><mo>−</mo><msub><mi>v</mi><mi>a</mi></msub></mrow><mrow><msub><mi>v</mi><mi>b</mi></msub><mo>−</mo><msub><mi>v</mi><mi>a</mi></msub></mrow></mfrac></math></mjx-assistive-mml></mjx-container><p><mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="4.526ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 2000.7 1000" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="5B" d="M118 -250V750H255V710H158V-210H255V-250H118Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(278,0)"><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(778,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(1222.7,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(1722.7,0)"><path data-c="5D" d="M22 710V750H159V-250H22V-210H119V710H22Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo stretchy="false">[</mo><mn>0</mn><mo>,</mo><mn>1</mn><mo stretchy="false">]</mo></math></mjx-assistive-mml></mjx-container> में आता है क्योंकि <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.355ex;" xmlns="http://www.w3.org/2000/svg" width="2.131ex" height="1.358ex" role="img" focusable="false" viewBox="0 -443 942.1 600.1" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D463" d="M173 380Q173 405 154 405Q130 405 104 376T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Q21 294 29 316T53 368T97 419T160 441Q202 441 225 417T249 361Q249 344 246 335Q246 329 231 291T200 202T182 113Q182 86 187 69Q200 26 250 26Q287 26 319 60T369 139T398 222T409 277Q409 300 401 317T383 343T365 361T357 383Q357 405 376 424T417 443Q436 443 451 425T467 367Q467 340 455 284T418 159T347 40T241 -11Q177 -11 139 22Q102 54 102 117Q102 148 110 181T151 298Q173 362 173 380Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(518,-150) scale(0.707)"><path data-c="1D44E" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>v</mi><mi>a</mi></msub></math></mjx-assistive-mml></mjx-container> और <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.357ex;" xmlns="http://www.w3.org/2000/svg" width="1.971ex" height="1.359ex" role="img" focusable="false" viewBox="0 -443 871.3 600.8" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D463" d="M173 380Q173 405 154 405Q130 405 104 376T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Q21 294 29 316T53 368T97 419T160 441Q202 441 225 417T249 361Q249 344 246 335Q246 329 231 291T200 202T182 113Q182 86 187 69Q200 26 250 26Q287 26 319 60T369 139T398 222T409 277Q409 300 401 317T383 343T365 361T357 383Q357 405 376 424T417 443Q436 443 451 425T467 367Q467 340 455 284T418 159T347 40T241 -11Q177 -11 139 22Q102 54 102 117Q102 148 110 181T151 298Q173 362 173 380Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(518,-150) scale(0.707)"><path data-c="1D44F" d="M73 647Q73 657 77 670T89 683Q90 683 161 688T234 694Q246 694 246 685T212 542Q204 508 195 472T180 418L176 399Q176 396 182 402Q231 442 283 442Q345 442 383 396T422 280Q422 169 343 79T173 -11Q123 -11 82 27T40 150V159Q40 180 48 217T97 414Q147 611 147 623T109 637Q104 637 101 637H96Q86 637 83 637T76 640T73 647ZM336 325V331Q336 405 275 405Q258 405 240 397T207 376T181 352T163 330L157 322L136 236Q114 150 114 114Q114 66 138 42Q154 26 178 26Q211 26 245 58Q270 81 285 114T318 219Q336 291 336 325Z" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>v</mi><mi>b</mi></msub></math></mjx-assistive-mml></mjx-container> के signs उल्टे होते हैं। एक fake edge पर उनके signs एक जैसे होते हैं, इसलिए <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.357ex;" xmlns="http://www.w3.org/2000/svg" width="6.868ex" height="1.676ex" role="img" focusable="false" viewBox="0 -583 3035.9 740.8" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D463" d="M173 380Q173 405 154 405Q130 405 104 376T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Q21 294 29 316T53 368T97 419T160 441Q202 441 225 417T249 361Q249 344 246 335Q246 329 231 291T200 202T182 113Q182 86 187 69Q200 26 250 26Q287 26 319 60T369 139T398 222T409 277Q409 300 401 317T383 343T365 361T357 383Q357 405 376 424T417 443Q436 443 451 425T467 367Q467 340 455 284T418 159T347 40T241 -11Q177 -11 139 22Q102 54 102 117Q102 148 110 181T151 298Q173 362 173 380Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(518,-150) scale(0.707)"><path data-c="1D44F" d="M73 647Q73 657 77 670T89 683Q90 683 161 688T234 694Q246 694 246 685T212 542Q204 508 195 472T180 418L176 399Q176 396 182 402Q231 442 283 442Q345 442 383 396T422 280Q422 169 343 79T173 -11Q123 -11 82 27T40 150V159Q40 180 48 217T97 414Q147 611 147 623T109 637Q104 637 101 637H96Q86 637 83 637T76 640T73 647ZM336 325V331Q336 405 275 405Q258 405 240 397T207 376T181 352T163 330L157 322L136 236Q114 150 114 114Q114 66 138 42Q154 26 178 26Q211 26 245 58Q270 81 285 114T318 219Q336 291 336 325Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(1093.6,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(2093.8,0)"><g data-mml-node="mi"><path data-c="1D463" d="M173 380Q173 405 154 405Q130 405 104 376T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Q21 294 29 316T53 368T97 419T160 441Q202 441 225 417T249 361Q249 344 246 335Q246 329 231 291T200 202T182 113Q182 86 187 69Q200 26 250 26Q287 26 319 60T369 139T398 222T409 277Q409 300 401 317T383 343T365 361T357 383Q357 405 376 424T417 443Q436 443 451 425T467 367Q467 340 455 284T418 159T347 40T241 -11Q177 -11 139 22Q102 54 102 117Q102 148 110 181T151 298Q173 362 173 380Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(518,-150) scale(0.707)"><path data-c="1D44E" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>v</mi><mi>b</mi></msub><mo>−</mo><msub><mi>v</mi><mi>a</mi></msub></math></mjx-assistive-mml></mjx-container> शून्य के पास होता है या sign पलट देता है और <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="0.817ex" height="1.441ex" role="img" focusable="false" viewBox="0 -626 361 637" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>t</mi></math></mjx-assistive-mml></mjx-container> <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="4.526ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 2000.7 1000" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="5B" d="M118 -250V750H255V710H158V-210H255V-250H118Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(278,0)"><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(778,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(1222.7,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(1722.7,0)"><path data-c="5D" d="M22 710V750H159V-250H22V-210H119V710H22Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo stretchy="false">[</mo><mn>0</mn><mo>,</mo><mn>1</mn><mo stretchy="false">]</mo></math></mjx-assistive-mml></mjx-container> के बाहर निकल जाता है, vertex को volume से काफ़ी दूर रखते हुए। इसे कुछ सौ ग़लत cells से गुणा करो और तुम्हें एक hedgehog मिल जाता है।</p>
<p>fix बेवक़ूफ़ी की हद तक आसान था: Spike 12 से proven table byte-for-byte copy कर लो। सबक़ सीखा। जब एक proven copy मौजूद हो तो lookup table कभी दोबारा generate मत करो।</p>
<p>दूसरा bug ज़्यादा सूक्ष्म था। smooth brush को terrain features को नरम करना था। उसके बजाय उसने तेज़ creases बना दिए। समस्या: मैं हर SDF value को शून्य (isosurface) की तरफ़ खींच रहा था। यह सुनने में लगता है कि इससे चीज़ें smooth होनी चाहिए, पर इससे distance field collapse हो जाता है। surface के ऊपर और नीचे दोनों के voxels शून्य की तरफ़ दौड़ते हैं, brush radius में सब कुछ flatten करते हुए। boundary पर, smoothed voxels एक hard step के साथ unsmoothed voxels से मिलते हैं। &quot;smooth&quot; brush एक crease generator था।</p>
<p>fix था proper Laplacian smoothing. हर value को शून्य की तरफ़ खींचने के बजाय, उसे अपने 6 direct neighbors के average की तरफ़ खींचो:</p>
<mjx-container tabindex="0" class="MathJax" jax="SVG" display="true" style="direction: ltr; display: block; text-align: center; margin: 1em 0; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -3.222ex;" xmlns="http://www.w3.org/2000/svg" width="30.99ex" height="7.575ex" role="img" focusable="false" viewBox="0 -1924.1 13697.6 3348.2" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D719" d="M409 688Q413 694 421 694H429H442Q448 688 448 686Q448 679 418 563Q411 535 404 504T392 458L388 442Q388 441 397 441T429 435T477 418Q521 397 550 357T579 260T548 151T471 65T374 11T279 -10H275L251 -105Q245 -128 238 -160Q230 -192 227 -198T215 -205H209Q189 -205 189 -198Q189 -193 211 -103L234 -11Q234 -10 226 -10Q221 -10 206 -8T161 6T107 36T62 89T43 171Q43 231 76 284T157 370T254 422T342 441Q347 441 348 445L378 567Q409 686 409 688ZM122 150Q122 116 134 91T167 53T203 35T237 27H244L337 404Q333 404 326 403T297 395T255 379T211 350T170 304Q152 276 137 237Q122 191 122 150ZM500 282Q500 320 484 347T444 385T405 400T381 404H378L332 217L284 29Q284 27 285 27Q293 27 317 33T357 47Q400 66 431 100T475 170T494 234T500 282Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(629,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(1200.7,0)"><path data-c="2190" d="M944 261T944 250T929 230H165Q167 228 182 216T211 189T244 152T277 96T303 25Q308 7 308 0Q308 -11 288 -11Q281 -11 278 -11T272 -7T267 2T263 21Q245 94 195 151T73 236Q58 242 55 247Q55 254 59 257T73 264Q121 283 158 314T215 375T247 434T264 480L267 497Q269 503 270 505T275 509T288 511Q308 511 308 500Q308 493 303 475Q293 438 278 406T246 352T215 315T185 287T165 270H929Q944 261 944 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(2478.5,0)"><g data-mml-node="mi"><path data-c="1D719" d="M409 688Q413 694 421 694H429H442Q448 688 448 686Q448 679 418 563Q411 535 404 504T392 458L388 442Q388 441 397 441T429 435T477 418Q521 397 550 357T579 260T548 151T471 65T374 11T279 -10H275L251 -105Q245 -128 238 -160Q230 -192 227 -198T215 -205H209Q189 -205 189 -198Q189 -193 211 -103L234 -11Q234 -10 226 -10Q221 -10 206 -8T161 6T107 36T62 89T43 171Q43 231 76 284T157 370T254 422T342 441Q347 441 348 445L378 567Q409 686 409 688ZM122 150Q122 116 134 91T167 53T203 35T237 27H244L337 404Q333 404 326 403T297 395T255 379T211 350T170 304Q152 276 137 237Q122 191 122 150ZM500 282Q500 320 484 347T444 385T405 400T381 404H378L332 217L284 29Q284 27 285 27Q293 27 317 33T357 47Q400 66 431 100T475 170T494 234T500 282Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(629,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(3623.7,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(4623.9,0)"><path data-c="1D706" d="M166 673Q166 685 183 694H202Q292 691 316 644Q322 629 373 486T474 207T524 67Q531 47 537 34T546 15T551 6T555 2T556 -2T550 -11H482Q457 3 450 18T399 152L354 277L340 262Q327 246 293 207T236 141Q211 112 174 69Q123 9 111 -1T83 -12Q47 -12 47 20Q47 37 61 52T199 187Q229 216 266 252T321 306L338 322Q338 323 288 462T234 612Q214 657 183 657Q166 657 166 673Z" style="stroke-width: 3;"/></g><g data-mml-node="mrow" transform="translate(5373.6,0)"><g data-mml-node="mo"><path data-c="239B" d="M837 1154Q843 1148 843 1145Q843 1141 818 1106T753 1002T667 841T574 604T494 299Q417 -84 417 -609Q417 -641 416 -647T411 -654Q409 -655 366 -655Q299 -655 297 -654Q292 -652 292 -643T291 -583Q293 -400 304 -242T347 110T432 470T574 813T785 1136Q787 1139 790 1142T794 1147T796 1150T799 1152T802 1153T807 1154T813 1154H819H837Z" transform="translate(0,770.1)" style="stroke-width: 3;"/><path data-c="239D" d="M843 -635Q843 -638 837 -644H820Q801 -644 800 -643Q792 -635 785 -626Q684 -503 605 -363T473 -75T385 216T330 518T302 809T291 1093Q291 1144 291 1153T296 1164Q298 1165 366 1165Q409 1165 411 1164Q415 1163 416 1157T417 1119Q417 529 517 109T833 -617Q843 -631 843 -635Z" transform="translate(0,-780.1)" style="stroke-width: 3;"/></g><g data-mml-node="mfrac" transform="translate(875,0)"><g data-mml-node="mn" transform="translate(220,676)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(220,-686)"><path data-c="36" d="M42 313Q42 476 123 571T303 666Q372 666 402 630T432 550Q432 525 418 510T379 495Q356 495 341 509T326 548Q326 592 373 601Q351 623 311 626Q240 626 194 566Q147 500 147 364L148 360Q153 366 156 373Q197 433 263 433H267Q313 433 348 414Q372 400 396 374T435 317Q456 268 456 210V192Q456 169 451 149Q440 90 387 34T253 -22Q225 -22 199 -14T143 16T92 75T56 172T42 313ZM257 397Q227 397 205 380T171 335T154 278T148 216Q148 133 160 97T198 39Q222 21 251 21Q302 21 329 59Q342 77 347 104T352 209Q352 289 347 316T329 361Q302 397 257 397Z" style="stroke-width: 3;"/></g><rect width="700" height="60" x="120" y="220"/></g><g data-mml-node="munder" transform="translate(1981.7,0)"><g data-mml-node="mo" transform="translate(370.5,0)"><path data-c="2211" d="M60 948Q63 950 665 950H1267L1325 815Q1384 677 1388 669H1348L1341 683Q1320 724 1285 761Q1235 809 1174 838T1033 881T882 898T699 902H574H543H251L259 891Q722 258 724 252Q725 250 724 246Q721 243 460 -56L196 -356Q196 -357 407 -357Q459 -357 548 -357T676 -358Q812 -358 896 -353T1063 -332T1204 -283T1307 -196Q1328 -170 1348 -124H1388Q1388 -125 1381 -145T1356 -210T1325 -294L1267 -449L666 -450Q64 -450 61 -448Q55 -446 55 -439Q55 -437 57 -433L590 177Q590 178 557 222T452 366T322 544L56 909L55 924Q55 945 60 948Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" transform="translate(0,-1147.3) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D457" d="M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(412,0)"><path data-c="2208" d="M84 250Q84 372 166 450T360 539Q361 539 377 539T419 540T469 540H568Q583 532 583 520Q583 511 570 501L466 500Q355 499 329 494Q280 482 242 458T183 409T147 354T129 306T124 272V270H568Q583 262 583 250T568 230H124V228Q124 207 134 177T167 112T231 48T328 7Q355 1 466 0H570Q583 -10 583 -20Q583 -32 568 -40H471Q464 -40 446 -40T417 -41Q262 -41 172 45Q84 127 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(1079,0)"><path data-c="1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(1967,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(2356,0)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(2701,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g></g></g><g data-mml-node="msub" transform="translate(4333.3,0)"><g data-mml-node="mi"><path data-c="1D719" d="M409 688Q413 694 421 694H429H442Q448 688 448 686Q448 679 418 563Q411 535 404 504T392 458L388 442Q388 441 397 441T429 435T477 418Q521 397 550 357T579 260T548 151T471 65T374 11T279 -10H275L251 -105Q245 -128 238 -160Q230 -192 227 -198T215 -205H209Q189 -205 189 -198Q189 -193 211 -103L234 -11Q234 -10 226 -10Q221 -10 206 -8T161 6T107 36T62 89T43 171Q43 231 76 284T157 370T254 422T342 441Q347 441 348 445L378 567Q409 686 409 688ZM122 150Q122 116 134 91T167 53T203 35T237 27H244L337 404Q333 404 326 403T297 395T255 379T211 350T170 304Q152 276 137 237Q122 191 122 150ZM500 282Q500 320 484 347T444 385T405 400T381 404H378L332 217L284 29Q284 27 285 27Q293 27 317 33T357 47Q400 66 431 100T475 170T494 234T500 282Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(629,-150) scale(0.707)"><path data-c="1D457" d="M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(5525.8,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(6526.1,0)"><g data-mml-node="mi"><path data-c="1D719" d="M409 688Q413 694 421 694H429H442Q448 688 448 686Q448 679 418 563Q411 535 404 504T392 458L388 442Q388 441 397 441T429 435T477 418Q521 397 550 357T579 260T548 151T471 65T374 11T279 -10H275L251 -105Q245 -128 238 -160Q230 -192 227 -198T215 -205H209Q189 -205 189 -198Q189 -193 211 -103L234 -11Q234 -10 226 -10Q221 -10 206 -8T161 6T107 36T62 89T43 171Q43 231 76 284T157 370T254 422T342 441Q347 441 348 445L378 567Q409 686 409 688ZM122 150Q122 116 134 91T167 53T203 35T237 27H244L337 404Q333 404 326 403T297 395T255 379T211 350T170 304Q152 276 137 237Q122 191 122 150ZM500 282Q500 320 484 347T444 385T405 400T381 404H378L332 217L284 29Q284 27 285 27Q293 27 317 33T357 47Q400 66 431 100T475 170T494 234T500 282Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(629,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(7449,0)"><path data-c="239E" d="M31 1143Q31 1154 49 1154H59Q72 1154 75 1152T89 1136Q190 1013 269 873T401 585T489 294T544 -8T572 -299T583 -583Q583 -634 583 -643T577 -654Q575 -655 508 -655Q465 -655 463 -654Q459 -653 458 -647T457 -609Q457 -58 371 340T100 1037Q87 1059 61 1098T31 1143Z" transform="translate(0,770.1)" style="stroke-width: 3;"/><path data-c="23A0" d="M56 -644H50Q31 -644 31 -635Q31 -632 37 -622Q69 -579 100 -527Q286 -228 371 170T457 1119Q457 1161 462 1164Q464 1165 520 1165Q575 1165 577 1164Q582 1162 582 1153T583 1093Q581 910 570 752T527 400T442 40T300 -303T89 -626Q78 -640 75 -642T61 -644H56Z" transform="translate(0,-780.1)" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="block" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; overflow: hidden; width: 100%;"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><msub><mi>ϕ</mi><mi>i</mi></msub><mo stretchy="false">←</mo><msub><mi>ϕ</mi><mi>i</mi></msub><mo>+</mo><mi>λ</mi><mrow data-mjx-texclass="INNER"><mo data-mjx-texclass="OPEN">(</mo><mfrac><mn>1</mn><mn>6</mn></mfrac><munder><mo data-mjx-texclass="OP">∑</mo><mrow data-mjx-texclass="ORD"><mi>j</mi><mo>∈</mo><mi>N</mi><mo stretchy="false">(</mo><mi>i</mi><mo stretchy="false">)</mo></mrow></munder><msub><mi>ϕ</mi><mi>j</mi></msub><mo>−</mo><msub><mi>ϕ</mi><mi>i</mi></msub><mo data-mjx-texclass="CLOSE">)</mo></mrow></math></mjx-assistive-mml></mjx-container><p>कोष्ठक में जो term है वह एक discrete Laplacian है, और <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="8.862ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 3917.2 1000" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D706" d="M166 673Q166 685 183 694H202Q292 691 316 644Q322 629 373 486T474 207T524 67Q531 47 537 34T546 15T551 6T555 2T556 -2T550 -11H482Q457 3 450 18T399 152L354 277L340 262Q327 246 293 207T236 141Q211 112 174 69Q123 9 111 -1T83 -12Q47 -12 47 20Q47 37 61 52T199 187Q229 216 266 252T321 306L338 322Q338 323 288 462T234 612Q214 657 183 657Q166 657 166 673Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(860.8,0)"><path data-c="2208" d="M84 250Q84 372 166 450T360 539Q361 539 377 539T419 540T469 540H568Q583 532 583 520Q583 511 570 501L466 500Q355 499 329 494Q280 482 242 458T183 409T147 354T129 306T124 272V270H568Q583 262 583 250T568 230H124V228Q124 207 134 177T167 112T231 48T328 7Q355 1 466 0H570Q583 -10 583 -20Q583 -32 568 -40H471Q464 -40 446 -40T417 -41Q262 -41 172 45Q84 127 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(1805.6,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(2194.6,0)"><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(2694.6,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(3139.2,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(3639.2,0)"><path data-c="5D" d="M22 710V750H159V-250H22V-210H119V710H22Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>λ</mi><mo>∈</mo><mo stretchy="false">(</mo><mn>0</mn><mo>,</mo><mn>1</mn><mo stretchy="false">]</mo></math></mjx-assistive-mml></mjx-container> smoothing strength है। यह पास की geometry का average लेता है, surface shape को नरम करता है जबकि distance field gradient को collapse करने के बजाय बनाए रखता है।</p>
<h2 id="सब-कुछ-एक-साथ" tabindex="-1">सब कुछ एक साथ <a class="header-anchor" href="#सब-कुछ-एक-साथ" aria-label="Permalink to &quot;सब कुछ एक साथ&quot;"></a></h2>
<p>Spike 27 integration gate था। Spike 24 की पूरी pipeline (heightmap patches, MC chunks, Transvoxel seams, geomorph LOD) लो और उसे Spike 25 के sampled data model और दोनों brush types के साथ मिलाओ।</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/27-hm-mc-brush/" title="Spike 27 HM + MC + Brush Integration" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/27-hm-mc-brush/" target="_blank">Spike 27 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=27-hm-mc-brush">सोर्स देखें</a></p>
<p>सबसे पहले मैंने हर shader से <code>height_at()</code> को निकाल फेंका। तीनों compute shaders (SDF fill, heightmap patch, Transvoxel seam) अब एक ही 129x129 heightmap GPU buffer से bind होते हैं और एक shared WGSL preamble के ज़रिए एक ही <code>hm_sample()</code> bilinear interpolation function इस्तेमाल करते हैं। एक data source, कई consumers. वो procedural noise functions जो Spike 1 से हर shader में रहे थे, ख़त्म हो गए।</p>
<p>फिर दिलचस्प समस्याएँ शुरू हुईं।</p>
<p>जब एक SDF brush किसी chunk को MC mode में lock करता है, तो उस chunk और उसके heightmap neighbor के बीच के Transvoxel seam को heightmap नहीं, बल्कि SDF volume से sample करना होता है। मैंने seam shader को अतिरिक्त storage buffer bindings और per-chunk MC flags के साथ बढ़ाया। संभालने के लिए चार boundary combinations: HM-HM, HM-MC, MC-HM, MC-MC.</p>
<p>LOD एक और पहेली थी। पहले के spikes में, किसी MC chunk को lower LOD पर switch करने का मतलब था SDF को एक coarser resolution पर फिर से भरना। मैंने उसे stride-based sampling से बदल दिया: SDF data full resolution (65 grid points) पर रहता है। MC shader grid size और cell count के ratio से एक stride compute करता है। LOD0 पर stride 1 है। LOD1 पर stride 2 है, हर दूसरे voxel को sample करते हुए। chunks अपने SDF data को छुए बिना आज़ादी से LOD बदल सकते हैं।</p>
<p>सबसे संतोषजनक fix था dynamic vertical chunk spawning. किसी chunk के top से ऊपर तक sculpt करो, और उसके ऊपर एक नया MC-only chunk दिखाई देता है जिसका SDF नीचे के chunk के boundary face से initialize होता है। नीचे की तरफ़ sculpt करो, वही बात। world edits के हिसाब से बढ़ता है।</p>
<p>आख़िरी गोचा यह था कि heightmap brush MC-locked chunks के साथ चुपचाप कुछ नहीं करता था। HM brush <code>heightmapCPU</code> को बदलता है और उसे फिर से upload करता है। MC chunks अब heightmap से नहीं पढ़ते क्योंकि उनका SDF उससे भरा गया था और फिर अलग हो गया था। मैंने <code>syncHeightmapToSdf()</code> जोड़ा: heightmap बदलने के बाद, brush radius में किसी भी MC chunk के लिए SDF columns फिर से derive करो और नई values upload करो। दोनों brush types अब दोनों chunk types पर काम करते हैं।</p>
<h2 id="हमने-असल-में-क्या-सीखा" tabindex="-1">हमने असल में क्या सीखा <a class="header-anchor" href="#हमने-असल-में-क्या-सीखा" aria-label="Permalink to &quot;हमने असल में क्या सीखा&quot;"></a></h2>
<p>brush spikes को एक performance सवाल का जवाब देना था: क्या sculpting frame budget के भीतर चल सकती है? चल सकती है। वह आसान हिस्सा था।</p>
<p>मुश्किल हिस्सा यह पता लगाना था कि 24 spikes तक <code>height_at()</code> को terrain की सच्चाई के रूप में इस्तेमाल करने से एक अदृश्य dependency बन गई थी जो उसी पल टूट गई जब हमने कुछ भी edit करने की कोशिश की। procedural function साफ़, global और stateless थी, ठीक उस पल तक जब तक वह terrain नहीं रही।</p>
<p>जो नियम हमने लिख लिए और भूलेंगे नहीं:</p>
<ol>
<li>Terrain height sampled data से आती है। chunks अपने buffers के मालिक होते हैं।</li>
<li>Procedural generation initial data भरता है। यह runtime की सच्चाई नहीं है।</li>
<li>brush chunk data को सीधे बदलता है। कोई displacement overlays नहीं।</li>
<li>Normals उसी data से grid-aligned central differences के ज़रिए आती हैं।</li>
<li>Border overlap (neighbor interior से 1 cell) cross-chunk normals संभालता है।</li>
<li>जब एक proven copy मौजूद हो तो lookup table कभी दोबारा generate मत करो।</li>
</ol>
<p><a href="/hi/blog/2026-04-13-open-world-browser-part-14-world-comes-alive.html">भाग 14</a> में हम debug geometry sculpt करना बंद करते हैं और उसे एक असली जगह जैसा दिखाने और महसूस कराने लगते हैं।</p>
<h2 id="इस-chapter-में-संदर्भित-technology" tabindex="-1">इस chapter में संदर्भित technology <a class="header-anchor" href="#इस-chapter-में-संदर्भित-technology" aria-label="Permalink to &quot;इस chapter में संदर्भित technology&quot;"></a></h2>
<p><strong>Sampled heightmap architecture.</strong> Terrain को runtime पर किसी procedural function से evaluate करने के बजाय per chunk owned data के रूप में स्टोर किया जाता है। हर chunk के पास असली height values का एक <code>Float32Array</code> होता है। creation time पर procedural noise initial data भरता है, फिर function कभी call नहीं होता। इससे math-based terrain और edit overlays के बीच का dual-system mismatch ख़त्म होता है, brush operations सरल होते हैं (stored values को सीधे edit करो), और GPU shader बेहद सरल हो जाता है (buffer से पढ़ो, grid-aligned central differences के ज़रिए normals compute करो)। streaming वाले open world के लिए, neighbors से 1-cell border overlap के साथ per-chunk ownership standard तरीक़ा है। हमारी <a href="/hi/guides/landscape-generation-browser.html#terrain-data-representation">landscape generation guide</a> देखें।</p>
<p><strong>SDF brush operations.</strong> Terrain sculpt करने के लिए एक signed distance field को बदलना। Add (inflate) एक sphere के चारों ओर smooth-step falloff इस्तेमाल करता है। Subtract (carve) उसी shape को negated इस्तेमाल करता है। Smooth, Laplacian averaging इस्तेमाल करता है: 6 direct neighbors पढ़ो, उनका mean compute करो, mean की तरफ़ खींचो। शून्य की तरफ़ खींचने का naive तरीक़ा distance field को collapse करता है और तेज़ edges बनाता है। Laplacian smoothing field gradient को बनाए रखता है जबकि features को नरम करता है। <a href="/hi/guides/landscape-generation-browser.html#signed-distance-fields-sdfs">SDF terrain representation</a> देखें।</p>
<p><strong>Transvoxel with mixed data sources.</strong> एक MC chunk और एक heightmap chunk के बीच की boundary पर transition cells को हर तरफ़ अलग data sample करना होता है। seam shader per-chunk flags और buffer bindings रखता है ताकि चारों combinations (HM-HM, HM-MC, MC-HM, MC-MC) संभाले जा सकें। जब एक तरफ़ MC-locked होती है, तो shader heightmap sample करने के बजाय SDF buffer को trilinearly interpolate करता है।</p>
<p><strong>Stride-based LOD for marching cubes.</strong> SDF data chunk के मौजूदा LOD level की परवाह किए बिना full resolution पर स्टोर किया जाता है। MC shader SDF grid points और MC cells के ratio से एक sampling stride compute करता है। full resolution पर stride 1 है, half resolution पर stride 2 है। इससे SDF data, LOD changes से decouple हो जाता है, तो chunks SDF को rebuild किए बिना आज़ादी से LOD transition कर सकते हैं।</p>
<hr>
<p>14 में से भाग 13.
पिछला: <a href="/hi/blog/2026-02-25-open-world-browser-part-12-lessons.html">भाग 12 - Rings, sky fog, और जो हम दोबारा करेंगे</a>
अगला: <a href="/hi/blog/2026-04-13-open-world-browser-part-14-world-comes-alive.html">भाग 14 - The world comes alive</a>
सीरीज़ गाइड: <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">/hi/blog/2026-02-25-open-world-browser-series-guide</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Browser में open world बनाना, भाग 14: दुनिया में जान आ जाती है]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-04-13-open-world-browser-part-14-world-comes-alive</link>
            <guid>https://app.cinevva.com/hi/blog/2026-04-13-open-world-browser-part-14-world-comes-alive</guid>
            <pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[ऐसे materials जो आपकी sculpting पर react करते हैं, घास जो cave की छत पर उगती है, और एक glider जो आपको भुला देता है कि आप एक browser tab में हैं।]]></description>
            <content:encoded><![CDATA[<h1 id="browser-में-open-world-बनाना-भाग-14-दुनिया-में-जान-आ-जाती-है" tabindex="-1">Browser में open world बनाना, भाग 14: दुनिया में जान आ जाती है <a class="header-anchor" href="#browser-में-open-world-बनाना-भाग-14-दुनिया-में-जान-आ-जाती-है" aria-label="Permalink to &quot;Browser में open world बनाना, भाग 14: दुनिया में जान आ जाती है&quot;"></a></h1>
<p><em>लेखक <a href="/hi/about.html">Oleg Sidorkin</a>, Cinevva के CTO और सह-संस्थापक</em></p>
<p>यहां नए हैं? <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">series guide</a> का इस्तेमाल करें। यह बताती है कि spike क्या होता है और सभी भागों को जोड़ती है।</p>
<p><a href="/hi/blog/2026-04-13-open-world-browser-part-13-terrain-sculpting.html">भाग 13</a> के बाद हमारे पास sculpting थी। terrain उठाओ, caves काटो, cliffs को smooth करो, सब कुछ real time में, seams सलामत। लेकिन दुनिया एक tech demo जैसी दिखती थी। debug रंगों वाली flat shading, wireframe overlays, चंक्स को अलग बताने के लिए LOD रंगों वाली grey geometry। आप इसे edit कर सकते थे। आप इसे महसूस नहीं कर सकते थे।</p>
<p>तीन spikes ने यह बदल दिया। architecture नहीं। बिल्कुल वही pipeline, buffers, और seam stitching जो भाग 13 से थी। हमने बस वे layers जोड़ीं जो terrain को एक जगह जैसा महसूस कराती हैं: ऐसी surfaces जो आकार पर react करती हैं, उन surfaces पर उगता जीवन, और एक शरीर जो उन पर चलता है।</p>
<p>&quot;तकनीकी रूप से काम कर रहा है&quot; और &quot;मैं यहां रहना चाहता हूं&quot; के बीच का फर्क हैरानी की हद तक छोटा निकला।</p>
<h2 id="एक-cliff-sculpt-करो-और-उसे-चट्टान-में-बदलते-देखो" tabindex="-1">एक cliff sculpt करो और उसे चट्टान में बदलते देखो <a class="header-anchor" href="#एक-cliff-sculpt-करो-और-उसे-चट्टान-में-बदलते-देखो" aria-label="Permalink to &quot;एक cliff sculpt करो और उसे चट्टान में बदलते देखो&quot;"></a></h2>
<p>Spike 28 ने एक सीमित सवाल पूछा: क्या triplanar mapping वाला 4-layer material, compute से बने terrain पर frame budget को मारे बिना चल सकता है? जवाब हां था, पर दिलचस्प हिस्सा यह था कि उसके बाद क्या हुआ।</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/28-multi-material/" title="Spike 28 Multi-Material Texturing" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/28-multi-material/" target="_blank">Spike 28 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=28-multi-material">source देखें</a></p>
<p>startup पर FBM noise से बनी चार procedural textures (grass, rock, sand, snow)। कोई बाहरी files नहीं, कोई asset pipeline नहीं, बस math और एक <code>DataTexture</code>। material के weights surface से ही आते हैं: slope और altitude। treeline के नीचे की flat जगहों को grass मिलती है। तीखी faces को rock मिलती है। नीची ज़मीन को sand मिलती है। ऊंची चोटियों को snow मिलती है। हर raw weight slope और altitude पर एक <code>smoothstep</code> से आता है, फिर उन्हें per-fragment normalize किया जाता है ताकि <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.663ex;" xmlns="http://www.w3.org/2000/svg" width="10.014ex" height="2.36ex" role="img" focusable="false" viewBox="0 -750 4426.1 1043.1" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="munder"><g data-mml-node="mo"><path data-c="2211" d="M61 748Q64 750 489 750H913L954 640Q965 609 976 579T993 533T999 516H979L959 517Q936 579 886 621T777 682Q724 700 655 705T436 710H319Q183 710 183 709Q186 706 348 484T511 259Q517 250 513 244L490 216Q466 188 420 134T330 27L149 -187Q149 -188 362 -188Q388 -188 436 -188T506 -189Q679 -189 778 -162T936 -43Q946 -27 959 6H999L913 -249L489 -250Q65 -250 62 -248Q56 -246 56 -239Q56 -234 118 -161Q186 -81 245 -11L428 206Q428 207 242 462L57 717L56 728Q56 744 61 748Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(1089,-285.4) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g></g><g data-mml-node="msub" transform="translate(1549.6,0)"><g data-mml-node="mi"><path data-c="1D464" d="M580 385Q580 406 599 424T641 443Q659 443 674 425T690 368Q690 339 671 253Q656 197 644 161T609 80T554 12T482 -11Q438 -11 404 5T355 48Q354 47 352 44Q311 -11 252 -11Q226 -11 202 -5T155 14T118 53T104 116Q104 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Q21 293 29 315T52 366T96 418T161 441Q204 441 227 416T250 358Q250 340 217 250T184 111Q184 65 205 46T258 26Q301 26 334 87L339 96V119Q339 122 339 128T340 136T341 143T342 152T345 165T348 182T354 206T362 238T373 281Q402 395 406 404Q419 431 449 431Q468 431 475 421T483 402Q483 389 454 274T422 142Q420 131 420 107V100Q420 85 423 71T442 42T487 26Q558 26 600 148Q609 171 620 213T632 273Q632 306 619 325T593 357T580 385Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(749,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(2870.3,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(3926.1,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><munder><mo data-mjx-texclass="OP">∑</mo><mi>i</mi></munder><msub><mi>w</mi><mi>i</mi></msub><mo>=</mo><mn>1</mn></math></mjx-assistive-mml></mjx-container> हो और अंतिम रंग बस weighted blend <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.663ex;" xmlns="http://www.w3.org/2000/svg" width="7.963ex" height="2.36ex" role="img" focusable="false" viewBox="0 -750 3519.5 1043.1" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="munder"><g data-mml-node="mo"><path data-c="2211" d="M61 748Q64 750 489 750H913L954 640Q965 609 976 579T993 533T999 516H979L959 517Q936 579 886 621T777 682Q724 700 655 705T436 710H319Q183 710 183 709Q186 706 348 484T511 259Q517 250 513 244L490 216Q466 188 420 134T330 27L149 -187Q149 -188 362 -188Q388 -188 436 -188T506 -189Q679 -189 778 -162T936 -43Q946 -27 959 6H999L913 -249L489 -250Q65 -250 62 -248Q56 -246 56 -239Q56 -234 118 -161Q186 -81 245 -11L428 206Q428 207 242 462L57 717L56 728Q56 744 61 748Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(1089,-285.4) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g></g><g data-mml-node="msub" transform="translate(1549.6,0)"><g data-mml-node="mi"><path data-c="1D464" d="M580 385Q580 406 599 424T641 443Q659 443 674 425T690 368Q690 339 671 253Q656 197 644 161T609 80T554 12T482 -11Q438 -11 404 5T355 48Q354 47 352 44Q311 -11 252 -11Q226 -11 202 -5T155 14T118 53T104 116Q104 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Q21 293 29 315T52 366T96 418T161 441Q204 441 227 416T250 358Q250 340 217 250T184 111Q184 65 205 46T258 26Q301 26 334 87L339 96V119Q339 122 339 128T340 136T341 143T342 152T345 165T348 182T354 206T362 238T373 281Q402 395 406 404Q419 431 449 431Q468 431 475 421T483 402Q483 389 454 274T422 142Q420 131 420 107V100Q420 85 423 71T442 42T487 26Q558 26 600 148Q609 171 620 213T632 273Q632 306 619 325T593 357T580 385Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(749,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mstyle" transform="translate(2592.6,0)"><g data-mml-node="mspace"/></g><g data-mml-node="msub" transform="translate(2759.6,0)"><g data-mml-node="mi"><path data-c="1D450" d="M34 159Q34 268 120 355T306 442Q362 442 394 418T427 355Q427 326 408 306T360 285Q341 285 330 295T319 325T330 359T352 380T366 386H367Q367 388 361 392T340 400T306 404Q276 404 249 390Q228 381 206 359Q162 315 142 235T121 119Q121 73 147 50Q169 26 205 26H209Q321 26 394 111Q403 121 406 121Q410 121 419 112T429 98T420 83T391 55T346 25T282 0T202 -11Q127 -11 81 37T34 159Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(466,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><munder><mo data-mjx-texclass="OP">∑</mo><mi>i</mi></munder><msub><mi>w</mi><mi>i</mi></msub><mstyle scriptlevel="0"><mspace width="0.167em"/></mstyle><msub><mi>c</mi><mi>i</mi></msub></math></mjx-assistive-mml></mjx-container> हो। normalizing ही वह चीज़ है जो surface को वहां dark या blown-out होने से रोकती है जहां biomes आपस में overlap करती हैं। triplanar mapping उन MC chunks के लिए UV projection संभालती है जहां triangles के पास कोई सार्थक UV coordinates नहीं होतीं।</p>
<p>वह पल जिसने इसे बेच दिया: एक तीखी cliff बनाने के लिए brush से terrain उठाओ, और rock texture उसी frame में नई face पर आ जाती है। उसे वापस flat करो, और grass surface पर फिर से कब्जा कर लेती है। material को brush के बारे में पता नहीं होता। वह बस world position और surface normal पढ़ता है, वही data जिससे geometry बनी थी। sculpting-से-visual feedback loop तुरंत और unscripted है।</p>
<p>Spike 8 ने डेढ़ महीने पहले WebGL पर एक static mesh के साथ terrain material की लागत का test किया था। Spike 28 साबित करता है कि यह नीचे चलते पूरे sculpting pipeline के साथ dynamic compute से बने terrain पर काम करता है। हमने इसके लिए budget रखा था, पर सब कुछ चलते हुए इसे 60fps पर टिकते देखना फिर भी राहत की बात थी।</p>
<h2 id="_80-000-grass-clumps-और-एक-cave-की-छत" tabindex="-1">80,000 grass clumps और एक cave की छत <a class="header-anchor" href="#_80-000-grass-clumps-और-एक-cave-की-छत" aria-label="Permalink to &quot;80,000 grass clumps और एक cave की छत&quot;"></a></h2>
<p>Spike 29 वही जगह है जहां gamedev instincts ने कमान संभाल ली।</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/29-vegetation/" title="Spike 29 Vegetation / Shader Grass" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/29-vegetation/" target="_blank">Spike 29 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=29-vegetation">source देखें</a></p>
<p>हम Breath of the Wild वाली grass चाहते थे। poly count नहीं, वह feel। ऐसी grass जो सही जगहों को ढके, हवा के साथ हिले, और आपका उसमें से दौड़ने का मन कर दे।</p>
<p>हर grass clump 60-degree के कोणों पर तीन एक-दूसरे को काटते quads होते हैं, झुकने के लिए चार vertical segments के साथ। यह एक cross आकार है जो हर angle से billboard tricks के बिना volumetric दिखता है। हर chunk पर एक <code>InstancedMesh</code>, पूरी दुनिया में 80,000 clumps, कुल मिलाकर लगभग 2.4 million grass vertices।</p>
<p>जो हिस्सा मायने रखता है वह placement है। CPU हर chunk पर एक jittered grid पर चलता है और वही slope/altitude logic evaluate करता है जो GPU material shader इस्तेमाल करता है। जहां material system कहता है &quot;grass,&quot; वहां grass उगती है। जहां rock या sand हावी होती है, density शून्य पर गिर जाती है। falloff smooth होती है क्योंकि नीचे के <code>smoothstep</code> weights biome किनारों पर continuous gradients पैदा करते हैं। आपको कोई सीमा नज़र नहीं आती क्योंकि कोई है ही नहीं।</p>
<p>फिर हमने कुछ ऐसा किया जिसके काम करने पर मुझे यकीन नहीं था। SDF surfaces पर grass। scatter function SDF volume के हर column पर चलता है और साथ वाले voxels के बीच zero-crossings ढूंढता है। जहां SDF negative से positive में crossover करता है, वहां एक surface है। surface normal बस field का normalized gradient है, <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -1.238ex;" xmlns="http://www.w3.org/2000/svg" width="9.256ex" height="3.445ex" role="img" focusable="false" viewBox="0 -975.7 4091.1 1522.8" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mover"><g data-mml-node="mi"><path data-c="1D45B" d="M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(300,16) translate(-250 0)"><path data-c="5E" d="M112 560L249 694L257 686Q387 562 387 560L361 531Q359 532 303 581L250 627L195 580Q182 569 169 557T148 538L140 532Q138 530 125 546L112 560Z" style="stroke-width: 3;"/></g></g></g><g data-mml-node="mo" transform="translate(877.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mfrac" transform="translate(1933.6,0)"><g data-mml-node="mrow" transform="translate(573.6,485) scale(0.707)"><g data-mml-node="mi"><path data-c="2207" d="M46 676Q46 679 51 683H781Q786 679 786 676Q786 674 617 326T444 -26Q439 -33 416 -33T388 -26Q385 -22 216 326T46 676ZM697 596Q697 597 445 597T193 596Q195 591 319 336T445 80L697 596Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(833,0)"><path data-c="1D719" d="M409 688Q413 694 421 694H429H442Q448 688 448 686Q448 679 418 563Q411 535 404 504T392 458L388 442Q388 441 397 441T429 435T477 418Q521 397 550 357T579 260T548 151T471 65T374 11T279 -10H275L251 -105Q245 -128 238 -160Q230 -192 227 -198T215 -205H209Q189 -205 189 -198Q189 -193 211 -103L234 -11Q234 -10 226 -10Q221 -10 206 -8T161 6T107 36T62 89T43 171Q43 231 76 284T157 370T254 422T342 441Q347 441 348 445L378 567Q409 686 409 688ZM122 150Q122 116 134 91T167 53T203 35T237 27H244L337 404Q333 404 326 403T297 395T255 379T211 350T170 304Q152 276 137 237Q122 191 122 150ZM500 282Q500 320 484 347T444 385T405 400T381 404H378L332 217L284 29Q284 27 285 27Q293 27 317 33T357 47Q400 66 431 100T475 170T494 234T500 282Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mrow" transform="translate(220,-370.3) scale(0.707)"><g data-mml-node="mo"><path data-c="2016" d="M133 736Q138 750 153 750Q164 750 170 739Q172 735 172 250T170 -239Q164 -250 152 -250Q144 -250 138 -244L137 -243Q133 -241 133 -179T132 250Q132 731 133 736ZM329 739Q334 750 346 750Q353 750 361 744L362 743Q366 741 366 679T367 250T367 -178T362 -243L361 -244Q355 -250 347 -250Q335 -250 329 -239Q327 -235 327 250T329 739Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(500,0)"><path data-c="2207" d="M46 676Q46 679 51 683H781Q786 679 786 676Q786 674 617 326T444 -26Q439 -33 416 -33T388 -26Q385 -22 216 326T46 676ZM697 596Q697 597 445 597T193 596Q195 591 319 336T445 80L697 596Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(1333,0)"><path data-c="1D719" d="M409 688Q413 694 421 694H429H442Q448 688 448 686Q448 679 418 563Q411 535 404 504T392 458L388 442Q388 441 397 441T429 435T477 418Q521 397 550 357T579 260T548 151T471 65T374 11T279 -10H275L251 -105Q245 -128 238 -160Q230 -192 227 -198T215 -205H209Q189 -205 189 -198Q189 -193 211 -103L234 -11Q234 -10 226 -10Q221 -10 206 -8T161 6T107 36T62 89T43 171Q43 231 76 284T157 370T254 422T342 441Q347 441 348 445L378 567Q409 686 409 688ZM122 150Q122 116 134 91T167 53T203 35T237 27H244L337 404Q333 404 326 403T297 395T255 379T211 350T170 304Q152 276 137 237Q122 191 122 150ZM500 282Q500 320 484 347T444 385T405 400T381 404H378L332 217L284 29Q284 27 285 27Q293 27 317 33T357 47Q400 66 431 100T475 170T494 234T500 282Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(1929,0)"><path data-c="2016" d="M133 736Q138 750 153 750Q164 750 170 739Q172 735 172 250T170 -239Q164 -250 152 -250Q144 -250 138 -244L137 -243Q133 -241 133 -179T132 250Q132 731 133 736ZM329 739Q334 750 346 750Q353 750 361 744L362 743Q366 741 366 679T367 250T367 -178T362 -243L361 -244Q355 -250 347 -250Q335 -250 329 -239Q327 -235 327 250T329 739Z" style="stroke-width: 3;"/></g></g><rect width="1917.6" height="60" x="120" y="220"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mrow data-mjx-texclass="ORD"><mover><mi>n</mi><mo stretchy="false">^</mo></mover></mrow><mo>=</mo><mfrac><mrow><mi mathvariant="normal">∇</mi><mi>ϕ</mi></mrow><mrow><mo data-mjx-texclass="OPEN" fence="false" stretchy="false">‖</mo><mi mathvariant="normal">∇</mi><mi>ϕ</mi><mo data-mjx-texclass="CLOSE" fence="false" stretchy="false">‖</mo></mrow></mfrac></math></mjx-assistive-mml></mjx-container>, जो voxel differences से निकाला जाता है, और slope <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="11.911ex" height="2.398ex" role="img" focusable="false" viewBox="0 -810 5264.4 1060" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" style="stroke-width: 3;"/><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(500,0)" style="stroke-width: 3;"/><path data-c="63" d="M370 305T349 305T313 320T297 358Q297 381 312 396Q317 401 317 402T307 404Q281 408 258 408Q209 408 178 376Q131 329 131 219Q131 137 162 90Q203 29 272 29Q313 29 338 55T374 117Q376 125 379 127T395 129H409Q415 123 415 120Q415 116 411 104T395 71T366 33T318 2T249 -11Q163 -11 99 53T34 214Q34 318 99 383T250 448T370 421T404 357Q404 334 387 320Z" transform="translate(892,0)" style="stroke-width: 3;"/><path data-c="63" d="M370 305T349 305T313 320T297 358Q297 381 312 396Q317 401 317 402T307 404Q281 408 258 408Q209 408 178 376Q131 329 131 219Q131 137 162 90Q203 29 272 29Q313 29 338 55T374 117Q376 125 379 127T395 129H409Q415 123 415 120Q415 116 411 104T395 71T366 33T318 2T249 -11Q163 -11 99 53T34 214Q34 318 99 383T250 448T370 421T404 357Q404 334 387 320Z" transform="translate(1336,0)" style="stroke-width: 3;"/><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z" transform="translate(1780,0)" style="stroke-width: 3;"/><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" transform="translate(2280,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(2674,0)"><path data-c="2061" d="" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(2674,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(3063,0)"><g data-mml-node="mover"><g data-mml-node="mi"><path data-c="1D45B" d="M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(300,16) translate(-250 0)"><path data-c="5E" d="M112 560L249 694L257 686Q387 562 387 560L361 531Q359 532 303 581L250 627L195 580Q182 569 169 557T148 538L140 532Q138 530 125 546L112 560Z" style="stroke-width: 3;"/></g></g></g><g data-mml-node="mo" transform="translate(3885.2,0)"><path data-c="22C5" d="M78 250Q78 274 95 292T138 310Q162 310 180 294T199 251Q199 226 182 208T139 190T96 207T78 250Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(4385.4,0)"><g data-mml-node="mover"><g data-mml-node="mi"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(300.6,16) translate(-250 0)"><path data-c="5E" d="M112 560L249 694L257 686Q387 562 387 560L361 531Q359 532 303 581L250 627L195 580Q182 569 169 557T148 538L140 532Q138 530 125 546L112 560Z" style="stroke-width: 3;"/></g></g></g><g data-mml-node="mo" transform="translate(4875.4,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>arccos</mi><mo data-mjx-texclass="NONE">⁡</mo><mo stretchy="false">(</mo><mrow data-mjx-texclass="ORD"><mover><mi>n</mi><mo stretchy="false">^</mo></mover></mrow><mo>⋅</mo><mrow data-mjx-texclass="ORD"><mover><mi>y</mi><mo stretchy="false">^</mo></mover></mrow><mo stretchy="false">)</mo></math></mjx-assistive-mml></mjx-container> है, vertical से कोण। अगर वह काफी कोमल है, तो grass रखो।</p>
<p>Spike 27 में SDF brush से एक cave काटो। Spike 29 में वापस आओ और cave की छत के ऊपर grass उग रही होती है। scatter code को पता नहीं होता कि cave क्या होती है। वह बस सही altitude पर सही slope वाली एक surface देखता है। यही वह तरह का emergent behavior है जो open-world systems को बनाने में संतोषजनक बनाता है।</p>
<p>हवा TSL vertex shader में एक sine wave है, जो blade के V coordinate से modulate होती है ताकि tips झूलें और जड़ें टिकी रहें। gentle, strong, और off के बीच घूमने के लिए V toggle करें। हवा सभी 80K clumps पर एक साथ शून्य CPU लागत के साथ चलती है क्योंकि यह पूरी तरह vertex shader में है।</p>
<p>Spike 7 ने 50K grass instances का test किया था और हम limit छूने को लेकर घबराए हुए थे। Spike 29 compute terrain, seam stitching, multi-material texturing, और brushes के ऊपर 80K चलाता है। कम <code>InstancedMesh</code> draws में batch करना अब भी per-blade vertex count घटाने से ज़्यादा मायने रखता है। Spike 7 का सबक टिका रहा।</p>
<p>एक चीज़ हमने टाल दी: जब आप grass के नीचे sculpt करते हैं तो वह update नहीं होती। instance matrices scatter के समय set होती हैं। एक पहाड़ी को घाटी में sculpt करो और grass हवा में लटकती रहती है जब तक आप दोबारा scatter करने के लिए G toggle न करें। एक spike के लिए काफी अच्छा। production को dirty-chunk re-scatter चाहिए होगा।</p>
<h2 id="पहला-कदम" tabindex="-1">पहला कदम <a class="header-anchor" href="#पहला-कदम" aria-label="Permalink to &quot;पहला कदम&quot;"></a></h2>
<p>Spike 30 वही है जिस पर मैं बार-बार लौटता रहता हूं।</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/30-physics/" title="Spike 30 Terrain Physics" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/30-physics/" target="_blank">Spike 30 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=30-physics">source देखें</a></p>
<p>कोई physics library नहीं। 120Hz fixed timestep पर custom capsule। production codebase एक web worker में Rapier इस्तेमाल करता है (Spike 2 ने साबित किया कि latency ठीक है), पर इस spike को collision queries को ही साबित करना था। क्या एक character heightmap terrain पर चल सकता है, sculpt किए SDF terrain पर कदम रख सकता है, और नीचे से न गिरे?</p>
<p>मूल हिस्सा <code>terrainQuery(x, y, z)</code> नाम का एक function है। यह जांचता है कि position किसी MC-locked chunk के अंदर पड़ती है या नहीं। अगर हां, तो यह CPU SDF mirror को trilinearly interpolate करता है और gradient को surface normal के रूप में लौटाता है। वरना, central-difference normal के साथ heightmap lookup। character को पता नहीं होता कि वह किस terrain system पर खड़ा है। वह बस ज़मीन मांगता है और एक जवाब पा जाता है।</p>
<p>SDF collision वह हिस्सा था जिसके मुश्किल होने की मुझे उम्मीद थी। capsule के चारों ओर सात probe points (नीचे, बीच, ऊपर, चार cardinal offsets)। position <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="1.373ex" height="1.005ex" role="img" focusable="false" viewBox="0 -444 607 444" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D431" d="M227 0Q212 3 121 3Q40 3 28 0H21V62H117L245 213L109 382H26V444H34Q49 441 143 441Q247 441 265 444H274V382H246L281 339Q315 297 316 297Q320 297 354 341L389 382H352V444H360Q375 441 466 441Q547 441 559 444H566V382H471L355 246L504 63L545 62H586V0H578Q563 3 469 3Q365 3 347 0H338V62H366Q366 63 326 112T285 163L198 63L217 62H235V0H227Z" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mrow data-mjx-texclass="ORD"><mi mathvariant="bold">x</mi></mrow></math></mjx-assistive-mml></mjx-container> पर एक probe तब penetrate कर रहा होता है जब <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="8.519ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 3765.6 1000" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D719" d="M409 688Q413 694 421 694H429H442Q448 688 448 686Q448 679 418 563Q411 535 404 504T392 458L388 442Q388 441 397 441T429 435T477 418Q521 397 550 357T579 260T548 151T471 65T374 11T279 -10H275L251 -105Q245 -128 238 -160Q230 -192 227 -198T215 -205H209Q189 -205 189 -198Q189 -193 211 -103L234 -11Q234 -10 226 -10Q221 -10 206 -8T161 6T107 36T62 89T43 171Q43 231 76 284T157 370T254 422T342 441Q347 441 348 445L378 567Q409 686 409 688ZM122 150Q122 116 134 91T167 53T203 35T237 27H244L337 404Q333 404 326 403T297 395T255 379T211 350T170 304Q152 276 137 237Q122 191 122 150ZM500 282Q500 320 484 347T444 385T405 400T381 404H378L332 217L284 29Q284 27 285 27Q293 27 317 33T357 47Q400 66 431 100T475 170T494 234T500 282Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(596,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(985,0)"><g data-mml-node="mi"><path data-c="1D431" d="M227 0Q212 3 121 3Q40 3 28 0H21V62H117L245 213L109 382H26V444H34Q49 441 143 441Q247 441 265 444H274V382H246L281 339Q315 297 316 297Q320 297 354 341L389 382H352V444H360Q375 441 466 441Q547 441 559 444H566V382H471L355 246L504 63L545 62H586V0H578Q563 3 469 3Q365 3 347 0H338V62H366Q366 63 326 112T285 163L198 63L217 62H235V0H227Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(1592,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(2258.8,0)"><path data-c="3C" d="M694 -11T694 -19T688 -33T678 -40Q671 -40 524 29T234 166L90 235Q83 240 83 250Q83 261 91 266Q664 540 678 540Q681 540 687 534T694 519T687 505Q686 504 417 376L151 250L417 124Q686 -4 687 -5Q694 -11 694 -19Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(3314.6,0)"><path data-c="1D45F" d="M21 287Q22 290 23 295T28 317T38 348T53 381T73 411T99 433T132 442Q161 442 183 430T214 408T225 388Q227 382 228 382T236 389Q284 441 347 441H350Q398 441 422 400Q430 381 430 363Q430 333 417 315T391 292T366 288Q346 288 334 299T322 328Q322 376 378 392Q356 405 342 405Q286 405 239 331Q229 315 224 298T190 165Q156 25 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 114 189T154 366Q154 405 128 405Q107 405 92 377T68 316T57 280Q55 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>ϕ</mi><mo stretchy="false">(</mo><mrow data-mjx-texclass="ORD"><mi mathvariant="bold">x</mi></mrow><mo stretchy="false">)</mo><mo>&lt;</mo><mi>r</mi></math></mjx-assistive-mml></mjx-container>, penetration depth <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="12.423ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 5491 1000" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D45D" d="M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(780.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(1836.6,0)"><path data-c="1D45F" d="M21 287Q22 290 23 295T28 317T38 348T53 381T73 411T99 433T132 442Q161 442 183 430T214 408T225 388Q227 382 228 382T236 389Q284 441 347 441H350Q398 441 422 400Q430 381 430 363Q430 333 417 315T391 292T366 288Q346 288 334 299T322 328Q322 376 378 392Q356 405 342 405Q286 405 239 331Q229 315 224 298T190 165Q156 25 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 114 189T154 366Q154 405 128 405Q107 405 92 377T68 316T57 280Q55 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(2509.8,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(3510,0)"><path data-c="1D719" d="M409 688Q413 694 421 694H429H442Q448 688 448 686Q448 679 418 563Q411 535 404 504T392 458L388 442Q388 441 397 441T429 435T477 418Q521 397 550 357T579 260T548 151T471 65T374 11T279 -10H275L251 -105Q245 -128 238 -160Q230 -192 227 -198T215 -205H209Q189 -205 189 -198Q189 -193 211 -103L234 -11Q234 -10 226 -10Q221 -10 206 -8T161 6T107 36T62 89T43 171Q43 231 76 284T157 370T254 422T342 441Q347 441 348 445L378 567Q409 686 409 688ZM122 150Q122 116 134 91T167 53T203 35T237 27H244L337 404Q333 404 326 403T297 395T255 379T211 350T170 304Q152 276 137 237Q122 191 122 150ZM500 282Q500 320 484 347T444 385T405 400T381 404H378L332 217L284 29Q284 27 285 27Q293 27 317 33T357 47Q400 66 431 100T475 170T494 234T500 282Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(4106,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(4495,0)"><g data-mml-node="mi"><path data-c="1D431" d="M227 0Q212 3 121 3Q40 3 28 0H21V62H117L245 213L109 382H26V444H34Q49 441 143 441Q247 441 265 444H274V382H246L281 339Q315 297 316 297Q320 297 354 341L389 382H352V444H360Q375 441 466 441Q547 441 559 444H566V382H471L355 246L504 63L545 62H586V0H578Q563 3 469 3Q365 3 347 0H338V62H366Q366 63 326 112T285 163L198 63L217 62H235V0H227Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(5102,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>p</mi><mo>=</mo><mi>r</mi><mo>−</mo><mi>ϕ</mi><mo stretchy="false">(</mo><mrow data-mjx-texclass="ORD"><mi mathvariant="bold">x</mi></mrow><mo stretchy="false">)</mo></math></mjx-assistive-mml></mjx-container> के साथ, और push-out दिशा field gradient <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -1.238ex;" xmlns="http://www.w3.org/2000/svg" width="9.256ex" height="3.445ex" role="img" focusable="false" viewBox="0 -975.7 4091.1 1522.8" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mover"><g data-mml-node="mi"><path data-c="1D45B" d="M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(300,16) translate(-250 0)"><path data-c="5E" d="M112 560L249 694L257 686Q387 562 387 560L361 531Q359 532 303 581L250 627L195 580Q182 569 169 557T148 538L140 532Q138 530 125 546L112 560Z" style="stroke-width: 3;"/></g></g></g><g data-mml-node="mo" transform="translate(877.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mfrac" transform="translate(1933.6,0)"><g data-mml-node="mrow" transform="translate(573.6,485) scale(0.707)"><g data-mml-node="mi"><path data-c="2207" d="M46 676Q46 679 51 683H781Q786 679 786 676Q786 674 617 326T444 -26Q439 -33 416 -33T388 -26Q385 -22 216 326T46 676ZM697 596Q697 597 445 597T193 596Q195 591 319 336T445 80L697 596Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(833,0)"><path data-c="1D719" d="M409 688Q413 694 421 694H429H442Q448 688 448 686Q448 679 418 563Q411 535 404 504T392 458L388 442Q388 441 397 441T429 435T477 418Q521 397 550 357T579 260T548 151T471 65T374 11T279 -10H275L251 -105Q245 -128 238 -160Q230 -192 227 -198T215 -205H209Q189 -205 189 -198Q189 -193 211 -103L234 -11Q234 -10 226 -10Q221 -10 206 -8T161 6T107 36T62 89T43 171Q43 231 76 284T157 370T254 422T342 441Q347 441 348 445L378 567Q409 686 409 688ZM122 150Q122 116 134 91T167 53T203 35T237 27H244L337 404Q333 404 326 403T297 395T255 379T211 350T170 304Q152 276 137 237Q122 191 122 150ZM500 282Q500 320 484 347T444 385T405 400T381 404H378L332 217L284 29Q284 27 285 27Q293 27 317 33T357 47Q400 66 431 100T475 170T494 234T500 282Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mrow" transform="translate(220,-370.3) scale(0.707)"><g data-mml-node="mo"><path data-c="2016" d="M133 736Q138 750 153 750Q164 750 170 739Q172 735 172 250T170 -239Q164 -250 152 -250Q144 -250 138 -244L137 -243Q133 -241 133 -179T132 250Q132 731 133 736ZM329 739Q334 750 346 750Q353 750 361 744L362 743Q366 741 366 679T367 250T367 -178T362 -243L361 -244Q355 -250 347 -250Q335 -250 329 -239Q327 -235 327 250T329 739Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(500,0)"><path data-c="2207" d="M46 676Q46 679 51 683H781Q786 679 786 676Q786 674 617 326T444 -26Q439 -33 416 -33T388 -26Q385 -22 216 326T46 676ZM697 596Q697 597 445 597T193 596Q195 591 319 336T445 80L697 596Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(1333,0)"><path data-c="1D719" d="M409 688Q413 694 421 694H429H442Q448 688 448 686Q448 679 418 563Q411 535 404 504T392 458L388 442Q388 441 397 441T429 435T477 418Q521 397 550 357T579 260T548 151T471 65T374 11T279 -10H275L251 -105Q245 -128 238 -160Q230 -192 227 -198T215 -205H209Q189 -205 189 -198Q189 -193 211 -103L234 -11Q234 -10 226 -10Q221 -10 206 -8T161 6T107 36T62 89T43 171Q43 231 76 284T157 370T254 422T342 441Q347 441 348 445L378 567Q409 686 409 688ZM122 150Q122 116 134 91T167 53T203 35T237 27H244L337 404Q333 404 326 403T297 395T255 379T211 350T170 304Q152 276 137 237Q122 191 122 150ZM500 282Q500 320 484 347T444 385T405 400T381 404H378L332 217L284 29Q284 27 285 27Q293 27 317 33T357 47Q400 66 431 100T475 170T494 234T500 282Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(1929,0)"><path data-c="2016" d="M133 736Q138 750 153 750Q164 750 170 739Q172 735 172 250T170 -239Q164 -250 152 -250Q144 -250 138 -244L137 -243Q133 -241 133 -179T132 250Q132 731 133 736ZM329 739Q334 750 346 750Q353 750 361 744L362 743Q366 741 366 679T367 250T367 -178T362 -243L361 -244Q355 -250 347 -250Q335 -250 329 -239Q327 -235 327 250T329 739Z" style="stroke-width: 3;"/></g></g><rect width="1917.6" height="60" x="120" y="220"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mrow data-mjx-texclass="ORD"><mover><mi>n</mi><mo stretchy="false">^</mo></mover></mrow><mo>=</mo><mfrac><mrow><mi mathvariant="normal">∇</mi><mi>ϕ</mi></mrow><mrow><mo data-mjx-texclass="OPEN" fence="false" stretchy="false">‖</mo><mi mathvariant="normal">∇</mi><mi>ϕ</mi><mo data-mjx-texclass="CLOSE" fence="false" stretchy="false">‖</mo></mrow></mfrac></math></mjx-assistive-mml></mjx-container> होती है। capsule को surface में दोबारा घुसने से रोकने के लिए, velocity को उसके inward component को रद्द करने के लिए project किया जाता है:</p>
<mjx-container tabindex="0" class="MathJax" jax="SVG" display="true" style="direction: ltr; display: block; text-align: center; margin: 1em 0; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="17.018ex" height="2.398ex" role="img" focusable="false" viewBox="0 -810 7521.9 1060" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msup"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D42F" d="M401 444Q413 441 495 441Q568 441 574 444H580V382H510L409 156Q348 18 339 6Q331 -4 320 -4Q318 -4 313 -4T303 -3H288Q273 -3 264 12T221 102Q206 135 197 156L96 382H26V444H34Q49 441 145 441Q252 441 270 444H279V382H231L284 264Q335 149 338 149Q338 150 389 264T442 381Q442 382 418 382H394V444H401Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(640,413) scale(0.707)"><path data-c="2032" d="M79 43Q73 43 52 49T30 61Q30 68 85 293T146 528Q161 560 198 560Q218 560 240 545T262 501Q262 496 260 486Q259 479 173 263T84 45T79 43Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(1162.2,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(2218,0)"><g data-mml-node="mi"><path data-c="1D42F" d="M401 444Q413 441 495 441Q568 441 574 444H580V382H510L409 156Q348 18 339 6Q331 -4 320 -4Q318 -4 313 -4T303 -3H288Q273 -3 264 12T221 102Q206 135 197 156L96 382H26V444H34Q49 441 145 441Q252 441 270 444H279V382H231L284 264Q335 149 338 149Q338 150 389 264T442 381Q442 382 418 382H394V444H401Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(3047.2,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(4047.5,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(4436.5,0)"><g data-mml-node="mi"><path data-c="1D42F" d="M401 444Q413 441 495 441Q568 441 574 444H580V382H510L409 156Q348 18 339 6Q331 -4 320 -4Q318 -4 313 -4T303 -3H288Q273 -3 264 12T221 102Q206 135 197 156L96 382H26V444H34Q49 441 145 441Q252 441 270 444H279V382H231L284 264Q335 149 338 149Q338 150 389 264T442 381Q442 382 418 382H394V444H401Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(5265.7,0)"><path data-c="22C5" d="M78 250Q78 274 95 292T138 310Q162 310 180 294T199 251Q199 226 182 208T139 190T96 207T78 250Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(5765.9,0)"><g data-mml-node="mover"><g data-mml-node="mi"><path data-c="1D45B" d="M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(300,16) translate(-250 0)"><path data-c="5E" d="M112 560L249 694L257 686Q387 562 387 560L361 531Q359 532 303 581L250 627L195 580Q182 569 169 557T148 538L140 532Q138 530 125 546L112 560Z" style="stroke-width: 3;"/></g></g></g><g data-mml-node="mo" transform="translate(6365.9,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g><g data-mml-node="mstyle" transform="translate(6754.9,0)"><g data-mml-node="mspace"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(6921.9,0)"><g data-mml-node="mover"><g data-mml-node="mi"><path data-c="1D45B" d="M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(300,16) translate(-250 0)"><path data-c="5E" d="M112 560L249 694L257 686Q387 562 387 560L361 531Q359 532 303 581L250 627L195 580Q182 569 169 557T148 538L140 532Q138 530 125 546L112 560Z" style="stroke-width: 3;"/></g></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="block" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; overflow: hidden; width: 100%;"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><msup><mrow data-mjx-texclass="ORD"><mi mathvariant="bold">v</mi></mrow><mo data-mjx-alternate="1">′</mo></msup><mo>=</mo><mrow data-mjx-texclass="ORD"><mi mathvariant="bold">v</mi></mrow><mo>−</mo><mo stretchy="false">(</mo><mrow data-mjx-texclass="ORD"><mi mathvariant="bold">v</mi></mrow><mo>⋅</mo><mrow data-mjx-texclass="ORD"><mover><mi>n</mi><mo stretchy="false">^</mo></mover></mrow><mo stretchy="false">)</mo><mstyle scriptlevel="0"><mspace width="0.167em"/></mstyle><mrow data-mjx-texclass="ORD"><mover><mi>n</mi><mo stretchy="false">^</mo></mover></mrow></math></mjx-assistive-mml></mjx-container><p>जो केवल surface के साथ slide करने वाला component छोड़ देता है। यह कोई physics engine नहीं है। यह geometry queries और साधारण response है। पर यह caves, overhangs, और sculpt किए tunnels को प्रति आकार शून्य special-case code के साथ संभालता है। आप एक ऐसी cave में चलते हैं जो आपने दस सेकंड पहले काटी थी और capsule छत के contour का बिल्कुल पीछा करता है।</p>
<p>movement model practical शुरू हुआ और मज़ेदार बन गया। walk, run, sprint, jump, 45 degrees से ऊपर slope sliding। फिर मैंने एक BotW paraglider जोड़ा और spike कुछ ऐसा बन गया जिसे मैं बंद नहीं करना चाहता था।</p>
<p>हवा में रहते हुए Space दबाएं। gravity -30 से -4 पर गिर जाती है। गिरने की रफ्तार -3 पर थम जाती है। scale interpolation के साथ capsule से एक delta-wing mesh खुलता है। बाएं bank करें और wing झुक जाता है। capsule का facing velocity vector की ओर अपने आप align हो जाता है ताकि आप हमेशा वहीं देख रहे हों जहां आप जा रहे हैं। गिरने के लिए Space छोड़ दें। ज़मीन पर पहुंचो और आप फिर से दौड़ रहे होते हैं।</p>
<p>camera पीछे हटकर third-person में चली जाती है (P toggle)। यह yaw smoothing के साथ player के पीछे चलती है। player से camera तक एक ray-march 20 steps पर terrain test करता है। एक cave में उड़ो और camera arm rock में से गुज़रने के बजाय smoothly छोटी हो जाती है। दूसरी तरफ निकलो और यह वापस बाहर फैल जाती है।</p>
<p>यह रहा वह पल जिसने spike को सार्थक बनाया: heightmap brush से एक ऊंची cliff sculpt करो। third-person camera पर switch करो। किनारे तक दौड़ो। कूदो। glider deploy करो। उसी terrain के ऊपर बाएं bank करो जो आपने अभी sculpt किया, Spike 29 में आपकी उगाई grass नीचे लहराते हुए, cliff face पर Spike 28 की rock texture, हर chunk सीमा पर टिके Transvoxel seams। दूसरी तरफ land करो। सब कुछ एक browser tab में एक साथ काम कर रहा।</p>
<h2 id="अपने-ही-पैरों-के-नीचे-sculpting" tabindex="-1">अपने ही पैरों के नीचे sculpting <a class="header-anchor" href="#अपने-ही-पैरों-के-नीचे-sculpting" aria-label="Permalink to &quot;अपने ही पैरों के नीचे sculpting&quot;"></a></h2>
<p>एक चीज़ को लेकर मुझे यकीन नहीं था: क्या होता है जब आप उस terrain को sculpt करते हैं जिस पर character खड़ा है? heightmap के बदलाव <code>terrainQuery()</code> के ज़रिए तुरंत propagate होते हैं क्योंकि यह सीधे CPU buffer पढ़ता है। SDF बदलाव CPU SDF mirror के ज़रिए propagate होते हैं। capsule अगले physics tick पर penetration हल कर लेता है, जो 120Hz पर <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.816ex;" xmlns="http://www.w3.org/2000/svg" width="9.304ex" height="2.773ex" role="img" focusable="false" viewBox="0 -864.9 4112.2 1225.5" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mfrac"><g data-mml-node="mn" transform="translate(573.6,394) scale(0.707)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(220,-345) scale(0.707)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" transform="translate(500,0)" style="stroke-width: 3;"/><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(1000,0)" style="stroke-width: 3;"/></g><rect width="1260.7" height="60" x="120" y="220"/></g><g data-mml-node="mo" transform="translate(1778.4,0)"><path data-c="2248" d="M55 319Q55 360 72 393T114 444T163 472T205 482Q207 482 213 482T223 483Q262 483 296 468T393 413L443 381Q502 346 553 346Q609 346 649 375T694 454Q694 465 698 474T708 483Q722 483 722 452Q722 386 675 338T555 289Q514 289 468 310T388 357T308 404T224 426Q164 426 125 393T83 318Q81 289 69 289Q55 289 55 319ZM55 85Q55 126 72 159T114 210T163 238T205 248Q207 248 213 248T223 249Q262 249 296 234T393 179L443 147Q502 112 553 112Q609 112 649 141T694 220Q694 249 708 249T722 217Q722 153 675 104T555 55Q514 55 468 76T388 123T308 170T224 192Q164 192 125 159T83 84Q80 55 69 55Q55 55 55 85Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(2834.2,0)"><path data-c="38" d="M70 417T70 494T124 618T248 666Q319 666 374 624T429 515Q429 485 418 459T392 417T361 389T335 371T324 363L338 354Q352 344 366 334T382 323Q457 264 457 174Q457 95 399 37T249 -22Q159 -22 101 29T43 155Q43 263 172 335L154 348Q133 361 127 368Q70 417 70 494ZM286 386L292 390Q298 394 301 396T311 403T323 413T334 425T345 438T355 454T364 471T369 491T371 513Q371 556 342 586T275 624Q268 625 242 625Q201 625 165 599T128 534Q128 511 141 492T167 463T217 431Q224 426 228 424L286 386ZM250 21Q308 21 350 55T392 137Q392 154 387 169T375 194T353 216T330 234T301 253T274 270Q260 279 244 289T218 306L210 311Q204 311 181 294T133 239T107 157Q107 98 150 60T250 21Z" style="stroke-width: 3;"/><path data-c="2E" d="M78 60Q78 84 95 102T138 120Q162 120 180 104T199 61Q199 36 182 18T139 0T96 17T78 60Z" transform="translate(500,0)" style="stroke-width: 3;"/><path data-c="33" d="M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z" transform="translate(778,0)" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mfrac><mn>1</mn><mn>120</mn></mfrac><mo>≈</mo><mn>8.3</mn></math></mjx-assistive-mml></mjx-container> ms के भीतर होता है।</p>
<p>यह बस काम करता है। player के नीचे ज़मीन उठाओ और वे उसके साथ उठते हैं। ज़मीन काट दो और वे गिरते हैं। कोई special handling नहीं। physics इतनी तेज़ चलती है कि single-frame terrain बदलाव कभी बड़ी penetrations नहीं पैदा करते। यह timestep के लिए 120Hz चुनने का एक सुखद इत्तेफाक था। हमने इसे smooth movement के लिए चुना था, और इसने terrain editing को मुफ्त में सुरक्षित बना दिया।</p>
<h2 id="_30-spikes-बाद" tabindex="-1">30 spikes बाद <a class="header-anchor" href="#_30-spikes-बाद" aria-label="Permalink to &quot;30 spikes बाद&quot;"></a></h2>
<p>हमने इस series की शुरुआत एक flat heightmap और 500 cubes से की थी। अब हमारे पास volumetric caves के साथ sculpt किया terrain है, Transvoxel seam stitching, surface के आकार पर react करती multi-material texturing, हवा में झूलते 80,000 grass clumps, और एक character जो इन सब पर चलता, sprint करता, कूदता, और glide करता है।</p>
<p>इसमें से कुछ भी अभी production में नहीं है। <code>world/client/</code> codebase अब भी साधारण heightmap chunks के साथ WebGL चलाता है। इन 30 spikes का सब कुछ standalone HTML pages में रहता है। integration का काम अगला है: <code>WebGPURenderer</code> पर migrate करना, hybrid HM/MC policy को chunk manager में wire करना, brush और material systems को multiplayer से जोड़ना।</p>
<p>पर rendering system अब जोखिम नहीं है। खुले सवाल data flow के बारे में हैं: edit persistence, brush strokes का network sync, collaborative sculpting। वह चीज़ें जो players के बीच होती हैं, triangles के बीच नहीं।</p>
<p>अगर आपने इस series को भाग 1 से follow किया है, बिखरे हुए हिस्सों के साथ टिके रहने के लिए शुक्रिया। अगर आपने इसे अभी पाया है, <a href="/hi/blog/2026-02-25-open-world-browser-part-01-risk-first.html">भाग 1</a> पर वापस जाएं। गलत मोड़ ही वह जगह हैं जहां सबक रहते हैं।</p>
<h2 id="इस-अध्याय-में-जिन-तकनीकों-का-ज़िक्र-हुआ" tabindex="-1">इस अध्याय में जिन तकनीकों का ज़िक्र हुआ <a class="header-anchor" href="#इस-अध्याय-में-जिन-तकनीकों-का-ज़िक्र-हुआ" aria-label="Permalink to &quot;इस अध्याय में जिन तकनीकों का ज़िक्र हुआ&quot;"></a></h2>
<p><strong>TSL (Three Shading Language).</strong> WebGPU renderer के लिए Three.js का node-आधारित shader system। Materials, JavaScript में function composition का इस्तेमाल करते हुए nodes (<code>positionWorld</code>, <code>normalWorld</code>, <code>smoothstep</code>, <code>triplanarTexture</code>) से बनती हैं। shader graph runtime पर WGSL में compile होती है। TSL, WebGPU targets के लिए raw GLSL <code>ShaderMaterial</code> की जगह लेता है और standard Three.js material features (lights, shadows, fog) और custom per-fragment logic के बीच interop देता है।</p>
<p><strong>Triplanar mapping.</strong> एक texture projection तकनीक जो एक texture को तीन बार (XY, XZ, YZ planes) sample करती है और surface normal दिशा के आधार पर blend करती है। यह मनमानी mesh geometry पर UV stretching खत्म कर देती है, जो marching cubes output के लिए ज़रूरी है जहां triangles के पास कोई सार्थक UV coordinates नहीं होतीं। TSL एक built-in node के रूप में <code>triplanarTexture()</code> देता है।</p>
<p><strong>Cross-quad blades के साथ instanced vegetation.</strong> हर grass clump 60-degree कोणों पर 3 एक-दूसरे को काटते quads होते हैं, जो हर view दिशा से एक volumetric दिखावट बनाते हैं। प्रति quad 4 vertical segments wind animation के लिए smooth bending की अनुमति देते हैं। पूरा field हर chunk पर एक अकेले <code>InstancedMesh</code> के रूप में render होता है। capacity को 25% ज़्यादा allocate किया जाता है ताकि जब terrain edit हो तो नई instances GPU buffer को दोबारा allocate किए बिना reserved slots भर सकें। vegetation पर हमारी <a href="/hi/guides/landscape-generation-browser.html#vegetation-and-foliage">landscape generation guide</a> देखें।</p>
<p><strong>Capsule बनाम SDF collision.</strong> physics engine के बिना volumetric terrain के खिलाफ character collision। capsule को SDF के खिलाफ कई points पर probe किया जाता है। जहां field value capsule radius से कम होती है, gradient बाहरी normal देता है और अंतर penetration depth देता है। यह caves, overhangs, और tunnels को बिना किसी shape-specific code के संभालता है। <a href="/hi/guides/landscape-generation-browser.html#physics-on-sdf-terrain">SDF terrain collisions</a> देखें।</p>
<p><strong>Fixed-timestep character controller.</strong> Physics, frame rate की परवाह किए बिना 120Hz पर step करती है, real time जमा करते हुए और उसे fixed-size steps में खपाते हुए। एक max substep count धीमी frames पर spiral-of-death रोकता है। Ground snapping slope traversal के दौरान capsule को जुड़ा रखता है। fixed timestep भविष्य के multiplayer replay के लिए deterministic behavior सुनिश्चित करता है।</p>
<hr>
<p>29 में से भाग 14।
पिछला: <a href="/hi/blog/2026-04-13-open-world-browser-part-13-terrain-sculpting.html">भाग 13 - Terrain sculpting और math function की मौत</a>
अगला: <a href="/hi/blog/2026-04-13-open-world-browser-part-15-multiplayer-and-water.html">भाग 15 - baseline को बदलो, फिर उसे sync करो</a>
Series guide: <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">/hi/blog/2026-02-25-open-world-browser-series-guide</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Browser में open world बनाना, भाग 15: baseline बदलें, फिर उसे sync करें]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-04-13-open-world-browser-part-15-multiplayer-and-water</link>
            <guid>https://app.cinevva.com/hi/blog/2026-04-13-open-world-browser-part-15-multiplayer-and-water</guid>
            <pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Spikes 31-32 ने यह तय किया कि legacy world को सबसे अच्छे spike से बदला जाए, फिर brush-param replay multiplayer साबित किया और swimming के साथ एक ocean जोड़ा।]]></description>
            <content:encoded><![CDATA[<h1 id="browser-में-open-world-बनाना-भाग-15-baseline-बदलें-फिर-उसे-sync-करें" tabindex="-1">Browser में open world बनाना, भाग 15: baseline बदलें, फिर उसे sync करें <a class="header-anchor" href="#browser-में-open-world-बनाना-भाग-15-baseline-बदलें-फिर-उसे-sync-करें" aria-label="Permalink to &quot;Browser में open world बनाना, भाग 15: baseline बदलें, फिर उसे sync करें&quot;"></a></h1>
<p><em>लेखक <a href="/hi/about.html">Oleg Sidorkin</a>, Cinevva के CTO और सह-संस्थापक</em></p>
<p>यहां नए हैं? <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">series guide</a> का इस्तेमाल करें। यह बताती है कि spike क्या होता है और सभी भागों को जोड़ती है।</p>
<p>पहले चौदह भागों ने spikes 1 से 30 तक को कवर किया। वह सिलसिला एक ऐसे terrain system के साथ खत्म हुआ जिसे real time में sculpt किया जा सकता था, साथ ही एक character जो उस पर चल सकता था, glide कर सकता था, और गिर सकता था। यह भाग series को spike 31 से फिर शुरू करता है, और सबसे पहली चीज जो हमें तय करनी थी वह तकनीकी नहीं थी। वह यह थी कि उस सारे spike code का क्या किया जाए।</p>
<h2 id="replace-करो-backport-नहीं-वाला-फैसला" tabindex="-1">&quot;replace करो, backport नहीं&quot; वाला फैसला <a class="header-anchor" href="#replace-करो-backport-नहीं-वाला-फैसला" aria-label="Permalink to &quot;&quot;replace करो, backport नहीं&quot; वाला फैसला&quot;"></a></h2>
<p>हमारे पास 30 standalone HTML files थीं, हर एक एक अलग-थलग concept साबित करती हुई, और शून्य integration। production वाला <code>world/client/</code> अभी भी पुराना stack था: WebGL, एक सरल heightmap, एक 75-line का character controller, नौ message types वाला एक MessagePack protocol। कोई editing नहीं, कोई WebGPU नहीं, कोई materials नहीं, कोई vegetation नहीं।</p>
<p>साफ-सीधा plan यह था कि spike के नतीजों को एक-एक करके उस production codebase में backport किया जाए। हमने उसे फेंक दिया। spike 30 के पास पहले से ही <code>world/client/</code> से कहीं बेहतर terrain, physics, materials, vegetation, और camera था। पुराने WebGL code में backport करने का मतलब था पूरे रास्ते उससे लड़ना। तो हमने यह फैसला लिया कि world implementation को सबसे सफल spike से बदल दें और आगे बनाएं। spike 30 नया baseline बन गया, और <code>world/client/</code> dead code बन गया।</p>
<p>इसने बाकी काम को नए सिरे से परिभाषित किया। &quot;शानदार single-player tech demo&quot; से &quot;product&quot; तक पहुंचने के लिए हमें multiplayer, persistence, infinite-world streaming, और object placement चाहिए था। multiplayer terrain sync पहले आया, क्योंकि यही वह है जो architecture को मजबूर करता है। यह जिस सवाल का जवाब देता है वह पूछना आसान है और गलत होने पर महंगा पड़ता है: जब Player A sculpt करता है, तो असल में wire पर क्या जाता है?</p>
<h2 id="brush-param-replay-pixel-sync-नहीं" tabindex="-1">brush-param replay, pixel sync नहीं <a class="header-anchor" href="#brush-param-replay-pixel-sync-नहीं" aria-label="Permalink to &quot;brush-param replay, pixel sync नहीं&quot;"></a></h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/31-multiplayer-sync/" title="Spike 31 Multiplayer Terrain Sync" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/31-multiplayer-sync/" target="_blank">Spike 31 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=31-multiplayer-sync">source देखें</a></p>
<p>network code की एक line लिखने से पहले, हमने ठीक-ठीक यह पता लगाया कि एक brush stroke क्या करता है। heightmap brush cursor के चारों ओर एक radius में एक CPU <code>Float32Array</code> में घूमता है, एक smoothstep falloff लगाता है, और या तो add, subtract, smooth, या flatten करता है। SDF brush वही चीज voxels के एक sphere पर 3D में करता है। दोनों paths शुद्ध CPU array math हैं। loop में कोई GPU compute नहीं, कोई randomness नहीं, कोई nondeterministic floating point नहीं। वही input array और वही params हर machine पर वही output देते हैं।</p>
<p>बस यही पूरी तरकीब है। हम edit किया गया terrain नहीं भेजते। हम brush parameters भेजते हैं, प्रति stroke tick 56 bytes, और हर client वही deterministic function फिर से चलाता है। sync protocol में चार message types हैं: peer discovery, brush message <code>{op, wx, wy, wz, radius, strength, flattenTarget}</code>, और 20Hz पर एक player-position message।</p>
<p>spike के लिए हमने server को पूरी तरह छोड़ दिया और <code>BroadcastChannel</code> इस्तेमाल किया, जो same-origin cross-tab messaging के लिए browser API है। दो tabs खोलें, वे बात करते हैं, शून्य infrastructure। यह sync वाले सवाल को latency, auth, और Durable Object wiring से अलग कर देता है। अगर param replay tabs के बीच converge करता है, तो यह WebSocket के पार भी converge करेगा।</p>
<p>एक ही जगह है जहां replay diverge हो सकता है, वह है order-dependent operations। Raise और lower commutative हैं, तो <code>val + strength * falloff</code> एक जैसा ही उतरता है चाहे किसने पहले लगाया हो। Smooth और flatten neighbor values पढ़ते हैं, तो ठीक उसी spot को ठीक उसी पल में smooth करते दो clients प्रति tick एक millimeter के अंशों जितना drift कर सकते हैं। व्यवहार में यह कभी नहीं होता, और production fix पहले से ही साफ है: edits को DO के जरिए route करें, उसे एक monotonic sequence number assign करने दें, client पर optimistically apply करें, और अगर authoritative sequence असहमत हो तो order ठीक कर दें। classic optimistic concurrency, और DO वैसे भी एक स्वाभाविक serialization point है।</p>
<h2 id="वह-peer-capsule-जो-बार-बार-गायब-होती-रही" tabindex="-1">वह peer capsule जो बार-बार गायब होती रही <a class="header-anchor" href="#वह-peer-capsule-जो-बार-बार-गायब-होती-रही" aria-label="Permalink to &quot;वह peer capsule जो बार-बार गायब होती रही&quot;"></a></h2>
<p>Edits पहली ही कोशिश में sync हो गए। remote player का capsule नहीं हुआ। यह दूसरे tab पर अस्तित्व में आता-जाता टिमटिमाता रहा, और इसे ठोस बनाए रखने में तीन अलग bugs लगे।</p>
<p>capsule world origin पर spawn हुआ, जो terrain के नीचे दबा है, क्योंकि <code>join</code> message किसी भी position data से पहले आता है। Fix: इसे hidden शुरू करें और पहले position update पर इसे दिखाएं। position broadcast render loop के भीतर रहता था, और Chrome unfocused tabs पर <code>requestAnimationFrame</code> को throttle करता है, तो दूसरे tab का staleness check peer को हटा देता और अगला message उसे फिर बना देता। Fix: broadcast को <code>setInterval</code> पर ले जाएं, जो visible tabs के लिए throttle नहीं होता। और staleness timeout बहुत ज्यादा aggressive 5 seconds था, किसी भी GC pause से trip हो जाता था। Fix: इसे 30 seconds तक बढ़ाएं और normal closes के लिए साफ <code>leave</code> message पर भरोसा करें।</p>
<h2 id="persistence-और-late-join-एक-ही-format" tabindex="-1">persistence और late-join, एक ही format <a class="header-anchor" href="#persistence-और-late-join-एक-ही-format" aria-label="Permalink to &quot;persistence और late-join, एक ही format&quot;"></a></h2>
<p>हमने persistence को एक नया spike शुरू करने के बजाय उसी spike में मोड़ दिया, क्योंकि serialization format एक जैसा है चाहे destination IndexedDB हो या कोई दूसरा tab। एक snapshot में पूरा heightmap (एक 129×129 <code>Float32Array</code>, करीब 66 KB) होता है, साथ केवल edit किए गए SDF chunks (हर एक <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.05ex;" xmlns="http://www.w3.org/2000/svg" width="3.25ex" height="2.003ex" role="img" focusable="false" viewBox="0 -863.3 1436.6 885.3" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msup"><g data-mml-node="mn"><path data-c="36" d="M42 313Q42 476 123 571T303 666Q372 666 402 630T432 550Q432 525 418 510T379 495Q356 495 341 509T326 548Q326 592 373 601Q351 623 311 626Q240 626 194 566Q147 500 147 364L148 360Q153 366 156 373Q197 433 263 433H267Q313 433 348 414Q372 400 396 374T435 317Q456 268 456 210V192Q456 169 451 149Q440 90 387 34T253 -22Q225 -22 199 -14T143 16T92 75T56 172T42 313ZM257 397Q227 397 205 380T171 335T154 278T148 216Q148 133 160 97T198 39Q222 21 251 21Q302 21 329 59Q342 77 347 104T352 209Q352 289 347 316T329 361Q302 397 257 397Z" style="stroke-width: 3;"/><path data-c="35" d="M164 157Q164 133 148 117T109 101H102Q148 22 224 22Q294 22 326 82Q345 115 345 210Q345 313 318 349Q292 382 260 382H254Q176 382 136 314Q132 307 129 306T114 304Q97 304 95 310Q93 314 93 485V614Q93 664 98 664Q100 666 102 666Q103 666 123 658T178 642T253 634Q324 634 389 662Q397 666 402 666Q410 666 410 648V635Q328 538 205 538Q174 538 149 544L139 546V374Q158 388 169 396T205 412T256 420Q337 420 393 355T449 201Q449 109 385 44T229 -22Q148 -22 99 32T50 154Q50 178 61 192T84 210T107 214Q132 214 148 197T164 157Z" transform="translate(500,0)" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(1033,393.1) scale(0.707)"><path data-c="33" d="M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><msup><mn>65</mn><mn>3</mn></msup></math></mjx-assistive-mml></mjx-container>, करीब 1.1 MB) और marching-cubes mode में locked chunk IDs की list। एक debounced save आखिरी edit के दो seconds बाद IndexedDB में लिखता है। load पर, procedural terrain synchronously generate होता है और फिर saved state पहले meaningful frame से पहले उसे overwrite कर देता है। late-join बिल्कुल वही bytes दोबारा इस्तेमाल करता है: जब कोई नया tab join करता है, तो edits वाला एक मौजूदा tab अपनी state serialize करके नए आने वाले को targeted भेजता है, और जो पहाड़ आपने पांच मिनट पहले sculpt किया था वह उनकी screen पर दिखता है।</p>
<p>पहले persistence test ने एक बढ़िया ordering bug सामने ला दिया। घास init पर procedural heights का इस्तेमाल करके synchronously बिखेरी जाती है, लेकिन IndexedDB restore async है और बाद में heightmap को overwrite कर देता है, जिससे हर blade floating या धंसी रह जाती है। fix एक <code>refreshAllGrass()</code> pass है जो हर instance के नीचे की height को फिर से sample करता है और किसी भी ऐसी blade को छिपा देता है जो अब किसी खराब slope या altitude पर है। यही function load और late-join दोनों के लिए काम आता है।</p>
<h2 id="slope-की-दास्तान" tabindex="-1">slope की दास्तान <a class="header-anchor" href="#slope-की-दास्तान" aria-label="Permalink to &quot;slope की दास्तान&quot;"></a></h2>
<p>Sculpt किया गया terrain smooth procedural baseline से ज्यादा rough होता है, और इसने तीन physics bugs उजागर कर दिए जो पुराना terrain कभी नहीं कर पाता था। सीधे ऊपर की ओर चढ़ते हुए capsule बगल में slide करने लगता था। वजह एक velocity projection थी जो movement को ground के tangent बनाए रखने के लिए थी, लेकिन normal के केवल horizontal components के साथ लिखी गई थी। normal <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="15.967ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 7057.3 1000" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(389,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(1167,0)"><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" style="stroke-width: 3;"/><path data-c="2E" d="M78 60Q78 84 95 102T138 120Q162 120 180 104T199 61Q199 36 182 18T139 0T96 17T78 60Z" transform="translate(500,0)" style="stroke-width: 3;"/><path data-c="33" d="M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z" transform="translate(778,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(2445,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(2889.7,0)"><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" style="stroke-width: 3;"/><path data-c="2E" d="M78 60Q78 84 95 102T138 120Q162 120 180 104T199 61Q199 36 182 18T139 0T96 17T78 60Z" transform="translate(500,0)" style="stroke-width: 3;"/><path data-c="39" d="M352 287Q304 211 232 211Q154 211 104 270T44 396Q42 412 42 436V444Q42 537 111 606Q171 666 243 666Q245 666 249 666T257 665H261Q273 665 286 663T323 651T370 619T413 560Q456 472 456 334Q456 194 396 97Q361 41 312 10T208 -22Q147 -22 108 7T68 93T121 149Q143 149 158 135T173 96Q173 78 164 65T148 49T135 44L131 43Q131 41 138 37T164 27T206 22H212Q272 22 313 86Q352 142 352 280V287ZM244 248Q292 248 321 297T351 430Q351 508 343 542Q341 552 337 562T323 588T293 615T246 625Q208 625 181 598Q160 576 154 546T147 441Q147 358 152 329T172 282Q197 248 244 248Z" transform="translate(778,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(4167.7,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(4612.3,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(5390.3,0)"><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" style="stroke-width: 3;"/><path data-c="2E" d="M78 60Q78 84 95 102T138 120Q162 120 180 104T199 61Q199 36 182 18T139 0T96 17T78 60Z" transform="translate(500,0)" style="stroke-width: 3;"/><path data-c="33" d="M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z" transform="translate(778,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(6668.3,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo stretchy="false">(</mo><mo>−</mo><mn>0.3</mn><mo>,</mo><mn>0.9</mn><mo>,</mo><mo>−</mo><mn>0.3</mn><mo stretchy="false">)</mo></math></mjx-assistive-mml></mjx-container> वाली एक diagonal slope पर, उत्तर की ओर चलने से कहीं से sideways velocity inject हो जाती थी। ground snap पहले से ही player को surface पर रखता है, तो हमने बस projection को delete कर दिया।</p>
<p>drift एक दूसरे स्रोत से बना रहा। SDF collision probes body को gradient के साथ penetration depth जितना बाहर धकेलते हैं। किसी भी slope पर gradient के horizontal components होते हैं, तो 15° slope पर 0.1 m penetration प्रति step करीब 0.026 m बगल में धकेलता है, और 120Hz पर यह करीब 3 m/s का अदृश्य drift है। Fix: response को slope के हिसाब से बांटें। walkable ground पर (<mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.874ex;" xmlns="http://www.w3.org/2000/svg" width="5.379ex" height="2.444ex" role="img" focusable="false" viewBox="0 -694 2377.5 1080.3" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mtext"><path data-c="67" d="M329 409Q373 453 429 453Q459 453 472 434T485 396Q485 382 476 371T449 360Q416 360 412 390Q410 404 415 411Q415 412 416 414V415Q388 412 363 393Q355 388 355 386Q355 385 359 381T368 369T379 351T388 325T392 292Q392 230 343 187T222 143Q172 143 123 171Q112 153 112 133Q112 98 138 81Q147 75 155 75T227 73Q311 72 335 67Q396 58 431 26Q470 -13 470 -72Q470 -139 392 -175Q332 -206 250 -206Q167 -206 107 -175Q29 -140 29 -75Q29 -39 50 -15T92 18L103 24Q67 55 67 108Q67 155 96 193Q52 237 52 292Q52 355 102 398T223 442Q274 442 318 416L329 409ZM299 343Q294 371 273 387T221 404Q192 404 171 388T145 343Q142 326 142 292Q142 248 149 227T179 192Q196 182 222 182Q244 182 260 189T283 207T294 227T299 242Q302 258 302 292T299 343ZM403 -75Q403 -50 389 -34T348 -11T299 -2T245 0H218Q151 0 138 -6Q118 -15 107 -34T95 -74Q95 -84 101 -97T122 -127T170 -155T250 -167Q319 -167 361 -139T403 -75Z" style="stroke-width: 3;"/><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(500,0)" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(892,0)" style="stroke-width: 3;"/><path data-c="64" d="M376 495Q376 511 376 535T377 568Q377 613 367 624T316 637H298V660Q298 683 300 683L310 684Q320 685 339 686T376 688Q393 689 413 690T443 693T454 694H457V390Q457 84 458 81Q461 61 472 55T517 46H535V0Q533 0 459 -5T380 -11H373V44L365 37Q307 -11 235 -11Q158 -11 96 50T34 215Q34 315 97 378T244 442Q319 442 376 393V495ZM373 342Q328 405 260 405Q211 405 173 369Q146 341 139 305T131 211Q131 155 138 120T173 59Q203 26 251 26Q322 26 373 103V342Z" transform="translate(1392,0)" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(1981,-241.4) scale(0.707)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mtext>grad</mtext><mi>y</mi></msub></math></mjx-assistive-mml></mjx-container> walk threshold से ऊपर) push केवल vertical होता है। walls और cliffs पर पूरा 3D push रहता है, क्योंकि ठीक वहीं आप deflect होना चाहते हैं। हमने walkable limit को भी <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.05ex;" xmlns="http://www.w3.org/2000/svg" width="6.798ex" height="1.667ex" role="img" focusable="false" viewBox="0 -715 3004.7 737" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="63" d="M370 305T349 305T313 320T297 358Q297 381 312 396Q317 401 317 402T307 404Q281 408 258 408Q209 408 178 376Q131 329 131 219Q131 137 162 90Q203 29 272 29Q313 29 338 55T374 117Q376 125 379 127T395 129H409Q415 123 415 120Q415 116 411 104T395 71T366 33T318 2T249 -11Q163 -11 99 53T34 214Q34 318 99 383T250 448T370 421T404 357Q404 334 387 320Z" style="stroke-width: 3;"/><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z" transform="translate(444,0)" style="stroke-width: 3;"/><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" transform="translate(944,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(1338,0)"><path data-c="2061" d="" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(1504.7,0)"><path data-c="34" d="M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z" style="stroke-width: 3;"/><path data-c="35" d="M164 157Q164 133 148 117T109 101H102Q148 22 224 22Q294 22 326 82Q345 115 345 210Q345 313 318 349Q292 382 260 382H254Q176 382 136 314Q132 307 129 306T114 304Q97 304 95 310Q93 314 93 485V614Q93 664 98 664Q100 666 102 666Q103 666 123 658T178 642T253 634Q324 634 389 662Q397 666 402 666Q410 666 410 648V635Q328 538 205 538Q174 538 149 544L139 546V374Q158 388 169 396T205 412T256 420Q337 420 393 355T449 201Q449 109 385 44T229 -22Q148 -22 99 32T50 154Q50 178 61 192T84 210T107 214Q132 214 148 197T164 157Z" transform="translate(500,0)" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(2504.7,0)"><g data-mml-node="mo"><path data-c="B0" d="M147 628Q147 669 179 692T244 715Q298 715 325 689T352 629Q352 592 323 567T249 542Q202 542 175 567T147 628ZM313 628Q313 660 300 669T259 678H253Q248 678 242 678T234 679Q217 679 207 674T192 659T188 644T187 629Q187 600 198 590Q210 579 250 579H265Q279 579 288 581T305 595T313 628Z" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>cos</mi><mo data-mjx-texclass="NONE">⁡</mo><mn>45</mn><mrow data-mjx-texclass="ORD"><mo data-mjx-pseudoscript="true">°</mo></mrow></math></mjx-assistive-mml></mjx-container> से बढ़ाकर <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.05ex;" xmlns="http://www.w3.org/2000/svg" width="6.798ex" height="1.667ex" role="img" focusable="false" viewBox="0 -715 3004.7 737" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="63" d="M370 305T349 305T313 320T297 358Q297 381 312 396Q317 401 317 402T307 404Q281 408 258 408Q209 408 178 376Q131 329 131 219Q131 137 162 90Q203 29 272 29Q313 29 338 55T374 117Q376 125 379 127T395 129H409Q415 123 415 120Q415 116 411 104T395 71T366 33T318 2T249 -11Q163 -11 99 53T34 214Q34 318 99 383T250 448T370 421T404 357Q404 334 387 320Z" style="stroke-width: 3;"/><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z" transform="translate(444,0)" style="stroke-width: 3;"/><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" transform="translate(944,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(1338,0)"><path data-c="2061" d="" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(1504.7,0)"><path data-c="36" d="M42 313Q42 476 123 571T303 666Q372 666 402 630T432 550Q432 525 418 510T379 495Q356 495 341 509T326 548Q326 592 373 601Q351 623 311 626Q240 626 194 566Q147 500 147 364L148 360Q153 366 156 373Q197 433 263 433H267Q313 433 348 414Q372 400 396 374T435 317Q456 268 456 210V192Q456 169 451 149Q440 90 387 34T253 -22Q225 -22 199 -14T143 16T92 75T56 172T42 313ZM257 397Q227 397 205 380T171 335T154 278T148 216Q148 133 160 97T198 39Q222 21 251 21Q302 21 329 59Q342 77 347 104T352 209Q352 289 347 316T329 361Q302 397 257 397Z" style="stroke-width: 3;"/><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(500,0)" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(2504.7,0)"><g data-mml-node="mo"><path data-c="B0" d="M147 628Q147 669 179 692T244 715Q298 715 325 689T352 629Q352 592 323 567T249 542Q202 542 175 567T147 628ZM313 628Q313 660 300 669T259 678H253Q248 678 242 678T234 679Q217 679 207 674T192 659T188 644T187 629Q187 600 198 590Q210 579 250 579H265Q279 579 288 581T305 595T313 628Z" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>cos</mi><mo data-mjx-texclass="NONE">⁡</mo><mn>60</mn><mrow data-mjx-texclass="ORD"><mo data-mjx-pseudoscript="true">°</mo></mrow></math></mjx-assistive-mml></mjx-container> कर दिया ताकि brush से बनी पहाड़ियां वैसी climbable महसूस हों जैसी Breath of the Wild में होती हैं।</p>
<p>तीसरे bug ने chunk boundaries पर capsule को freeze कर दिया, क्योंकि collision probes एक ही chunk के SDF को sample करते थे और जब कोई probe neighbor में पार जाता तो &quot;deep in air&quot; sentinel मिलता था। fix था <code>sdfSampleWorld(wx, wy, wz)</code> और <code>sdfGradientWorld(...)</code>, जो किसी भी world position के लिए सही chunk ढूंढते हैं और जहां कोई SDF मौजूद नहीं वहां एक heightmap distance estimate पर fall back करते हैं। SDF-से-heightmap collision transition अब continuous है।</p>
<h2 id="पानी-दुनिया-को-पूरा-करता-है" tabindex="-1">पानी दुनिया को पूरा करता है <a class="header-anchor" href="#पानी-दुनिया-को-पूरा-करता-है" aria-label="Permalink to &quot;पानी दुनिया को पूरा करता है&quot;"></a></h2>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/32-water-swimming/" title="Spike 32 Water and Swimming" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/32-water-swimming/" target="_blank">Spike 32 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=32-water-swimming">source देखें</a></p>
<p>यहां तक हर spike &quot;पानी के ऊपर जमीन&quot; था। Spike 32 ने एक ocean जोड़ा, और उसके साथ एक नया movement verb। हमने एक ऐसे terrain में water level 22 पर सेट किया जो करीब 8 से 58 तक फैला है, जो निचली घाटियों को भर देता है, shoreline पर beaches छोड़ देता है, और खेलने के लिए काफी सूखी जमीन रखता है।</p>
<p>surface एक <code>MeshStandardNodeMaterial</code> है जो TSL में बना है, terrain जैसा ही node approach। अलग-अलग frequencies पर तीन overlapping sine waves vertices को displace करती हैं, और surface normal mesh normals के बजाय उन waves के analytic cosine derivatives से आता है। Color एक depth estimate <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="24.614ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 10879.3 1000" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(389,0)"><path data-c="6C" d="M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(278,0)" style="stroke-width: 3;"/><path data-c="76" d="M338 431Q344 429 422 429Q479 429 503 431H508V385H497Q439 381 423 345Q421 341 356 172T288 -2Q283 -11 263 -11Q244 -11 239 -2Q99 359 98 364Q93 378 82 381T43 385H19V431H25L33 430Q41 430 53 430T79 430T104 429T122 428Q217 428 232 431H240V385H226Q187 384 184 370Q184 366 235 234L286 102L377 341V349Q377 363 367 372T349 383T335 385H331V431H338Z" transform="translate(722,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(1250,0)" style="stroke-width: 3;"/><path data-c="6C" d="M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z" transform="translate(1694,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(2583.2,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(3583.4,0)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(4295.7,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(5295.9,0)"><path data-c="77" d="M90 368Q84 378 76 380T40 385H18V431H24L43 430Q62 430 84 429T116 428Q206 428 221 431H229V385H215Q177 383 177 368Q177 367 221 239L265 113L339 328L333 345Q323 374 316 379Q308 384 278 385H258V431H264Q270 428 348 428Q439 428 454 431H461V385H452Q404 385 404 369Q404 366 418 324T449 234T481 143L496 100L537 219Q579 341 579 347Q579 363 564 373T530 385H522V431H529Q541 428 624 428Q692 428 698 431H703V385H697Q696 385 691 385T682 384Q635 377 619 334L559 161Q546 124 528 71Q508 12 503 1T487 -11H479Q460 -11 456 -4Q455 -3 407 133L361 267Q359 263 266 -4Q261 -11 243 -11H238Q225 -11 220 -3L90 368Z" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(722,0)" style="stroke-width: 3;"/><path data-c="76" d="M338 431Q344 429 422 429Q479 429 503 431H508V385H497Q439 381 423 345Q421 341 356 172T288 -2Q283 -11 263 -11Q244 -11 239 -2Q99 359 98 364Q93 378 82 381T43 385H19V431H25L33 430Q41 430 53 430T79 430T104 429T122 428Q217 428 232 431H240V385H226Q187 384 184 370Q184 366 235 234L286 102L377 341V349Q377 363 367 372T349 383T335 385H331V431H338Z" transform="translate(1222,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(1750,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(7489.9,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(8101.1,0)"><path data-c="D7" d="M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(9101.3,0)"><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" style="stroke-width: 3;"/><path data-c="2E" d="M78 60Q78 84 95 102T138 120Q162 120 180 104T199 61Q199 36 182 18T139 0T96 17T78 60Z" transform="translate(500,0)" style="stroke-width: 3;"/><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" transform="translate(778,0)" style="stroke-width: 3;"/><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" transform="translate(1278,0)" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo stretchy="false">(</mo><mtext>level</mtext><mo>−</mo><mi>y</mi><mo>+</mo><mtext>wave</mtext><mo stretchy="false">)</mo><mo>×</mo><mn>0.12</mn></math></mjx-assistive-mml></mjx-container> का इस्तेमाल करके turquoise shallows से dark teal depths तक blend होता है, जो <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="4.526ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 2000.7 1000" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="5B" d="M118 -250V750H255V710H158V-210H255V-250H118Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(278,0)"><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(778,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(1222.7,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(1722.7,0)"><path data-c="5D" d="M22 710V750H159V-250H22V-210H119V710H22Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo stretchy="false">[</mo><mn>0</mn><mo>,</mo><mn>1</mn><mo stretchy="false">]</mo></math></mjx-assistive-mml></mjx-container> तक clamp किया गया है, foam वहां उठता है जहां वह estimate shoreline पर शून्य के करीब आता है, और alpha depth का अनुसरण करता है तो shallow water transparent पढ़ता है और deep water लगभग opaque।</p>
<p>Swimming एक buoyancy spring है। player swim mode में आता है जब feet water level से नीचे गिरते हैं और body center surface से एक capsule half-height के भीतर होता है। एक spring body को surface के ठीक नीचे एक target की ओर खींचता है, और 4 की water damping के खिलाफ 12 के buoyancy constant के साथ player अपना सिर बाहर रखकर stably bob करता है, कोई oscillation नहीं। Swim speed floaty acceleration और drag के साथ walking से धीमी है, surface के पास jump करने पर आप normal jump velocity के 60% पर बाहर launch होते हैं, और entry downward velocity को -5 m/s पर cap करता है ताकि आप plunge न करें। Terrain collision अभी भी underwater चलता है, तो आप lake bed पर चल सकते हैं जहां वह swim target से ऊपर उठता है। swimming flag position broadcast के साथ चलता है तो peers आपको swim करते देखते हैं, और एक HTML gradient overlay view को tint करता है जब camera surface से नीचे डुबकी लगाता है।</p>
<h2 id="इस-अध्याय-में-संदर्भित-तकनीक" tabindex="-1">इस अध्याय में संदर्भित तकनीक <a class="header-anchor" href="#इस-अध्याय-में-संदर्भित-तकनीक" aria-label="Permalink to &quot;इस अध्याय में संदर्भित तकनीक&quot;"></a></h2>
<p><strong>Deterministic brush-param replay.</strong> Edit किया गया terrain stream करने के बजाय, हर client केवल brush parameters भेजता है और वही CPU function फिर से चलाता है। यह इसलिए काम करता है क्योंकि heightmap और SDF दोनों brushes बिना किसी randomness या GPU nondeterminism के शुद्ध <code>Float32Array</code> math हैं, तो एक जैसे inputs हर जगह bit-identical outputs पैदा करते हैं। Payload प्रति stroke tick 56 bytes है। Commutative operations (raise, lower) order की परवाह किए बिना converge होते हैं, जबकि neighbor पढ़ने वाले operations (smooth, flatten) को convergence की गारंटी के लिए एक serialization point चाहिए, जो production Durable Object monotonic sequence numbers के जरिए देता है।</p>
<p><strong>WebSocket के विकल्प के रूप में BroadcastChannel.</strong> शून्य server के साथ same-origin cross-tab messaging के लिए एक browser API। यहां इसे sync protocol को network latency और authentication से अलग करके test करने के लिए इस्तेमाल किया गया। serialization format (raw <code>Float32Array</code> heightmap साथ edit किए गए SDF chunks साथ MC-locked chunk IDs) वही bytes हैं जो IndexedDB persistence और late-join state transfer के लिए इस्तेमाल होते हैं, तो एक format तीन काम संभालता है।</p>
<p><strong>Slope-split SDF collision response.</strong> जब कोई capsule probe volumetric terrain में penetrate करता है, तो भोला-भाला fix body को SDF gradient के साथ penetration depth जितना बाहर धकेलता है। slopes पर उस gradient के horizontal components होते हैं, जो lateral drift inject करते हैं। response को इस तरह बांटना कि walkable surfaces (<mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.874ex;" xmlns="http://www.w3.org/2000/svg" width="5.379ex" height="2.444ex" role="img" focusable="false" viewBox="0 -694 2377.5 1080.3" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mtext"><path data-c="67" d="M329 409Q373 453 429 453Q459 453 472 434T485 396Q485 382 476 371T449 360Q416 360 412 390Q410 404 415 411Q415 412 416 414V415Q388 412 363 393Q355 388 355 386Q355 385 359 381T368 369T379 351T388 325T392 292Q392 230 343 187T222 143Q172 143 123 171Q112 153 112 133Q112 98 138 81Q147 75 155 75T227 73Q311 72 335 67Q396 58 431 26Q470 -13 470 -72Q470 -139 392 -175Q332 -206 250 -206Q167 -206 107 -175Q29 -140 29 -75Q29 -39 50 -15T92 18L103 24Q67 55 67 108Q67 155 96 193Q52 237 52 292Q52 355 102 398T223 442Q274 442 318 416L329 409ZM299 343Q294 371 273 387T221 404Q192 404 171 388T145 343Q142 326 142 292Q142 248 149 227T179 192Q196 182 222 182Q244 182 260 189T283 207T294 227T299 242Q302 258 302 292T299 343ZM403 -75Q403 -50 389 -34T348 -11T299 -2T245 0H218Q151 0 138 -6Q118 -15 107 -34T95 -74Q95 -84 101 -97T122 -127T170 -155T250 -167Q319 -167 361 -139T403 -75Z" style="stroke-width: 3;"/><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(500,0)" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(892,0)" style="stroke-width: 3;"/><path data-c="64" d="M376 495Q376 511 376 535T377 568Q377 613 367 624T316 637H298V660Q298 683 300 683L310 684Q320 685 339 686T376 688Q393 689 413 690T443 693T454 694H457V390Q457 84 458 81Q461 61 472 55T517 46H535V0Q533 0 459 -5T380 -11H373V44L365 37Q307 -11 235 -11Q158 -11 96 50T34 215Q34 315 97 378T244 442Q319 442 376 393V495ZM373 342Q328 405 260 405Q211 405 173 369Q146 341 139 305T131 211Q131 155 138 120T173 59Q203 26 251 26Q322 26 373 103V342Z" transform="translate(1392,0)" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(1981,-241.4) scale(0.707)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mtext>grad</mtext><mi>y</mi></msub></math></mjx-assistive-mml></mjx-container> threshold से ऊपर) को केवल vertical push मिले, जबकि steep surfaces पूरा 3D push साथ velocity projection रखें, wall collision खोए बिना drift हटा देता है। देखें <a href="/hi/guides/landscape-generation-browser.html#physics-on-sdf-terrain">SDF terrain collisions</a>।</p>
<p><strong>Analytic wave normals के साथ TSL water.</strong> ocean एक node material है जिसके vertices तीन जोड़ी गई sine waves से displace होते हैं। displacement के बाद mesh normals फिर से compute करने के बजाय, surface normal wave functions के cosine derivatives से analytically निकाला जाता है, जो सस्ता है और एक coarse grid पर finite-difference normals के artifacts से बचता है। Depth-driven color, shoreline foam, और depth-driven transparency सब एक ही depth estimate पर key करते हैं।</p>
<p><strong>Buoyancy-spring swimming.</strong> Swim physics body को surface के ठीक नीचे एक target की ओर खींचे गए एक damped spring के रूप में model करता है। buoyancy constant 12 और damping 4 के साथ, player बिना oscillate किए surface पर settle हो जाता है। अलग movement constants (धीमी speed, floaty acceleration, भारी drag) swimming को walking से एक अलग feel देते हैं, और मौजूदा capsule-vs-terrain collision underwater काम करता रहता है।</p>
<hr>
<p>29 में से भाग 15।
पिछला: <a href="/hi/blog/2026-04-13-open-world-browser-part-14-world-comes-alive.html">भाग 14 - दुनिया जीवंत हो उठती है</a>
अगला: <a href="/hi/blog/2026-04-28-open-world-browser-part-16-structure-and-authoring.html">भाग 16 - एक ऐसी दुनिया के लिए structure जो बढ़ती रहती है</a>
Series guide: <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">/hi/blog/2026-02-25-open-world-browser-series-guide</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Cubcoats × Cinevva: Game Concepts वन-पेजर]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-03-19-cubcoats-game-concepts-one-pager</link>
            <guid>https://app.cinevva.com/hi/blog/2026-03-19-cubcoats-game-concepts-one-pager</guid>
            <pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[स्केच-से-वीडियो-से-3D pipeline और Kali the Kitty पर आधारित तीन शैक्षिक game concepts (Golden Tree, Kali's Word Island, Island Stories)। licensing या partner pitch के लिए।]]></description>
            <content:encoded><![CDATA[<h1 id="cubcoats-×-cinevva-game-concepts-वन-पेजर" tabindex="-1">Cubcoats × Cinevva: Game Concepts वन-पेजर <a class="header-anchor" href="#cubcoats-×-cinevva-game-concepts-वन-पेजर" aria-label="Permalink to &quot;Cubcoats × Cinevva: Game Concepts वन-पेजर&quot;"></a></h1>
<p><em>स्केच-से-वीडियो-से-3D pipeline और Kali the Kitty (Cubcoats) पर आधारित। licensing, blog, या partner pitch के लिए।</em></p>
<p><strong>PDF के रूप में शेयर करने के लिए:</strong> यह पेज खोलें, फिर अपने browser के <strong>File → Print → Save as PDF</strong> का इस्तेमाल करें।</p>
<hr>
<h2 id="golden-tree-—-पूरा-वन-पेजर" tabindex="-1">Golden Tree — पूरा वन-पेजर <a class="header-anchor" href="#golden-tree-—-पूरा-वन-पेजर" aria-label="Permalink to &quot;Golden Tree — पूरा वन-पेजर&quot;"></a></h2>
<p><strong>Tagline:</strong> <em>एक दुनिया जो आपके साथ बढ़ती है। आएँ, पानी दें, देखें। कोई levels नहीं। कोई दबाव नहीं।</em></p>
<table tabindex="0">
<thead>
<tr>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>उम्र</strong></td>
<td>3–13 (व्यापक)</td>
</tr>
<tr>
<td><strong>Format</strong></td>
<td>एपिसोडिक साझा 3D दुनिया + हर हफ्ते के छोटे &quot;moments&quot;</td>
</tr>
<tr>
<td><strong>Platform</strong></td>
<td>Web (और बाद में mobile); कम झंझट, कोई install ज़रूरी नहीं</td>
</tr>
<tr>
<td><strong>Viral hook</strong></td>
<td>&quot;अपने दोस्त को एक बीज भेजें।&quot; साझा growth, शेयर करने लायक शांत clips।</td>
</tr>
</tbody>
</table>
<h3 id="यह-क्या-है" tabindex="-1">यह क्या है <a class="header-anchor" href="#यह-क्या-है" aria-label="Permalink to &quot;यह क्या है&quot;"></a></h3>
<p>एक शांत, इकट्ठा करने लायक दुनिया जो <strong>असली दुनिया के समय</strong> में आगे बढ़ती है। एक साझा &quot;season&quot; (जैसे Spring Island): एक अकेला 3D द्वीप जिसमें बच्चे घूम-फिर सकते हैं (खेलने लायक Kali demo की तरह)। यहाँ पारंपरिक levels या scores नहीं हैं। Progression यह है कि <strong>आपके पेड़ में एक नई शाखा आई</strong>, <strong>आपने 12 moments देखे</strong>, <strong>किसी ने आपके बीज को पानी दिया</strong>।</p>
<p>हर बार आने पर एक बच्चा यह कर सकता है: <strong>एक पौधे को पानी देना</strong>, <strong>एक wish छोड़ना</strong> (text या emoji), <strong>एक छिपे हुए Cubcoats किरदार को ढूँढना</strong>, या <strong>एक 30-सेकंड का &quot;moment&quot; देखना</strong> (जैसे सुनहरे पेड़ के नीचे Kali)। नए moments और छोटी कहानी की कड़ियाँ <strong>हर हफ्ते</strong> आती हैं (एपिसोडिक)। वैकल्पिक रूप में हल्की-फुल्की भाषा: &quot;आज Kali ने कहा: [EN और ZH में एक लाइन]।&quot;</p>
<p>सीखना और बढ़ना <strong>अवचेतन</strong> रहता है: themes (दयालुता, धैर्य, फिर से कोशिश करना) लेखन और आर्ट में बसते हैं, पाठों में नहीं। यह अनुभव किसी खिलौने या साझा जगह जैसा लगता है, स्कूल जैसा नहीं।</p>
<h3 id="core-loop" tabindex="-1">Core loop <a class="header-anchor" href="#core-loop" aria-label="Permalink to &quot;Core loop&quot;"></a></h3>
<ol>
<li>द्वीप पर <strong>आएँ</strong> (browser या app)।</li>
<li>हर बार आने पर <strong>एक कोमल काम करें</strong>: पानी दें, wish छोड़ें, किसी किरदार को ढूँढें, या एक moment देखें।</li>
<li>दिनों/हफ्तों में <strong>दुनिया को बदलते देखें</strong> (नए फूल, किरदारों के नए poses, नई छोटी clips)।</li>
<li>किसी दोस्त को एक बीज <strong>शेयर करें</strong> या &quot;किसी दोस्त के द्वीप पर जाएँ&quot; ताकि growth सामाजिक लगे।</li>
</ol>
<h3 id="यह-लेख-वाली-pipeline-और-किरदारों-का-इस्तेमाल-कैसे-करता-है" tabindex="-1">यह लेख वाली pipeline और किरदारों का इस्तेमाल कैसे करता है <a class="header-anchor" href="#यह-लेख-वाली-pipeline-और-किरदारों-का-इस्तेमाल-कैसे-करता-है" aria-label="Permalink to &quot;यह लेख वाली pipeline और किरदारों का इस्तेमाल कैसे करता है&quot;"></a></h3>
<ul>
<li><strong>3D खेलने लायक दुनिया:</strong> Kali demo वाली ही pipeline: T-pose → 3D Model Generator → rigging → Cinevva Engine। द्वीप और किरदार घूमने लायक हैं, third-person, कम जोखिम वाले।</li>
<li><strong>सुनहरा पेड़:</strong> सीधे लेख से (Kali का &quot;डर से उम्मीद&quot; वाला पल और जादुई सुनहरा पेड़)। पेड़ इस season का भावनात्मक और दृश्य केंद्र है।</li>
<li><strong>छोटे &quot;moments&quot;:</strong> लेख वाले वर्टिकल शॉर्ट की तरह बनाए गए: start frame + end frame + motion prompt → Video Generator (Kling 3.0 Pro), 9:16, ~15 s। हर हफ्ते की एक drop एक छोटी कहानी की कड़ी है।</li>
<li><strong>Cubcoats IP:</strong> Kali और बाकी सात किरदार, द्वीप वाली दुनिया, और गर्म, गोलाई लिए हुए आर्ट style। यह एक डिजिटल, एपिसोडिक product के साथ licensing-first relaunch (2026) में बिलकुल फिट बैठता है।</li>
</ul>
<h3 id="यह-viral-क्यों-हो-सकता-है" tabindex="-1">यह viral क्यों हो सकता है <a class="header-anchor" href="#यह-viral-क्यों-हो-सकता-है" aria-label="Permalink to &quot;यह viral क्यों हो सकता है&quot;"></a></h3>
<ul>
<li><strong>कम झंझट:</strong> एक link, कोई भारी onboarding नहीं। &quot;अपने दोस्त को एक बीज भेजें&quot; एक आसान share है।</li>
<li><strong>शांत, ख़ूबसूरत clips:</strong> छोटे moments अपने आप में शेयर करने लायक हैं (social, &quot;ये 15 सेकंड देखो&quot;)। अच्छे तरीके से meme-friendly।</li>
<li><strong>एपिसोडिक:</strong> &quot;इस हफ्ते नया क्या है?&quot; बार-बार आने और बातचीत को बढ़ावा देता है।</li>
<li><strong>अवचेतन:</strong> माता-पिता देखते हैं &quot;शांत, रचनात्मक, कोई ads नहीं, कोई तनाव नहीं&quot;; बच्चों को routine, धैर्य, और कोमल आश्चर्य मिलता है बिना किसी सीधे पाठ के।</li>
</ul>
<h3 id="cinevva-blog-के-लिए-संभावित-angle" tabindex="-1">Cinevva blog के लिए संभावित angle <a class="header-anchor" href="#cinevva-blog-के-लिए-संभावित-angle" aria-label="Permalink to &quot;Cinevva blog के लिए संभावित angle&quot;"></a></h3>
<p><em>&quot;हमने Kali को एक स्केच से वीडियो तक और फिर एक ऐसे किरदार तक पहुँचाया जिसके इर्द-गिर्द आप घूम सकते हैं। Golden Tree अगला कदम है: एक दुनिया जो असली समय में बढ़ती है, जहाँ बच्चे आते हैं, पानी देते हैं, और छोटे moments देखते हैं—कोई levels नहीं, कोई दबाव नहीं। वही pipeline। नया format।&quot;</em></p>
<hr>
<h2 id="kali-s-word-island-—-एक-नज़र-में" tabindex="-1">Kali's Word Island — एक नज़र में <a class="header-anchor" href="#kali-s-word-island-—-एक-नज़र-में" aria-label="Permalink to &quot;Kali's Word Island — एक नज़र में&quot;"></a></h2>
<table tabindex="0">
<thead>
<tr>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Tagline</strong></td>
<td>Kali और दोस्तों की द्वीप उगाने में मदद करें। साथ-साथ English और Chinese सीखें।</td>
</tr>
<tr>
<td><strong>उम्र</strong></td>
<td>5–11</td>
</tr>
<tr>
<td><strong>Focus</strong></td>
<td>बच्चों के लिए English ↔ Chinese; मजबूत gamification और progression।</td>
</tr>
</tbody>
</table>
<p><strong>Core idea:</strong> Cubcoats द्वीप किरदार-zones में बँटा है (Kali का जंगल, किसी और का समुद्र-तट)। बच्चे छोटे tasks करके किरदारों की मदद करते हैं जिनमें EN/ZH समझना और बोलना पड़ता है। Progression = &quot;Seeds → Saplings → Trees → Golden Tree&quot; (जब zone का पेड़ भर जाए तो अगला zone unlock हो)। रोज़ की &quot;lantern&quot; run, इकट्ठा करने लायक phrase cards, किरदारों के &quot;mood&quot; bars, वैकल्पिक parent dashboard। कोई zone पूरा होने पर छोटे कहानी moments (start/end frame style) खुलते हैं। <strong>Pipeline:</strong> किरदारों और भावनात्मक कड़ियों के लिए वही 3D + video pipeline।</p>
<hr>
<h2 id="cubcoats-island-stories-—-एक-नज़र-में" tabindex="-1">Cubcoats: Island Stories — एक नज़र में <a class="header-anchor" href="#cubcoats-island-stories-—-एक-नज़र-में" aria-label="Permalink to &quot;Cubcoats: Island Stories — एक नज़र में&quot;"></a></h2>
<table tabindex="0">
<thead>
<tr>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Tagline</strong></td>
<td>अपना ख़ुद का Cubcoats episode बनाएँ। कहानी को remix करें। अपना version शेयर करें।</td>
</tr>
<tr>
<td><strong>उम्र</strong></td>
<td>3–13 (bands: 3–6, 7–10, 11–13)</td>
</tr>
<tr>
<td><strong>Focus</strong></td>
<td>कहानी बनाना और remix; शिक्षा अंदर बसी है पर मुख्य pitch नहीं।</td>
</tr>
</tbody>
</table>
<p><strong>Core idea:</strong> एपिसोडिक कहानियाँ जहाँ बच्चे branches चुनते हैं (Kali क्या कहती है? वह कहाँ जाती है?)। मुख्य गतिविधि है <strong>remixing</strong>: किरदार, जगह, 2–3 beats चुनें → एक छोटा &quot;episode&quot; तैयार करें (script + सरल visuals, या बाद में AI-जनरेटेड शॉर्ट)। सीखना अवचेतन रहता है (संवाद और चुनावों में शब्दावली और patterns)। Social: अपना episode शेयर करें, किसी और का version खेलें, &quot;kind / funny / surprising&quot; rate करें। <strong>Pipeline:</strong> user-जनरेटेड &quot;moments&quot; के लिए वही किरदार look + two-frame video pipeline; किरदार/दुनिया की एकरूपता के लिए 3D।</p>
<hr>
<p><em>संदर्भित Cinevva tools: Image Generator, Video Generator (Kling 3.0 Pro), 3D Model Generator, auto-rigging, Cinevva Engine। &quot;From sketch to video and playable 3D&quot; (2026-03-04) में बताई गई pipeline को दर्शाता है।</em></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ब्राउज़र में open world बनाने में असल में क्या लगता है]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-03-14-open-world-browser-medium-article</link>
            <guid>https://app.cinevva.com/hi/blog/2026-03-14-open-world-browser-medium-article</guid>
            <pubDate>Sat, 14 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Cinevva की 12-भाग वाली engineering सीरीज़ का एक पत्रकारीय जायज़ा: 24 spike प्रयोग, भद्दे terrain baselines से लेकर GPU marching cubes, streaming LOD और Transvoxel seam debugging तक।]]></description>
            <content:encoded><![CDATA[<h1 id="ब्राउज़र-में-open-world-बनाने-में-असल-में-क्या-लगता-है" tabindex="-1">ब्राउज़र में open world बनाने में असल में क्या लगता है <a class="header-anchor" href="#ब्राउज़र-में-open-world-बनाने-में-असल-में-क्या-लगता-है" aria-label="Permalink to &quot;ब्राउज़र में open world बनाने में असल में क्या लगता है&quot;"></a></h1>
<p><em>लेखक <a href="/hi/about.html">Mariana Muntean</a>, Cinevva की CEO</em></p>
<img src="/img/blog/open-world-browser-120fps.png" alt="The open world running in a browser at 120 FPS — terrain, trees, physics, and a player capsule, all rendered in a single tab" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>Cinevva की टीम ने हाल के game-dev इतिहास की सबसे पारदर्शी engineering डायरियों में से एक प्रकाशित की है: एक <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">12-भाग वाली सीरीज़</a> जो एक ऐसा multiplayer open world बनाने की हमारी कोशिश को दर्ज करती है जो पूरी तरह ब्राउज़र में चलता है। कोई download नहीं। कोई app store नहीं। बस एक URL।</p>
<p>यह प्रोजेक्ट 24 तकनीकी प्रयोगों तक फैला था जिन्हें हम &quot;spikes&quot; कहते हैं, यानी छोटे और केंद्रित prototypes जो हर एक किसी एक जोखिम भरे सवाल का जवाब देने के लिए बनाए गए। हर spike के साथ live सोर्स कोड आता है जिसे आप अभी अपने ब्राउज़र में खोलकर चला सकते हैं। सीरीज़ को <a href="/hi/about.html">Oleg Sidorkin</a>, Cinevva के CTO और सह-संस्थापक, ने लिखा है, और यह marketing से कम और 2026 में ब्राउज़र असल में क्या कर सकते हैं इसके मोर्चे से लिखी एक फील्ड डायरी जैसी ज़्यादा पढ़ने में आती है।</p>
<p>सीरीज़ को पढ़ने लायक बनाने वाली बात, चाहे आप कभी terrain systems बनाने की योजना न भी रखते हों, इसके नीचे छिपा तरीका है। यह इस बात का केस स्टडी है कि किसी महत्वाकांक्षी प्रोजेक्ट को महंगी किसी चीज़ पर प्रतिबद्ध होने से पहले कैसे de-risk किया जाए।</p>
<h2 id="सबसे-मुश्किल-सवाल-से-शुरुआत" tabindex="-1">सबसे मुश्किल सवाल से शुरुआत <a class="header-anchor" href="#सबसे-मुश्किल-सवाल-से-शुरुआत" aria-label="Permalink to &quot;सबसे मुश्किल सवाल से शुरुआत&quot;"></a></h2>
<p>ज़्यादातर open-world प्रोजेक्ट एक तय क्रम में नाकाम होते हैं। पहले आपको एक खूबसूरत concept मिलता है। फिर एक सुंदर scene। फिर आपको पता चलता है कि gameplay के अस्तित्व में आने से पहले ही आपका frame budget खर्च हो चुका था।</p>
<p>हमारी टीम ने क्रम को उलट दिया। <a href="/hi/blog/2026-02-25-open-world-browser-part-01-risk-first.html">पहला spike</a> जानबूझकर भद्दा था: एक 512 मीटर का terrain mesh, 500 instanced objects, procedural height noise, एक water plane और fog। न shadows, न beauty pass। इकलौता सवाल यह था कि क्या ब्राउज़र camera के उसमें घूमते वक्त एक स्थिर frame rate बनाए रख सकता है।</p>
<p>रख सकता था। और उस &quot;हां&quot; ने एक ऐसी चीज़ स्थापित की जिसे Oleg &quot;baseline contract&quot; कहते हैं, यानी एक न्यूनतम scene के लिए एक मापा गया reference cost जिसके सामने हर अगले feature को खुद को सही ठहराना होता था। अगर कोई नया effect शानदार दिखता था पर frame budget को उड़ा देता था, तो वह ship नहीं होता था। कम से कम अभी नहीं।</p>
<p>इस तरह का अनुशासन साफ नज़र आने वाली बात लगती है। हकीकत में, तेज़ी से बदलते prototype माहौल में यह दुर्लभ है, जहां हर कोई अगली visual जीत को लेकर उत्साहित रहता है।</p>
<h2 id="physics-वाला-दांव" tabindex="-1">physics वाला दांव <a class="header-anchor" href="#physics-वाला-दांव" aria-label="Permalink to &quot;physics वाला दांव&quot;"></a></h2>
<p><a href="/hi/blog/2026-02-25-open-world-browser-part-02-worker-physics.html">दूसरे प्रयोग</a> ने एक architectural बहस को सुलझाया जो ब्राउज़र game developers को बांटती है: क्या physics को main thread पर चलना चाहिए, जहां यह आसान है, या एक Web Worker में, जहां यह rendering को block नहीं कर सकती?</p>
<p>Worker-आधारित physics कागज़ पर ज़्यादा साफ-सुथरी है। हकीकत में, डर latency का है। हर input event को एक message boundary दो बार पार करनी पड़ती है: एक बार worker तक पहुंचने के लिए, एक बार result वापस लाने के लिए। अगर यह आना-जाना बहुत धीमा हो, तो कोई key दबाने और अपने character को हिलते देखने के बीच चीज़ें सुस्त महसूस होंगी।</p>
<p>टीम ने Rapier physics engine (Rust से WebAssembly में compile किया गया) को एक dedicated worker में जोड़ा, message pipeline तैयार किया, और मापा। overhead नगण्य था। controls अब भी तुरंत महसूस होते थे। लेकिन हमने सावधानी से यह नोट किया कि हमने एक खास scenario को verify किया था, कोई सार्वभौमिक नियम नहीं। जब बाद में GPU दबाव और streaming की जटिलता बदली, तो धारणाओं को फिर से जांचना ज़रूरी होगा।</p>
<h2 id="वे-उबाऊ-spikes-जिन्होंने-प्रोजेक्ट-को-बचाया" tabindex="-1">वे उबाऊ spikes जिन्होंने प्रोजेक्ट को बचाया <a class="header-anchor" href="#वे-उबाऊ-spikes-जिन्होंने-प्रोजेक्ट-को-बचाया" aria-label="Permalink to &quot;वे उबाऊ spikes जिन्होंने प्रोजेक्ट को बचाया&quot;"></a></h2>
<p>सीरीज़ के <a href="/hi/blog/2026-02-25-open-world-browser-part-03-the-unflashy-spikes.html">तीसरे भाग</a> में कोई screenshots नहीं हैं। इसमें तीन ऐसे प्रयोग शामिल हैं जो दिखने में साधारण लगते थे पर जिनके product स्तर के नतीजे थे।</p>
<p>पहले ने यह जांचा कि क्या Cloudflare Durable Objects game जैसे tick rates पर real-time position broadcasts संभाल सकते हैं, यानी multiplayer की रीढ़। अगर यह नाकाम होता, तो पूरे network architecture को single-island ownership के बजाय शुरुआती sharding की ज़रूरत पड़ती।</p>
<p>दूसरे ने एक mobile quality profile को verify किया: कोई desktop preset का नाम बदलकर नहीं, बल्कि उसी terrain baseline से एक स्पष्ट कम-लागत वाला rendering path। सवाल यह था कि क्या renderer को दोबारा लिखे बिना world mobile GPU की पाबंदियों के तहत पठनीय और responsive बना रह सकता है।</p>
<p>तीसरे ने यह आंका कि क्या creator workflows के लिए AI-generated behavior scripts production इस्तेमाल के लिए भरोसेमंद हो पाएंगे।</p>
<p>इनमें से किसी ने demo reels नहीं बनाई। तीनों ने ऐसी सख्त सीमाएं तय कीं जिन्होंने उसके बाद के हर architectural फैसले को आकार दिया। Oleg लिखते हैं कि इन &quot;साधारण दिखने वाले spikes ने visual spikes के मुकाबले architecture को ज़्यादा तेज़ी से बदला।&quot;</p>
<h2 id="streaming-जहां-सुंदर-प्रोजेक्ट-बिखर-जाते-हैं" tabindex="-1">streaming: जहां सुंदर प्रोजेक्ट बिखर जाते हैं <a class="header-anchor" href="#streaming-जहां-सुंदर-प्रोजेक्ट-बिखर-जाते-हैं" aria-label="Permalink to &quot;streaming: जहां सुंदर प्रोजेक्ट बिखर जाते हैं&quot;"></a></h2>
<img src="/img/blog/open-world-chunk-streaming.png" alt="Spike 6: Chunk streaming in action — each colored area is a terrain chunk that loads and unloads dynamically as the camera moves" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>आप एक स्थिर frame में बहुत कुछ छिपा सकते हैं। दौड़ते वक्त किसी chunk boundary को पार करते समय की 40-millisecond की stutter आप नहीं छिपा सकते।</p>
<p>टीम ने <a href="/hi/blog/2026-02-25-open-world-browser-part-04-streaming-before-fancy.html">advanced terrain बनाने से पहले streaming की जांच</a> की, जानबूझकर चिंताओं को अलग रखते हुए। Spike 6 ने सरल content के साथ neighborhood chunk loading को verify किया। उस साफ signal के बाद ही Spike 11 ने progressive refinement के साथ compressed heightmap streaming पेश किया, यानी terrain को पहले 17-sample resolution पर load करना, फिर 33, फिर पूरा 65-sample grid।</p>
<p>यह क्रम हमारी उम्मीद से ज़्यादा मायने रखता था। अगर हमने सीधे compressed height chunks से शुरुआत की होती, तो हर hitch अस्पष्ट होती। क्या यह कोई decode समस्या थी, कोई texture upload stall, या कोई geometry update दिक्कत? पहले सरल streaming की जांच ने अनिश्चितता की एक पूरी श्रेणी को खत्म कर दिया।</p>
<p>एक व्यावहारिक सबक उभरा: upload stalls को सीधे मापें, average FPS के ज़रिए नहीं। averages frame spikes को छिपा देते हैं, और frame spikes ही वह चीज़ हैं जो players को असल में महसूस होती हैं।</p>
<h2 id="visual-budget-की-लड़ाइयां" tabindex="-1">visual budget की लड़ाइयां <a class="header-anchor" href="#visual-budget-की-लड़ाइयां" aria-label="Permalink to &quot;visual budget की लड़ाइयां&quot;"></a></h2>
<p>तीन अलग-अलग प्रयोगों ने rendering costs पर एक साथ बंडल करने के बजाय अलग-अलग हमला किया। <a href="/hi/blog/2026-02-25-open-world-browser-part-05-budgeting-the-pretty.html">Vegetation</a> घनत्व और wind animation। cliff faces के लिए triplanar mapping के साथ multi-layer terrain materials। वास्तविक terrain load के तहत cascaded shadow maps।</p>
<p>vegetation spike ने दिखाया कि instances को कम meshes में batch करना प्रति-blade polygon count घटाने से ज़्यादा मायने रखता था। material spike ने पाया कि vertical surfaces पर triplanar projection GPU cost के लायक थी, पर पांचवीं texture splat layer जोड़ना नहीं। shadow spike ने तय किया कि 1024 resolution पर तीन cascades 2 milliseconds से ज़्यादा GPU time लिए बिना स्वीकार्य contact shadows देते थे।</p>
<p>टीम ने एक सीधा नियम अपनाया: कोई feature तभी आगे बढ़ता है जब वह मापे गए frame-time data के साथ अपनी लागत समझा सके। शुरू में तय की गई इस पाबंदी ने volumetric terrain और clipmaps के इर्द-गिर्द बाद के architectural फैसलों को काफी साफ-सुथरा बना दिया।</p>
<h2 id="वह-मोड़-जिसने-प्रोजेक्ट-की-दिशा-बदल-दी" tabindex="-1">वह मोड़ जिसने प्रोजेक्ट की दिशा बदल दी <a class="header-anchor" href="#वह-मोड़-जिसने-प्रोजेक्ट-की-दिशा-बदल-दी" aria-label="Permalink to &quot;वह मोड़ जिसने प्रोजेक्ट की दिशा बदल दी&quot;"></a></h2>
<p>Spike 10 से पहले, हमारा मानसिक मॉडल था &quot;बड़ा world यानी ज़्यादा geometry।&quot; <a href="/hi/blog/2026-02-25-open-world-browser-part-06-clipmaps.html">Spike 10</a> के बाद, यह बन गया &quot;स्थिर geometry budget, camera-केंद्रित ring updates।&quot;</p>
<p>Geometry clipmaps, यानी camera पर केंद्रित terrain के संकेंद्रित rings जिनमें हर ring उत्तरोत्तर मोटा होता जाता है, का मतलब था कि draw distance चाहे जो हो, triangle count लगभग स्थिर रहता था। व्यावहारिक तरकीब ring boundaries पर geomorphing की थी: shader में vertex heights को सहजता से blend करना ताकि resolution levels के बीच का बदलाव गति में अदृश्य रहे।</p>
<p>एक सूक्ष्म सबक testing methodology से आया। Clipmaps screenshots में ठीक लगते हैं। वे अपने artifacts केवल ring boundaries से होकर लगातार camera गति के तहत ही दिखाते हैं। टीम ने स्थिर गति से traversals चलाने और temporal noise पर नज़र रखने में समय लगाया। &quot;Screenshots ने झूठ बोला,&quot; Oleg लिखते हैं। &quot;गति ने सच बताया।&quot;</p>
<h2 id="ज़मीन-के-नीचे-जाना" tabindex="-1">ज़मीन के नीचे जाना <a class="header-anchor" href="#ज़मीन-के-नीचे-जाना" aria-label="Permalink to &quot;ज़मीन के नीचे जाना&quot;"></a></h2>
<p>Heightmaps गुफाओं को नहीं दर्शा सकते। वे एक grid पर हर बिंदु के लिए एक elevation मान संग्रहित करते हैं। जिस पल आपको tunnels, overhangs, या तराशी हुई चट्टानें चाहिए, उसी पल आपको volumetric terrain चाहिए।</p>
<p><a href="/hi/blog/2026-02-25-open-world-browser-part-07-marching-cubes.html">Spike 12</a> ने WebGPU compute shaders का इस्तेमाल करके GPU पर marching cubes लागू किया, एक 3D signed distance field से triangle meshes निकालते हुए। चार 64-cubed chunks animated SDF edits से प्रति-frame mesh updates के साथ एक साथ चले। compute shader ने सब कुछ संभाला, यानी field का मूल्यांकन, cells का वर्गीकरण, vertices का उत्सर्जन, बिना किसी CPU readback के।</p>
<p>चुनौती इसे काम करवाना नहीं थी। चुनौती इसे बाकी सब चीज़ों के साथ काम करवाना थी। Three.js के scene graph के साथ एकीकरण, buffer lifecycle management (WebGPU buffers का आकार नहीं बदला जा सकता), अब भी in flight GPU resources को नष्ट होने से बचाने के लिए fence handling, इस सबके लिए सीरीज़ <a href="/hi/blog/2026-02-25-open-world-browser-part-08-webgpu-integration.html">दो</a> पूरे भाग समर्पित करती है, जिसे हम &quot;incremental hardening&quot; कहते हैं, यानी एक बार में एक क्षमता जोड़ने और हर जोड़ के बाद यह जांचने की साधारण प्रक्रिया कि पिछली layer अब भी काम करती है।</p>
<h2 id="seam-का-दुःस्वप्न" tabindex="-1">seam का दुःस्वप्न <a class="header-anchor" href="#seam-का-दुःस्वप्न" aria-label="Permalink to &quot;seam का दुःस्वप्न&quot;"></a></h2>
<p>सीरीज़ का तकनीकी रूप से सबसे डरावना हिस्सा <a href="/hi/blog/2026-02-25-open-world-browser-part-09-transvoxel-first-cut.html">भाग 9 से 11</a> तक फैला है, जो उस बात को कवर करता है जो तब होती है जब अलग-अलग resolutions वाले terrain chunks मिलते हैं।</p>
<p>जब एक high-detail chunk एक low-detail chunk के बगल में होता है, तो उनके स्वतंत्र रूप से बनाए गए meshes boundary पर मेल नहीं खाते। नतीजा होते हैं दिखने वाले cracks, झिलमिलाते edges, और T-junctions जहां से light रिसती है। Transvoxel algorithm इसे खास transition cells से हल करता है जो resolution अंतर को पाटते हैं, पर इसे सभी chunk configurations में सही ढंग से लागू करना, सही winding order, उचित buffer management और सटीक draw ranges के साथ, छह अलग-अलग प्रयोगों में खर्च हुआ।</p>
<p>टीम की सबसे यादगार debugging कहानी: एक seam artifact का दो दिन पीछा करना जिसका दोष हमने transition logic पर मढ़ा। असली अपराधी stale data था। GPU compute shader ने एक buffer में N vertices लिखे, पर draw call अब भी पिछले frame के N+M vertices को render करने के लिए configured था। उन अतिरिक्त vertices में कचरा था जो झिलमिलाते, उस्तरे जैसे पतले triangles पैदा करता था। एक line का fix: draw range को atomic counter की active vertex count तक clip करना।</p>
<p>&quot;Rendering bugs अक्सर meshing bugs का भेस धारण कर लेते हैं,&quot; Oleg कहते हैं। &quot;Geometry पूरे समय सही थी।&quot;</p>
<h2 id="अराजकता-से-शासन-तक" tabindex="-1">अराजकता से शासन तक <a class="header-anchor" href="#अराजकता-से-शासन-तक" aria-label="Permalink to &quot;अराजकता से शासन तक&quot;"></a></h2>
<p>seam की लड़ाई के बाद, टीम ने तदर्थ chunk व्यवहार को एक <a href="/hi/blog/2026-02-25-open-world-browser-part-11-policy-modes.html">स्पष्ट policy system</a> से बदला। अब एक central function ने हर chunk का LOD स्तर, rendering mode (heightmap या marching cubes), और किन faces को transition cells की ज़रूरत थी, यह तय किया। Distance rings ने base LOD तय किया। एक adjacency constraint ने यह सुनिश्चित किया कि कोई भी दो पड़ोसी chunks एक से ज़्यादा resolution स्तर से अलग न हों। एक edit bitmap ने volumetric chunks को distance चाहे जो हो, marching-cubes mode में रखा अगर उनमें creator संशोधन हों।</p>
<p>रंग-कोडित debug overlays, यानी heightmap chunks के लिए हरा, marching cubes के लिए नीला, transition faces के लिए नारंगी, ने &quot;मैंने उस ridge के पास कहीं एक bug देखा&quot; को &quot;bug position (142, 12, -67) पर उत्तर-पश्चिम की ओर दिखता है&quot; में बदल दिया।</p>
<p>&quot;Policy ने जटिलता घटाई नहीं,&quot; Oleg लिखते हैं। &quot;इसने जटिलता को व्यवस्थित किया।&quot;</p>
<h2 id="इन-सबका-कुल-जोड़" tabindex="-1">इन सबका कुल जोड़ <a class="header-anchor" href="#इन-सबका-कुल-जोड़" aria-label="Permalink to &quot;इन सबका कुल जोड़&quot;"></a></h2>
<p>आखिरी spike ने clipmap rings, प्रति-fragment sky fog (हर terrain fragment की दिशा में असल skybox रंग को sample करते हुए), और Three.js module wiring को एक एकीकृत प्रदर्शन में मिलाया। नतीजा एक ऐसा terrain system है जो near-field volumetric editing, mid-field heightmap chunks, और far-field clipmap rings को एक policy layer के तहत परत-दर-परत रखता है जो mode, LOD और transitions को नियंत्रित करती है।</p>
<p>सीरीज़ उन <a href="/hi/blog/2026-02-25-open-world-browser-part-12-lessons.html">सबकों</a> के साथ समाप्त होती है जिन्हें Oleg कहते हैं कि वे किसी भी भविष्य के प्रोजेक्ट पर दोहराएंगे:</p>
<ul>
<li><strong>feature काम से पहले risk spikes से शुरुआत करें।</strong> content pipelines में निवेश करने से पहले &quot;क्या हम यह कर भी सकते हैं?&quot; वाले सवालों को खत्म करें।</li>
<li><strong>integration छलांगों से पहले known-good baselines को freeze करें।</strong> एक साफ checkpoint स्थापित करने में बिताया गया दिन बाद में regressions को bisect करने के कई दिन बचाता है।</li>
<li><strong>optimization marathons से पहले policy और observability को अनिवार्य करें।</strong> trigger rules वाली नामित परिस्थितियां हर बार रहस्यमय bugs को मात देती हैं।</li>
<li><strong>गति के तहत जांचें, screenshots से नहीं।</strong> Pops, flicker, और streaming hitches सब स्थिर frames में छिप जाते हैं।</li>
<li><strong>प्रति-feature frame time मापें, average FPS नहीं।</strong> averages उन spikes को छिपा देते हैं जो users को असल में महसूस होती हैं।</li>
<li><strong>गड़बड़ हिस्सों को प्रकाशित करें।</strong> गलत मोड़, भूत का पीछा, गलत system को दोष देने के दो दिन। ये वही हिस्से हैं जिनसे लोग असल में सीख सकते हैं।</li>
</ul>
<h2 id="cinevva-से-परे-यह-क्यों-मायने-रखता-है" tabindex="-1">Cinevva से परे यह क्यों मायने रखता है <a class="header-anchor" href="#cinevva-से-परे-यह-क्यों-मायने-रखता-है" aria-label="Permalink to &quot;Cinevva से परे यह क्यों मायने रखता है&quot;"></a></h2>
<p>सीरीज़ तीन वजहों से महत्वपूर्ण है जो एक कंपनी की terrain pipeline से आगे जाती हैं।</p>
<p>पहली, यह दिखाती है कि WebGPU compute shaders, WebAssembly physics, और edge पर deploy किए गए Durable Objects एक दहलीज़ पार कर चुके हैं। volumetric terrain, real-time editing, और streaming LOD वाला एक multiplayer open world 2026 में एक ब्राउज़र tab में architecturally व्यावहारिक है। दो साल पहले यह सच नहीं था।</p>
<p>दूसरी, spike methodology, यानी छोटे और केंद्रित प्रयोग जिनमें हर एक live, मापने योग्य नतीजों के साथ किसी एक जोखिम भरे सवाल का जवाब देता है, किसी भी ऐसी टीम के लिए एक template देती है जो ऐसा कुछ करने की कोशिश कर रही है जो शायद काम न करे। प्रतिबद्ध होने से पहले मापने का, एकीकृत करने से पहले baselines स्थापित करने का, optimize करने से पहले edge cases को नाम देने का अनुशासन terrain systems से कहीं आगे लागू होता है।</p>
<p>तीसरी, आमूल पारदर्शिता ही असल बात है। सभी 24 प्रयोगों के लिए सोर्स कोड प्रकाशित करना, dead ends और दो-दिन वाले debugging चक्करों समेत, इसे एक तकनीकी blog से कहीं ज़्यादा बना देता है। यह एक सार्वजनिक engineering नोटबुक है जो पाठक को ग्राहक के बजाय एक सहकर्मी की तरह मानती है।</p>
<p>पूरी सीरीज़ हमारी <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">सीरीज़ गाइड</a> में उपलब्ध है, जिसमें हर spike ब्राउज़र में live चल रहा है।</p>
<hr>
<p><em>यह लेख मूल रूप से <a href="https://vio-202020.medium.com/de-risking-an-ambitious-project-before-committing-to-anything-big-like-an-online-open-world-c94a7c05ee06" target="_blank" rel="noreferrer">Medium</a> पर प्रकाशित हुआ था।</em></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[स्केच से वीडियो और खेलने लायक 3D तक: किरदार, स्टोरी फ्रेम और रिग]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-03-04-sketch-to-animated-3d-character</link>
            <guid>https://app.cinevva.com/hi/blog/2026-03-04-sketch-to-animated-3d-character</guid>
            <pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[हमने एक कच्चे किरदार स्केच को AI से बने वर्टिकल शॉर्ट और एक रिग किए हुए 3D मॉडल में बदलने के लिए Cinevva के Image Generator, Video Generator और 3D Model Generator का इस्तेमाल कैसे किया, जिसे आप browser में घुमा-फिरा सकते हैं।]]></description>
            <content:encoded><![CDATA[<h1 id="स्केच-से-वीडियो-और-खेलने-लायक-3d-तक" tabindex="-1">स्केच से वीडियो और खेलने लायक 3D तक <a class="header-anchor" href="#स्केच-से-वीडियो-और-खेलने-लायक-3d-तक" aria-label="Permalink to &quot;स्केच से वीडियो और खेलने लायक 3D तक&quot;"></a></h1>
<p><em><a href="/hi/about.html">Oleg Sidorkin</a> द्वारा, Cinevva के CTO</em></p>
<p>किसी किरदार को एक सपाट स्केच से लेकर खेलने लायक 3D game तक पहुंचाने के लिए पहले एक concept artist, एक 3D modeler, एक rigger, एक animator और किसी ऐसे इंसान की ज़रूरत होती थी जो इन सबको engine में जोड़ सके। हम देखना चाहते थे कि इस पूरी pipeline का कितना हिस्सा <a href="/hi/tools/">Cinevva के creative tools</a> अकेले संभाल सकते हैं। यहां हमें जो मिला, वो बता रहे हैं।</p>
<p>किरदार है <strong>Kali the Kitty</strong>, जो <a href="https://thecubcoats.com" target="_blank" rel="noreferrer">Cubcoats</a> का है, एक बच्चों का ब्रांड जिसने Nordstrom, Amazon और Disney Store के ज़रिए दस लाख से ज़्यादा स्टफ्ड-एनिमल hoodies बेचे। Cubcoats के आठ ओरिजिनल किरदार हैं जिनकी अपनी तय शख्सियत है, एक काल्पनिक द्वीप की दुनिया है और 14 patents हैं। वे 2026 में एक लाइसेंसिंग-फर्स्ट platform के रूप में फिर से लॉन्च हो रहे हैं, और हम दिखाना चाहते थे कि वो IP कैसा दिखता है जब वो भौतिक प्रोडक्ट्स से आगे जाता है: एक वर्टिकल वीडियो शॉर्ट और एक रिग किया हुआ 3D किरदार जिसे आप browser में घुमा-फिरा सकते हैं। नीचे जो कुछ भी है, वो उसी खोज का असली नतीजा है।</p>
<p>3D viewers को घुमाने के लिए ड्रैग करें। यह देखने के लिए कि वर्टिकल शॉर्ट पहले फ्रेम से आखिरी फ्रेम तक कैसे आगे बढ़ता है, फिल्म स्ट्रिप को स्क्रॉल करें।</p>
<h2 id="सपाट-किताबी-आर्ट-से-एक-ऐसे-किरदार-तक-जिसे-आप-घुमा-सकें" tabindex="-1">सपाट किताबी आर्ट से एक ऐसे किरदार तक जिसे आप घुमा सकें <a class="header-anchor" href="#सपाट-किताबी-आर्ट-से-एक-ऐसे-किरदार-तक-जिसे-आप-घुमा-सकें" aria-label="Permalink to &quot;सपाट किताबी आर्ट से एक ऐसे किरदार तक जिसे आप घुमा सकें&quot;"></a></h2>
<p>Cubcoats के पास पहले से ही खूबसूरत 2D इलस्ट्रेशन थे। Mimi Chao के art direction ने हर किरदार को एक गर्मजोश, गोल, हाथ से बनी हुई शक्ल दी जो hoodies पर और कहानी की किताबों में बिल्कुल फिट बैठती है। लेकिन सपाट आर्ट 3D pipeline को नहीं चलाता। हमें एक हाई-फिडेलिटी किरदार चाहिए था जो वीडियो जनरेशन, mesh बनाने और rigging के लिए एक reference के तौर पर टिक सके, वो भी एक ही चेहरे से।</p>
<p>हमने शुरुआत किताब के ओरिजिनल इलस्ट्रेशन को अपने <a href="/hi/tools/flux.html">Image Generator</a> में डालकर की और उससे उसी किरदार का 3D रेंडर किया हुआ वर्ज़न बनाने को कहा।</p>
<figure class="pipeline-media pipeline-media--single">
<img src="/blog/sketch-to-3d-pipeline/kali-flat-book-art.png" alt="Original flat Cubcoats illustrations of Kali the Kitty" loading="lazy">
<figcaption><strong>शुरुआती बिंदु।</strong> Kali के ओरिजिनल 2D किताबी इलस्ट्रेशन। गर्मजोश, भावपूर्ण, पूरी तरह सपाट।</figcaption>
</figure>
<p>प्रोपोर्शन सही रहे, शख्सियत झलकती रही, और नरम 3D कार्टून लुक ने आगे की हर tool को एक जैसी चीज़ पर सहमत होने का आधार दिया। वहां से हमने सही pose और फ्रेमिंग पर तब तक काम किया जब तक हमारे पास एक तय हीरो reference नहीं आ गया।</p>
<div class="pipeline-media pipeline-media--two">
<figure>
<img src="/blog/sketch-to-3d-pipeline/kali-3d-chatgpt.png" alt="Locked 3D-style character reference for Kali" loading="lazy">
<figcaption><strong>तय हीरो reference।</strong> फुल-बॉडी 3D कार्टून लुक जो वीडियो के लिए और mesh के लिए विज़ुअल एंकर के तौर पर इस्तेमाल हुआ।</figcaption>
</figure>
<figure>
<img src="/blog/sketch-to-3d-pipeline/kali-3d-tpose.png" alt="T-pose reference for 3D generation and rigging" loading="lazy">
<figcaption><strong>T-pose शीट।</strong> वही किरदार, बाहें फैली हुई। इसने [3D Model Generator](/hi/tools/hunyuan3d) और auto-rigger दोनों को चलाया।</figcaption>
</figure>
</div>
<p>T-pose इसलिए मायने रखता है क्योंकि rigging यह उम्मीद करती है कि बाहें धड़ से दूर हों। इसे छोड़ दें तो auto-rigger बाहों को शरीर से जोड़ देता है और हार मान लेता है। हमने T-pose उसी तय किरदार लुक से बनाया ताकि सिल्हूट और प्रोपोर्शन हर कदम पर एक जैसे रहें।</p>
<h2 id="कुछ-भी-जनरेट-करने-से-पहले-कहानी-लिखें" tabindex="-1">कुछ भी जनरेट करने से पहले कहानी लिखें <a class="header-anchor" href="#कुछ-भी-जनरेट-करने-से-पहले-कहानी-लिखें" aria-label="Permalink to &quot;कुछ भी जनरेट करने से पहले कहानी लिखें&quot;"></a></h2>
<p>वीडियो tools को छूने से पहले हमने सीधी-सादी भाषा में एक बीट शीट लिखी। Cubcoats की दुनिया में Kali की शख्सियत की खासियत है &quot;पॉज़िटिव&quot;। वो वही है जो सबको साथ महसूस कराती है, और मुश्किल वक्त में भी हौसला बनाए रखती है। तो हमने उसी के इर्द-गिर्द एक दस-सेकंड का arc बनाया:</p>
<blockquote>
<p>Kali रात में एक अंधेरे, धुंध भरे जंगल में एक छोटी सी चमकती लालटेन हाथ में लिए हुए घुसती है। वो डर जाती है, अकेली बैठ जाती है, लगभग हार मान लेती है। फिर उसे अपने पीछे रोशनी से जगमगाता एक जादुई सुनहरा पेड़ दिखता है। हैरानी, खुशी, सुनहरे कण बरसते हुए। एक ही सांस में डर से उम्मीद तक।</p>
</blockquote>
<p>यही पूरी कहानी है। इसे जटिल होने की ज़रूरत नहीं। इसे एक भावनात्मक मोड़ को एक लगातार चलने वाले शॉट में फिट करना होता है ताकि शुरुआती फ्रेम और आखिरी फ्रेम वाकई आपस में जुड़ सकें।</p>
<h2 id="दो-फ्रेम-जो-पूरी-चीज़-के-दोनों-सिरे-संभालते-हैं" tabindex="-1">दो फ्रेम जो पूरी चीज़ के दोनों सिरे संभालते हैं <a class="header-anchor" href="#दो-फ्रेम-जो-पूरी-चीज़-के-दोनों-सिरे-संभालते-हैं" aria-label="Permalink to &quot;दो फ्रेम जो पूरी चीज़ के दोनों सिरे संभालते हैं&quot;"></a></h2>
<p>हमने उस कहानी से दो अहम स्टिल अपने <a href="/hi/tools/flux.html">Image Generator</a> से बनाए। वर्टिकल शॉर्ट से मेल खाने के लिए पोर्ट्रेट aspect। prompts ठीक उसी किरदार को दो अलग-अलग पलों में बयान करते हैं।</p>
<p><strong>शुरुआती फ्रेम का prompt:</strong></p>
<blockquote>
<p>3D animated Pixar-style render of Kali, a small pink kitty character with large round dark eyes, pink pointed ears, a light pink belly, and a cheerful round face. She is standing at the edge of a dark misty forest at night, holding a tiny glowing lantern in both paws. Her ears are slightly flattened and her expression is nervous but determined. Cinematic lighting with cool blue moonlight from above and warm orange glow from the lantern. Dense fog between dark tree trunks in the background. Camera angle: medium shot, slightly low looking up at her. No text, no watermark.</p>
</blockquote>
<p><strong>आखिरी फ्रेम का prompt:</strong></p>
<blockquote>
<p>3D animated Pixar-style render of Kali, a small pink kitty character with large round dark eyes, pink pointed ears, and a light pink belly. She is standing in front of a massive magical tree covered in glowing golden flowers, arms outstretched wide, beaming with a huge joyful smile. Golden petals float in the air around her. The tree radiates warm golden light that illuminates the entire forest clearing. Starry night sky visible above. Camera angle: wide shot from slightly below, epic reveal composition. No text, no watermark.</p>
</blockquote>
<div class="pipeline-media pipeline-media--two">
<figure>
<img src="/blog/sketch-to-3d-pipeline/kali-start-frame.png" alt="Start frame for vertical AI video" loading="lazy">
<figcaption><strong>शुरुआती फ्रेम।</strong> जंगल के किनारे अपनी लालटेन के साथ घबराई हुई Kali।</figcaption>
</figure>
<figure>
<img src="/blog/sketch-to-3d-pipeline/kali-end-frame.png" alt="End frame for vertical AI video" loading="lazy">
<figcaption><strong>आखिरी फ्रेम।</strong> सुनहरे पेड़ के सामने खुश Kali।</figcaption>
</figure>
</div>
<p>Seedance इन दोनों सिरों के बीच interpolate करता है। किरदार का बयान दोनों prompts में एक जैसा रहता है ताकि model को पता रहे कि यह वही इंसान है। सिर्फ़ सीन, भावना और camera बदलते हैं।</p>
<h2 id="वीडियो-उम्मीद-से-बेहतर-निकला" tabindex="-1">वीडियो उम्मीद से बेहतर निकला <a class="header-anchor" href="#वीडियो-उम्मीद-से-बेहतर-निकला" aria-label="Permalink to &quot;वीडियो उम्मीद से बेहतर निकला&quot;"></a></h2>
<p>हमने दोनों फ्रेम Cinevva के <a href="/hi/tools/video.html">Video Generator</a> में लोड किए, Seedance 1.5 Pro चुना, 9:16 aspect और 15 सेकंड सेट किए, motion prompt में कहानी टाइप की, और Generate दबा दिया।</p>
<figure class="pipeline-media pipeline-media--single">
<img src="/blog/sketch-to-3d-pipeline/video-generator-setup.png" alt="Cinevva Video Generator with start and end frames loaded" loading="lazy">
<figcaption><strong>असली सेटअप।</strong> शुरुआती फ्रेम, आखिरी फ्रेम, motion prompt, 9:16 वर्टिकल, 15 सेकंड, audio चालू।</figcaption>
</figure>
<p>क्लिप दोनों सिरों के बीच interpolate करती है। नेटिव audio उसी पास में जनरेट हुआ। यहां timeline के साथ-साथ लिए गए कुछ फ्रेम हैं।</p>
<div class="pipeline-filmstrip" aria-label="Frames from generated vertical video">
<img src="/blog/sketch-to-3d-pipeline/seedance-frames/frame_01.jpg" alt="Video frame 1" loading="lazy">
<img src="/blog/sketch-to-3d-pipeline/seedance-frames/frame_02.jpg" alt="Video frame 2" loading="lazy">
<img src="/blog/sketch-to-3d-pipeline/seedance-frames/frame_03.jpg" alt="Video frame 3" loading="lazy">
<img src="/blog/sketch-to-3d-pipeline/seedance-frames/frame_04.jpg" alt="Video frame 4" loading="lazy">
<img src="/blog/sketch-to-3d-pipeline/seedance-frames/frame_05.jpg" alt="Video frame 5" loading="lazy">
<img src="/blog/sketch-to-3d-pipeline/seedance-frames/frame_06.jpg" alt="Video frame 6" loading="lazy">
<img src="/blog/sketch-to-3d-pipeline/seedance-frames/frame_07.jpg" alt="Video frame 7" loading="lazy">
<img src="/blog/sketch-to-3d-pipeline/seedance-frames/frame_08.jpg" alt="Video frame 8" loading="lazy">
<img src="/blog/sketch-to-3d-pipeline/seedance-frames/frame_09.jpg" alt="Video frame 9" loading="lazy">
</div>
<p class="pipeline-caption">बाएं से दाएं: जनरेट किए गए वर्टिकल शॉर्ट के दौरान आगे बढ़ता क्रम।</p>
<p>जब हमें एक तय आखिरी pose पर सटीक पहुंचने की परवाह थी, तो शुरुआती और आखिरी फ्रेम वाला मोड सही रहा। लंबे भावनात्मक arcs के लिए, सिंगल reference और prompt वाला तरीका <a href="/hi/tools/video.html">Video Generator</a> के Kling 3.0 Pro storyboard मोड के साथ अच्छा चला। अलग-अलग कामों के लिए अलग-अलग settings।</p>
<h2 id="वही-किरदार-अब-3d-में" tabindex="-1">वही किरदार, अब 3D में <a class="header-anchor" href="#वही-किरदार-अब-3d-में" aria-label="Permalink to &quot;वही किरदार, अब 3D में&quot;"></a></h2>
<p>यहीं से बात दिलचस्प होती है। वीडियो references के उसी परिवार का T-pose स्टिल हमारे <a href="/hi/tools/hunyuan3d.html">3D Model Generator</a> में image-to-3D जनरेशन के लिए गया। आप game mesh को वीडियो से पिक्सल-दर-पिक्सल मिला नहीं रहे होते। आप खिलाड़ी की याददाश्त से मिला रहे होते हैं। game में किरदार reel जैसी ही शख्सियत का महसूस होना चाहिए। और क्योंकि हमने शुरुआत में ही एक विज़ुअल पहचान तय कर ली थी, वैसा ही हुआ।</p>
<figure class="pipeline-media pipeline-media--single">
<img src="/blog/sketch-to-3d-pipeline/kali-preview.png" alt="Rendered preview of Hunyuan3D mesh" loading="lazy">
<figcaption>जनरेट किए गए mesh का प्रीव्यू रेंडर। rigging से पहले textures और प्रोपोर्शन।</figcaption>
</figure>
<p><a href="/hi/tools/hunyuan3d.html">3D Model Generator</a> एक textured GLB देता है। game के लिए तैयार नहीं, लेकिन पहचान में आने लायक Kali। सिल्हूट मेल खाया। materials करीब थे। आगे बढ़ने के लिए काफी अच्छा।</p>
<h2 id="इन्हें-घुमाकर-देखें" tabindex="-1">इन्हें घुमाकर देखें <a class="header-anchor" href="#इन्हें-घुमाकर-देखें" aria-label="Permalink to &quot;इन्हें घुमाकर देखें&quot;"></a></h2>
<p><a href="/hi/tools/hunyuan3d.html">3D Model Generator</a> से सीधा निकला आउटपुट। कोई rig नहीं, बस एक textured mesh। उसके बगल में, वही किरदार auto-rigging के बाद, एक बेक की हुई walk animation के साथ।</p>
<ClientOnly>
  <SketchPipelineModels />
</ClientOnly>
<h2 id="rigging-और-animation" tabindex="-1">Rigging और animation <a class="header-anchor" href="#rigging-और-animation" aria-label="Permalink to &quot;Rigging और animation&quot;"></a></h2>
<p><a href="/hi/tools/hunyuan3d.html">3D Model Generator</a> आपको एक mesh देता है। उस mesh को हिलाने-डुलाने के लिए उसे एक skeleton और animations चाहिए। हमारा platform rigging अपने आप संभालता है: GLB अपलोड करें, और एक रिग किया हुआ model पूरी animation library के साथ वापस पाएं। walk cycles, idle सांस लेना, jumps, वो सब कुछ जो एक game किरदार को चाहिए।</p>
<p>डिफ़ॉल्ट walk animation लगभग सही लगती थी, पर पूरी तरह नहीं। Kali की बाहें उसके शरीर के बहुत करीब थीं और उसका सिर थोड़े गलत कोण पर झुका हुआ था। दोनों चीज़ें एक आम humanoid के लिए ठीक थीं पर एक गोल कार्टून kitty पर अटपटी लगती थीं। तो हमने game code में runtime bone corrections जोड़े: एक shoulder offset जो बाहों को बाहर की ओर धकेलता है और एक head rotation fix जो झुकाव को सीधा करता है। छोटे बदलाव, बड़ा फर्क। इनके बिना वो अकड़ी हुई और रोबोट जैसी दिखती थी। इनके साथ वो फिर से Kali जैसी दिखी।</p>
<h2 id="किरदार-को-browser-में-खेलना" tabindex="-1">किरदार को browser में खेलना <a class="header-anchor" href="#किरदार-को-browser-में-खेलना" aria-label="Permalink to &quot;किरदार को browser में खेलना&quot;"></a></h2>
<p>हमने रिग किए हुए model को <a href="/hi/engine.html">Cinevva Engine</a> में डाल दिया। थर्ड-पर्सन camera, WASD मूवमेंट, इधर-उधर बिखरे collectibles, और idle होने पर orbit camera। animation blending सही बैठाने में थोड़ी मेहनत लगी: idle और walk के बीच crossfading, height नॉर्मलाइज़ करना, forward axis ठीक करना, bone offsets में फेरबदल। किरदार के पीछे थर्ड-पर्सन camera स्केच से लेकर एक ऐसी चीज़ तक का घेरा पूरा करता है जिसमें आप घूम-फिर सकें।</p>
<p>खुद आज़माएं। हिलने-डुलने के लिए WASD।</p>
<div class="pipeline-game-embed">
<iframe src="https://api.cinevva.com/games/game-mmbijtzp-d63d/" allow="fullscreen" loading="lazy"></iframe>
</div>
<h2 id="कल-यही-करने-वाले-किसी-को-मैं-क्या-कहूंगा" tabindex="-1">कल यही करने वाले किसी को मैं क्या कहूंगा <a class="header-anchor" href="#कल-यही-करने-वाले-किसी-को-मैं-क्या-कहूंगा" aria-label="Permalink to &quot;कल यही करने वाले किसी को मैं क्या कहूंगा&quot;"></a></h2>
<p>किसी भी जनरेशन tool को छूने से पहले एक किरदार लुक तय कर लें। उस reference को सही करने में आप जो भी एक-एक मिनट लगाते हैं, वो बाद में consistency के पीछे भागने के एक-एक घंटे बचाता है।</p>
<p>पहले एक छोटी सी कहानी लिखें। फिर अपने शुरुआती और आखिरी फ्रेम <a href="/hi/tools/flux.html">Image Generator</a> से बनाएं। reference images को API साइज़ की सीमा के अंदर रखें। जब आप <a href="/hi/tools/hunyuan3d.html">3D Model Generator</a> को चलाएं तो उसी डिज़ाइन सिस्टम का T-pose इस्तेमाल करें।</p>
<p>दोनों फ्रेम <a href="/hi/tools/video.html">Video Generator</a> को दें और उसे interpolate करने दें। game mesh के लिए, model को platform के ज़रिए रिग करें और अगर डिफ़ॉल्ट animations आपके किरदार के प्रोपोर्शन पर पूरी तरह फिट न बैठें तो runtime पर bone offsets में फेरबदल करें।</p>
<p>दो साल पहले यह pipeline मौजूद नहीं थी। आपको एक टीम और एक बजट चाहिए होता। अब आपको एक स्केच और Cinevva के <a href="/hi/tools/">creative tools</a> चाहिए। मुझे लगता है कि यह इस बात में एक अहम बदलाव है कि किसी किरदार में जान फूंकने का मौका किसे मिलता है।</p>
<hr>
<p><em>इस्तेमाल किए गए Cinevva tools: <a href="/hi/tools/flux.html">Image Generator</a>, <a href="/hi/tools/video.html">Video Generator</a>, <a href="/hi/tools/hunyuan3d.html">3D Model Generator</a>, auto-rigging, और <a href="/hi/engine.html">Cinevva Engine</a>। 2026 की शुरुआत को दर्शाता है।</em></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ब्राउज़र में open world बनाना, भाग 1: हमने इसे तोड़ने की कोशिश से शुरुआत की]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-02-25-open-world-browser-part-01-risk-first</link>
            <guid>https://app.cinevva.com/hi/blog/2026-02-25-open-world-browser-part-01-risk-first</guid>
            <pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[गुफाएं या फैंसी shaders बनाने से पहले, हमें एक भद्दे सवाल का जवाब चाहिए था: क्या यह चीज़ ब्राउज़र में चल भी सकती है?]]></description>
            <content:encoded><![CDATA[<h1 id="ब्राउज़र-में-open-world-बनाना-भाग-1-हमने-इसे-तोड़ने-की-कोशिश-से-शुरुआत-की" tabindex="-1">ब्राउज़र में open world बनाना, भाग 1: हमने इसे तोड़ने की कोशिश से शुरुआत की <a class="header-anchor" href="#ब्राउज़र-में-open-world-बनाना-भाग-1-हमने-इसे-तोड़ने-की-कोशिश-से-शुरुआत-की" aria-label="Permalink to &quot;ब्राउज़र में open world बनाना, भाग 1: हमने इसे तोड़ने की कोशिश से शुरुआत की&quot;"></a></h1>
<p><em>लेखक <a href="/hi/about.html">Oleg Sidorkin</a>, Cinevva के CTO और सह-संस्थापक</em></p>
<p>यहां नए हैं? <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">सीरीज़ गाइड</a> का इस्तेमाल करें। इसमें बताया गया है कि spike क्या होता है और सभी भागों के लिंक दिए गए हैं।</p>
<p>हम एक multiplayer open world बना रहे हैं जो पूरी तरह ब्राउज़र में चलता है। कोई install नहीं, कोई app store नहीं, बस एक URL। सबसे बड़ा risk शुरू से ही साफ था: क्या एक ब्राउज़र खेलने लायक frame rates पर एक persistent 3D world को render कर सकता है और साथ ही gameplay, physics और networking के लिए भी जगह छोड़ सकता है?</p>
<p>ज़्यादातर open world प्रोजेक्ट एक तय क्रम में नाकाम होते हैं। पहले आपको एक अच्छा concept मिलता है। फिर आपको एक खूबसूरत scene मिलता है। फिर आपको एहसास होता है कि gameplay के अस्तित्व में आने से पहले ही आपका frame budget खत्म हो चुका है।</p>
<p>हम बाकी किसी भी चीज़ में निवेश करने से पहले render budget वाले सवाल का जवाब चाहते थे। इसलिए Spike 1 ने खूबसूरत trailer को छोड़कर सीधे मापने का काम किया।</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/01-terrain/" title="Spike 1 Terrain and Instancing" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/01-terrain/" target="_blank">Spike 1 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=01-terrain">सोर्स देखें</a></p>
<p>सेटअप जानबूझकर सरल था। एक 512 मीटर का terrain mesh, island falloff के साथ layered sine noise से बनी procedural height, एक water plane, atmospheric fog, और 500 instanced objects। हमने plain WebGL का इस्तेमाल Three.js के साथ किया, ACES tone mapping, और कोई shadows नहीं।</p>
<p>हमें इस बात की परवाह नहीं थी कि यह कैसा दिखता है। हमें इस बात की परवाह थी कि camera को इसमें घुमाते वक्त scene स्थिर रहता है या नहीं।</p>
<p>इस spike से दो चीज़ें निकलीं जिन्होंने पूरे प्रोजेक्ट को आकार दिया।</p>
<p>पहली, हमने पुष्टि की कि अगर हम पहले pass को अनुशासित रखें तो desktop पर हमारे पास सचमुच जगह बची हुई थी। इससे हमें बाद में मुश्किल terrain architecture आज़माने का भरोसा मिला।</p>
<p>दूसरी, हमने एक baseline contract बनाया। आने वाले हर spike को इस scene के मुकाबले अपनी लागत समझानी थी। अगर कोई नया feature अच्छा दिखता था लेकिन उसकी लागत बहुत ज़्यादा थी, तो उसे आगे नहीं बढ़ाया जाता था।</p>
<p>वह baseline अनुशासन बाद में बहुत अहम बन गया जब हम seam artifacts, mixed LOD transitions, और compute driven meshing से टकराए। एक स्थिर reference के बिना, हर bug असल से बड़ा दिखता है।</p>
<p>भाग 2 में हम rendering से आगे बढ़कर input feel पर जाते हैं। Worker physics architecture docs में बढ़िया लगती है। यह सिर्फ़ तभी मायने रखती है जब आप कोई key दबाएं और character अब भी तुरंत प्रतिक्रिया देता महसूस हो।</p>
<h2 id="इस-अध्याय-में-बताई-गई-technology" tabindex="-1">इस अध्याय में बताई गई technology <a class="header-anchor" href="#इस-अध्याय-में-बताई-गई-technology" aria-label="Permalink to &quot;इस अध्याय में बताई गई technology&quot;"></a></h2>
<p><strong>Heightmap terrain.</strong> एक 2D grid जहां हर cell एक अकेला elevation value रखता है। GPU vertex shader में एक flat mesh को विस्थापित करके terrain की सतह बनाता है। Heightmaps compact होते हैं (16-bit पर एक 65x65 chunk ~8 KB का होता है), GPU-friendly होते हैं, और render करने में तेज़ होते हैं। इसकी सीमा यह है कि ये गुफाओं, overhangs, या किसी भी ऐसी सतह को नहीं दिखा सकते जो खुद पर वापस मुड़ जाती है। heightmap की सीमाओं और उनके बाद क्या आता है, इसकी पृष्ठभूमि के लिए, हमारी <a href="/hi/guides/landscape-generation-browser.html#why-heightmaps-arent-enough">landscape generation गाइड</a> देखें।</p>
<p><strong>Three.js.</strong> वह rendering library जो हमने इस पूरे प्रोजेक्ट में इस्तेमाल की। Three.js, WebGL 2 (और बाद में WebGPU) को cameras, lights, materials, और geometry objects वाले एक scene graph में बदल देती है। यह एक ही draw call में एक ही geometry की कई copies render करने के लिए <code>InstancedMesh</code> देती है, साथ ही frustum culling, PBR materials, और post-processing भी। <a href="https://github.com/mrdoob/three.js" target="_blank" rel="noreferrer">GitHub पर Three.js</a> देखें। Three.js एक ब्राउज़र open world stack में कैसे फिट होती है, इसके लिए हमारी <a href="/hi/guides/browser-3d-open-world-tech.html#three-js">browser 3D tech गाइड</a> देखें।</p>
<p><strong>InstancedMesh.</strong> Three.js का एक feature जो एक ही geometry की N copies को एक ही draw call से render करता है, हर एक अलग position/rotation/scale पर। प्रति-instance transforms एक matrix attribute buffer में रखे जाते हैं। इसी तरह हमने Spike 1 में 500 objects को 500 अलग draw calls के बिना render किया। बड़े पैमाने पर vegetation के लिए, GPU-driven instanced culling इसे और आगे ले जाती है। हमारी <a href="/hi/guides/landscape-generation-browser.html#gpu-driven-vegetation-culling">GPU vegetation culling पर landscape गाइड</a> देखें।</p>
<p><strong>Frame budget.</strong> 60 fps पर, हर frame के पास हर चीज़ के लिए <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.816ex;" xmlns="http://www.w3.org/2000/svg" width="13.598ex" height="2.773ex" role="img" focusable="false" viewBox="0 -864.9 6010.2 1225.5" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mfrac"><g data-mml-node="mrow" transform="translate(220,394) scale(0.707)"><g data-mml-node="mn"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(500,0)" style="stroke-width: 3;"/><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(1000,0)" style="stroke-width: 3;"/><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(1500,0)" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(2000,0)"><path data-c="A0" d="" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(2250,0)"><path data-c="6D" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" style="stroke-width: 3;"/><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" transform="translate(833,0)" style="stroke-width: 3;"/></g></g><g data-mml-node="mn" transform="translate(1095.8,-345) scale(0.707)"><path data-c="36" d="M42 313Q42 476 123 571T303 666Q372 666 402 630T432 550Q432 525 418 510T379 495Q356 495 341 509T326 548Q326 592 373 601Q351 623 311 626Q240 626 194 566Q147 500 147 364L148 360Q153 366 156 373Q197 433 263 433H267Q313 433 348 414Q372 400 396 374T435 317Q456 268 456 210V192Q456 169 451 149Q440 90 387 34T253 -22Q225 -22 199 -14T143 16T92 75T56 172T42 313ZM257 397Q227 397 205 380T171 335T154 278T148 216Q148 133 160 97T198 39Q222 21 251 21Q302 21 329 59Q342 77 347 104T352 209Q352 289 347 316T329 361Q302 397 257 397Z" style="stroke-width: 3;"/><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(500,0)" style="stroke-width: 3;"/></g><rect width="2658.6" height="60" x="120" y="220"/></g><g data-mml-node="mo" transform="translate(3176.4,0)"><path data-c="2248" d="M55 319Q55 360 72 393T114 444T163 472T205 482Q207 482 213 482T223 483Q262 483 296 468T393 413L443 381Q502 346 553 346Q609 346 649 375T694 454Q694 465 698 474T708 483Q722 483 722 452Q722 386 675 338T555 289Q514 289 468 310T388 357T308 404T224 426Q164 426 125 393T83 318Q81 289 69 289Q55 289 55 319ZM55 85Q55 126 72 159T114 210T163 238T205 248Q207 248 213 248T223 249Q262 249 296 234T393 179L443 147Q502 112 553 112Q609 112 649 141T694 220Q694 249 708 249T722 217Q722 153 675 104T555 55Q514 55 468 76T388 123T308 170T224 192Q164 192 125 159T83 84Q80 55 69 55Q55 55 55 85Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(4232.2,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/><path data-c="36" d="M42 313Q42 476 123 571T303 666Q372 666 402 630T432 550Q432 525 418 510T379 495Q356 495 341 509T326 548Q326 592 373 601Q351 623 311 626Q240 626 194 566Q147 500 147 364L148 360Q153 366 156 373Q197 433 263 433H267Q313 433 348 414Q372 400 396 374T435 317Q456 268 456 210V192Q456 169 451 149Q440 90 387 34T253 -22Q225 -22 199 -14T143 16T92 75T56 172T42 313ZM257 397Q227 397 205 380T171 335T154 278T148 216Q148 133 160 97T198 39Q222 21 251 21Q302 21 329 59Q342 77 347 104T352 209Q352 289 347 316T329 361Q302 397 257 397Z" transform="translate(500,0)" style="stroke-width: 3;"/><path data-c="2E" d="M78 60Q78 84 95 102T138 120Q162 120 180 104T199 61Q199 36 182 18T139 0T96 17T78 60Z" transform="translate(1000,0)" style="stroke-width: 3;"/><path data-c="37" d="M55 458Q56 460 72 567L88 674Q88 676 108 676H128V672Q128 662 143 655T195 646T364 644H485V605L417 512Q408 500 387 472T360 435T339 403T319 367T305 330T292 284T284 230T278 162T275 80Q275 66 275 52T274 28V19Q270 2 255 -10T221 -22Q210 -22 200 -19T179 0T168 40Q168 198 265 368Q285 400 349 489L395 552H302Q128 552 119 546Q113 543 108 522T98 479L95 458V455H55V458Z" transform="translate(1278,0)" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mfrac><mrow><mn>1000</mn><mtext> </mtext><mtext>ms</mtext></mrow><mn>60</mn></mfrac><mo>≈</mo><mn>16.7</mn></math></mjx-assistive-mml></mjx-container> ms होते हैं: JavaScript logic, physics, rendering, और compositing। एक &quot;budget check&quot; spike मापता है कि एक baseline scene इसमें से कितना खपाता है, ताकि बाद में आप जो कुछ भी जोड़ें उसके लिए बची हुई जगह <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.357ex;" xmlns="http://www.w3.org/2000/svg" width="22.813ex" height="1.886ex" role="img" focusable="false" viewBox="0 -676 10083.4 833.8" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(394,-150) scale(0.707)"><path data-c="66" d="M273 0Q255 3 146 3Q43 3 34 0H26V46H42Q70 46 91 49Q99 52 103 60Q104 62 104 224V385H33V431H104V497L105 564L107 574Q126 639 171 668T266 704Q267 704 275 704T289 705Q330 702 351 679T372 627Q372 604 358 590T321 576T284 590T270 627Q270 647 288 667H284Q280 668 273 668Q245 668 223 647T189 592Q183 572 182 497V431H293V385H185V225Q185 63 186 61T189 57T194 54T199 51T206 49T213 48T222 47T231 47T241 46T251 46H282V0H273Z" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(306,0)" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(750,0)" style="stroke-width: 3;"/><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" transform="translate(1250,0)" style="stroke-width: 3;"/><path data-c="75" d="M383 58Q327 -10 256 -10H249Q124 -10 105 89Q104 96 103 226Q102 335 102 348T96 369Q86 385 36 385H25V408Q25 431 27 431L38 432Q48 433 67 434T105 436Q122 437 142 438T172 441T184 442H187V261Q188 77 190 64Q193 49 204 40Q224 26 264 26Q290 26 311 35T343 58T363 90T375 120T379 144Q379 145 379 161T380 201T380 248V315Q380 361 370 372T320 385H302V431Q304 431 378 436T457 442H464V264Q464 84 465 81Q468 61 479 55T524 46H542V0Q540 0 467 -5T390 -11H383V58Z" transform="translate(1639,0)" style="stroke-width: 3;"/><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(2195,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(2587,0)" style="stroke-width: 3;"/><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" transform="translate(3031,0)" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(3143.6,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(4199.4,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/><path data-c="36" d="M42 313Q42 476 123 571T303 666Q372 666 402 630T432 550Q432 525 418 510T379 495Q356 495 341 509T326 548Q326 592 373 601Q351 623 311 626Q240 626 194 566Q147 500 147 364L148 360Q153 366 156 373Q197 433 263 433H267Q313 433 348 414Q372 400 396 374T435 317Q456 268 456 210V192Q456 169 451 149Q440 90 387 34T253 -22Q225 -22 199 -14T143 16T92 75T56 172T42 313ZM257 397Q227 397 205 380T171 335T154 278T148 216Q148 133 160 97T198 39Q222 21 251 21Q302 21 329 59Q342 77 347 104T352 209Q352 289 347 316T329 361Q302 397 257 397Z" transform="translate(500,0)" style="stroke-width: 3;"/><path data-c="2E" d="M78 60Q78 84 95 102T138 120Q162 120 180 104T199 61Q199 36 182 18T139 0T96 17T78 60Z" transform="translate(1000,0)" style="stroke-width: 3;"/><path data-c="37" d="M55 458Q56 460 72 567L88 674Q88 676 108 676H128V672Q128 662 143 655T195 646T364 644H485V605L417 512Q408 500 387 472T360 435T339 403T319 367T305 330T292 284T284 230T278 162T275 80Q275 66 275 52T274 28V19Q270 2 255 -10T221 -22Q210 -22 200 -19T179 0T168 40Q168 198 265 368Q285 400 349 489L395 552H302Q128 552 119 546Q113 543 108 522T98 479L95 458V455H55V458Z" transform="translate(1278,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(6199.6,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(7199.8,0)"><g data-mml-node="mi"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(394,-150) scale(0.707)"><path data-c="62" d="M307 -11Q234 -11 168 55L158 37Q156 34 153 28T147 17T143 10L138 1L118 0H98V298Q98 599 97 603Q94 622 83 628T38 637H20V660Q20 683 22 683L32 684Q42 685 61 686T98 688Q115 689 135 690T165 693T176 694H179V543Q179 391 180 391L183 394Q186 397 192 401T207 411T228 421T254 431T286 439T323 442Q401 442 461 379T522 216Q522 115 458 52T307 -11ZM182 98Q182 97 187 90T196 79T206 67T218 55T233 44T250 35T271 29T295 26Q330 26 363 46T412 113Q424 148 424 212Q424 287 412 323Q385 405 300 405Q270 405 239 390T188 347L182 339V98Z" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(556,0)" style="stroke-width: 3;"/><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" transform="translate(1056,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(1450,0)" style="stroke-width: 3;"/><path data-c="6C" d="M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z" transform="translate(1894,0)" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(2172,0)" style="stroke-width: 3;"/><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(2450,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(3006,0)" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>t</mi><mtext>features</mtext></msub><mo>=</mo><mn>16.7</mn><mo>−</mo><msub><mi>t</mi><mtext>baseline</mtext></msub></math></mjx-assistive-mml></mjx-container> हो। अगर baseline पहले ही 12 ms खा जाता है, तो gameplay, physics, और networking सबके लिए मिलाकर सिर्फ़ ~4.7 ms बचते हैं। यह तरीका AAA open world development से आता है जहां <a href="/hi/guides/browser-3d-open-world-tech.html#what-we-can-learn-from-skyrim-and-the-witcher">GTA V, Skyrim, और Elden Ring</a> सभी तय frame budgets के अंदर रहने के लिए aggressive LOD और streaming का इस्तेमाल करते हैं।</p>
<hr>
<p>12 में से भाग 1।<br>
आगे: <a href="/hi/blog/2026-02-25-open-world-browser-part-02-worker-physics.html">भाग 2 - Worker physics और input lag का डर</a><br>
सीरीज़ गाइड: <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">/hi/blog/2026-02-25-open-world-browser-series-guide</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ब्राउज़र में open world बनाना, भाग 2: Worker physics और input lag का डर]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-02-25-open-world-browser-part-02-worker-physics</link>
            <guid>https://app.cinevva.com/hi/blog/2026-02-25-open-world-browser-part-02-worker-physics</guid>
            <pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[हमने Rapier को एक Web Worker में ले जाया और वही नापा जिसकी सबसे पहले सबको चिंता होती है: क्या movement देर से महसूस होता है?]]></description>
            <content:encoded><![CDATA[<h1 id="ब्राउज़र-में-open-world-बनाना-भाग-2-worker-physics-और-input-lag-का-डर" tabindex="-1">ब्राउज़र में open world बनाना, भाग 2: Worker physics और input lag का डर <a class="header-anchor" href="#ब्राउज़र-में-open-world-बनाना-भाग-2-worker-physics-और-input-lag-का-डर" aria-label="Permalink to &quot;ब्राउज़र में open world बनाना, भाग 2: Worker physics और input lag का डर&quot;"></a></h1>
<p><em>लेखक <a href="/hi/about.html">Oleg Sidorkin</a>, Cinevva के CTO और सह-संस्थापक</em></p>
<p>यहां नए हैं? <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">सीरीज़ गाइड</a> का इस्तेमाल करें। इसमें बताया गया है कि spike क्या होता है और सभी भागों के लिंक दिए गए हैं।</p>
<p>अगर आप काफी समय तक ब्राउज़र multiplayer बनाते रहें, तो आखिरकार आपको यह बहस सुनने को मिलती है।</p>
<p>&quot;Worker में physics साफ-सुथरा architecture है। Main thread पर physics ज़्यादा सुरक्षित महसूस होता है।&quot;</p>
<p>दोनों सच हो सकते हैं। जो मायने रखता है वह है control का एहसास और असली input के तहत latency।</p>
<p>Spike 2 इसी का जवाब देने के लिए बनाया गया था, राय से नहीं बल्कि माप से।</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/02-rapier-worker/" title="Spike 2 Rapier Worker" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/02-rapier-worker/" target="_blank">Spike 2 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=02-rapier-worker">सोर्स देखें</a></p>
<p>हमने Spike 1 का terrain दोबारा इस्तेमाल किया और Rapier को एक समर्पित module worker में जोड़ा। Input state हर frame पर worker को भेजा जाता था, simulation वहीं step होती थी, और authoritative position वापस renderer के पास आती थी।</p>
<p>मुख्य metrics थे input से दिखने वाले movement तक की latency और physics step की timing। हमने सामान्य movement, sprint bursts, और jump cadence के दौरान jitter पर भी नज़र रखी।</p>
<p>नतीजा उम्मीद से बेहतर रहा। हमारे message shape और cadence के साथ, worker boundary latency पर हावी नहीं हुई। Controls अब भी तुरंत महसूस होते थे, और players को बस यही चीज़ मायने रखती है।</p>
<p>इस चरण की एक चुनौती थी interpretation का risk। एक सफल नतीजे के बाद, teams अक्सर बहुत ज़्यादा सामान्यीकरण कर लेती हैं और मान लेती हैं कि architecture का सवाल हमेशा के लिए बंद हो गया। ऐसा नहीं है। हमने सिर्फ एक ठोस scenario और hardware profile को validate किया था। बाद के spikes को भी अपनी धारणाओं की दोबारा जांच करनी पड़ी जब GPU और streaming का दबाव बदला।</p>
<p>इस spike ने हमें एक process upgrade भी दिया। हमने interactive spikes के लिए HUD में timing telemetry को by default दिखाना शुरू किया। इससे team की बातचीत &quot;यह कुछ गड़बड़ महसूस होता है&quot; से बदलकर &quot;इस path ने 1.2 ms जोड़े&quot; हो गई।</p>
<p>भाग 3 में हम उन कम चमक-दमक वाले experiments को देखेंगे जिन्होंने बाद में महंगे झटकों से बचाया। Broadcast load, mobile की पाबंदियां, और behavior generation की भरोसेमंदी।</p>
<h2 id="इस-अध्याय-में-संदर्भित-technology" tabindex="-1">इस अध्याय में संदर्भित technology <a class="header-anchor" href="#इस-अध्याय-में-संदर्भित-technology" aria-label="Permalink to &quot;इस अध्याय में संदर्भित technology&quot;"></a></h2>
<p><strong>Rapier.</strong> Rust में लिखा गया एक physics engine जो ब्राउज़र में इस्तेमाल के लिए WebAssembly में compile होता है। यह rigid bodies, colliders, joints, character controllers, और raycasting को native से 2-3x performance पर संभालता है। Open worlds के लिए, Rapier player character controllers (terrain पर चलना, steps चढ़ना, slopes पर फिसलना), object collision, interactions के लिए raycasting, और trigger volumes देता है। देखें <a href="https://rapier.rs/" target="_blank" rel="noreferrer">Rapier documentation</a> और हमारी <a href="/hi/guides/browser-3d-open-world-tech.html#rapier-rust-wasm">physics पर browser 3D tech guide</a>।</p>
<p><strong>Web Workers.</strong> ब्राउज़र threads जो JavaScript (या Wasm) को main thread से अलग चलाते हैं। Worker में physics simulation का मतलब है कि एक भारी <code>world.step()</code> call rendering को block नहीं करती। Main thread हर frame पर <code>postMessage</code> के ज़रिए worker को input state भेजता है और बदले में authoritative positions पाता है। Latency की कीमत है दो message hops (desktop पर हर एक ~0.1-0.5 ms)। फायदा यह है कि render thread कभी collision detection पर अटकता नहीं। Transferable objects (<code>ArrayBuffer</code> transfer) बड़े position arrays के लिए copy overhead को खत्म कर देते हैं।</p>
<p><strong>WebAssembly (Wasm).</strong> एक binary instruction format जो ब्राउज़र में near-native speed पर चलता है। Rapier, Havok, और Recast सभी Wasm में compile होते हैं। Rapier-Wasm में physics step कुछ सौ bodies के लिए आमतौर पर 0.5-2 ms होता है, जबकि बराबर के JavaScript के लिए 5-15 ms। Wasm modules <code>.wasm</code> files के रूप में JavaScript glue code के साथ load होते हैं। देखें <a href="https://webassembly.org/" target="_blank" rel="noreferrer">WebAssembly specification</a>।</p>
<p><strong>Input-to-visual latency.</strong> एक keypress और स्क्रीन पर उसके फलस्वरूप होने वाले visual बदलाव के बीच का समय। Movement को &quot;तुरंत&quot; महसूस होने के लिए, यह ~80 ms से नीचे रहना चाहिए। Worker physics setup में यह chain जुड़ती जाती है:</p>
<mjx-container tabindex="0" class="MathJax" jax="SVG" display="true" style="direction: ltr; display: block; text-align: center; margin: 1em 0; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.669ex;" xmlns="http://www.w3.org/2000/svg" width="39.876ex" height="2.214ex" role="img" focusable="false" viewBox="0 -683 17625.4 978.7" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D43F" d="M228 637Q194 637 192 641Q191 643 191 649Q191 673 202 682Q204 683 217 683Q271 680 344 680Q485 680 506 683H518Q524 677 524 674T522 656Q517 641 513 637H475Q406 636 394 628Q387 624 380 600T313 336Q297 271 279 198T252 88L243 52Q243 48 252 48T311 46H328Q360 46 379 47T428 54T478 72T522 106T564 161Q580 191 594 228T611 270Q616 273 628 273H641Q647 264 647 262T627 203T583 83T557 9Q555 4 553 3T537 0T494 -1Q483 -1 418 -1T294 0H116Q32 0 32 10Q32 17 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628Q285 635 228 637Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(958.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(2014.6,0)"><g data-mml-node="mi"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(394,-150) scale(0.707)"><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" style="stroke-width: 3;"/><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(278,0)" style="stroke-width: 3;"/><path data-c="70" d="M36 -148H50Q89 -148 97 -134V-126Q97 -119 97 -107T97 -77T98 -38T98 6T98 55T98 106Q98 140 98 177T98 243T98 296T97 335T97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 61 434T98 436Q115 437 135 438T165 441T176 442H179V416L180 390L188 397Q247 441 326 441Q407 441 464 377T522 216Q522 115 457 52T310 -11Q242 -11 190 33L182 40V-45V-101Q182 -128 184 -134T195 -145Q216 -148 244 -148H260V-194H252L228 -193Q205 -192 178 -192T140 -191Q37 -191 28 -194H20V-148H36ZM424 218Q424 292 390 347T305 402Q234 402 182 337V98Q222 26 294 26Q345 26 384 80T424 218Z" transform="translate(834,0)" style="stroke-width: 3;"/><path data-c="75" d="M383 58Q327 -10 256 -10H249Q124 -10 105 89Q104 96 103 226Q102 335 102 348T96 369Q86 385 36 385H25V408Q25 431 27 431L38 432Q48 433 67 434T105 436Q122 437 142 438T172 441T184 442H187V261Q188 77 190 64Q193 49 204 40Q224 26 264 26Q290 26 311 35T343 58T363 90T375 120T379 144Q379 145 379 161T380 201T380 248V315Q380 361 370 372T320 385H302V431Q304 431 378 436T457 442H464V264Q464 84 465 81Q468 61 479 55T524 46H542V0Q540 0 467 -5T390 -11H383V58Z" transform="translate(1390,0)" style="stroke-width: 3;"/><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" transform="translate(1946,0)" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(4331.9,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(5332.1,0)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g><g data-mml-node="mstyle" transform="translate(5832.1,0)"><g data-mml-node="mspace"/></g><g data-mml-node="msub" transform="translate(5999.1,0)"><g data-mml-node="mi"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(394,-150) scale(0.707)"><path data-c="6D" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" style="stroke-width: 3;"/><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" transform="translate(833,0)" style="stroke-width: 3;"/><path data-c="67" d="M329 409Q373 453 429 453Q459 453 472 434T485 396Q485 382 476 371T449 360Q416 360 412 390Q410 404 415 411Q415 412 416 414V415Q388 412 363 393Q355 388 355 386Q355 385 359 381T368 369T379 351T388 325T392 292Q392 230 343 187T222 143Q172 143 123 171Q112 153 112 133Q112 98 138 81Q147 75 155 75T227 73Q311 72 335 67Q396 58 431 26Q470 -13 470 -72Q470 -139 392 -175Q332 -206 250 -206Q167 -206 107 -175Q29 -140 29 -75Q29 -39 50 -15T92 18L103 24Q67 55 67 108Q67 155 96 193Q52 237 52 292Q52 355 102 398T223 442Q274 442 318 416L329 409ZM299 343Q294 371 273 387T221 404Q192 404 171 388T145 343Q142 326 142 292Q142 248 149 227T179 192Q196 182 222 182Q244 182 260 189T283 207T294 227T299 242Q302 258 302 292T299 343ZM403 -75Q403 -50 389 -34T348 -11T299 -2T245 0H218Q151 0 138 -6Q118 -15 107 -34T95 -74Q95 -84 101 -97T122 -127T170 -155T250 -167Q319 -167 361 -139T403 -75Z" transform="translate(1227,0)" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(7886.5,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(8886.7,0)"><g data-mml-node="mi"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(394,-150) scale(0.707)"><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" style="stroke-width: 3;"/><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" transform="translate(394,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(783,0)" style="stroke-width: 3;"/><path data-c="70" d="M36 -148H50Q89 -148 97 -134V-126Q97 -119 97 -107T97 -77T98 -38T98 6T98 55T98 106Q98 140 98 177T98 243T98 296T97 335T97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 61 434T98 436Q115 437 135 438T165 441T176 442H179V416L180 390L188 397Q247 441 326 441Q407 441 464 377T522 216Q522 115 457 52T310 -11Q242 -11 190 33L182 40V-45V-101Q182 -128 184 -134T195 -145Q216 -148 244 -148H260V-194H252L228 -193Q205 -192 178 -192T140 -191Q37 -191 28 -194H20V-148H36ZM424 218Q424 292 390 347T305 402Q234 402 182 337V98Q222 26 294 26Q345 26 384 80T424 218Z" transform="translate(1227,0)" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(10813.7,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(11813.9,0)"><g data-mml-node="mi"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(394,-150) scale(0.707)"><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(392,0)" style="stroke-width: 3;"/><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(836,0)" style="stroke-width: 3;"/><path data-c="64" d="M376 495Q376 511 376 535T377 568Q377 613 367 624T316 637H298V660Q298 683 300 683L310 684Q320 685 339 686T376 688Q393 689 413 690T443 693T454 694H457V390Q457 84 458 81Q461 61 472 55T517 46H535V0Q533 0 459 -5T380 -11H373V44L365 37Q307 -11 235 -11Q158 -11 96 50T34 215Q34 315 97 378T244 442Q319 442 376 393V495ZM373 342Q328 405 260 405Q211 405 173 369Q146 341 139 305T131 211Q131 155 138 120T173 59Q203 26 251 26Q322 26 373 103V342Z" transform="translate(1392,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(1948,0)" style="stroke-width: 3;"/><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(2392,0)" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(14448.7,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(15449,0)"><g data-mml-node="mi"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(394,-150) scale(0.707)"><path data-c="76" d="M338 431Q344 429 422 429Q479 429 503 431H508V385H497Q439 381 423 345Q421 341 356 172T288 -2Q283 -11 263 -11Q244 -11 239 -2Q99 359 98 364Q93 378 82 381T43 385H19V431H25L33 430Q41 430 53 430T79 430T104 429T122 428Q217 428 232 431H240V385H226Q187 384 184 370Q184 366 235 234L286 102L377 341V349Q377 363 367 372T349 383T335 385H331V431H338Z" style="stroke-width: 3;"/><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" transform="translate(528,0)" style="stroke-width: 3;"/><path data-c="79" d="M69 -66Q91 -66 104 -80T118 -116Q118 -134 109 -145T91 -160Q84 -163 97 -166Q104 -168 111 -168Q131 -168 148 -159T175 -138T197 -106T213 -75T225 -43L242 0L170 183Q150 233 125 297Q101 358 96 368T80 381Q79 382 78 382Q66 385 34 385H19V431H26L46 430Q65 430 88 429T122 428Q129 428 142 428T171 429T200 430T224 430L233 431H241V385H232Q183 385 185 366L286 112Q286 113 332 227L376 341V350Q376 365 366 373T348 383T334 385H331V431H337H344Q351 431 361 431T382 430T405 429T422 429Q477 429 503 431H508V385H497Q441 380 422 345Q420 343 378 235T289 9T227 -131Q180 -204 113 -204Q69 -204 44 -177T19 -116Q19 -89 35 -78T69 -66Z" transform="translate(922,0)" style="stroke-width: 3;"/><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(1450,0)" style="stroke-width: 3;"/><path data-c="63" d="M370 305T349 305T313 320T297 358Q297 381 312 396Q317 401 317 402T307 404Q281 408 258 408Q209 408 178 376Q131 329 131 219Q131 137 162 90Q203 29 272 29Q313 29 338 55T374 117Q376 125 379 127T395 129H409Q415 123 415 120Q415 116 411 104T395 71T366 33T318 2T249 -11Q163 -11 99 53T34 214Q34 318 99 383T250 448T370 421T404 357Q404 334 387 320Z" transform="translate(2006,0)" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="block" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; overflow: hidden; width: 100%;"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mi>L</mi><mo>=</mo><msub><mi>t</mi><mtext>input</mtext></msub><mo>+</mo><mn>2</mn><mstyle scriptlevel="0"><mspace width="0.167em"/></mstyle><msub><mi>t</mi><mtext>msg</mtext></msub><mo>+</mo><msub><mi>t</mi><mtext>step</mtext></msub><mo>+</mo><msub><mi>t</mi><mtext>render</mtext></msub><mo>+</mo><msub><mi>t</mi><mtext>vsync</mtext></msub></math></mjx-assistive-mml></mjx-container><p>keydown event (main thread), worker को <code>postMessage</code> और वापस (<mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.669ex;" xmlns="http://www.w3.org/2000/svg" width="5.276ex" height="2.176ex" role="img" focusable="false" viewBox="0 -666 2332.2 961.7" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mn"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g><g data-mml-node="mstyle" transform="translate(500,0)"><g data-mml-node="mspace"/></g><g data-mml-node="msub" transform="translate(667,0)"><g data-mml-node="mi"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(394,-150) scale(0.707)"><path data-c="6D" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" style="stroke-width: 3;"/><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" transform="translate(833,0)" style="stroke-width: 3;"/><path data-c="67" d="M329 409Q373 453 429 453Q459 453 472 434T485 396Q485 382 476 371T449 360Q416 360 412 390Q410 404 415 411Q415 412 416 414V415Q388 412 363 393Q355 388 355 386Q355 385 359 381T368 369T379 351T388 325T392 292Q392 230 343 187T222 143Q172 143 123 171Q112 153 112 133Q112 98 138 81Q147 75 155 75T227 73Q311 72 335 67Q396 58 431 26Q470 -13 470 -72Q470 -139 392 -175Q332 -206 250 -206Q167 -206 107 -175Q29 -140 29 -75Q29 -39 50 -15T92 18L103 24Q67 55 67 108Q67 155 96 193Q52 237 52 292Q52 355 102 398T223 442Q274 442 318 416L329 409ZM299 343Q294 371 273 387T221 404Q192 404 171 388T145 343Q142 326 142 292Q142 248 149 227T179 192Q196 182 222 182Q244 182 260 189T283 207T294 227T299 242Q302 258 302 292T299 343ZM403 -75Q403 -50 389 -34T348 -11T299 -2T245 0H218Q151 0 138 -6Q118 -15 107 -34T95 -74Q95 -84 101 -97T122 -127T170 -155T250 -167Q319 -167 361 -139T403 -75Z" transform="translate(1227,0)" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>2</mn><mstyle scriptlevel="0"><mspace width="0.167em"/></mstyle><msub><mi>t</mi><mtext>msg</mtext></msub></math></mjx-assistive-mml></mjx-container>), physics step, renderer द्वारा नई position लागू करना, फिर अगला vsync। हर term अपने आप में छोटा है (desktop पर हर message hop ~0.1-0.5 ms), लेकिन ये जुड़ते जाते हैं, इसीलिए हमने architecture diagram पर भरोसा करने के बजाय <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="1.541ex" height="1.545ex" role="img" focusable="false" viewBox="0 -683 681 683" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D43F" d="M228 637Q194 637 192 641Q191 643 191 649Q191 673 202 682Q204 683 217 683Q271 680 344 680Q485 680 506 683H518Q524 677 524 674T522 656Q517 641 513 637H475Q406 636 394 628Q387 624 380 600T313 336Q297 271 279 198T252 88L243 52Q243 48 252 48T311 46H328Q360 46 379 47T428 54T478 72T522 106T564 161Q580 191 594 228T611 270Q616 273 628 273H641Q647 264 647 262T627 203T583 83T557 9Q555 4 553 3T537 0T494 -1Q483 -1 418 -1T294 0H116Q32 0 32 10Q32 17 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628Q285 635 228 637Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>L</mi></math></mjx-assistive-mml></mjx-container> को सीधे नापा।</p>
<hr>
<p>12 में से भाग 2।<br>
पिछला: <a href="/hi/blog/2026-02-25-open-world-browser-part-01-risk-first.html">भाग 1 - हमने इसे तोड़ने की कोशिश से शुरुआत की</a><br>
अगला: <a href="/hi/blog/2026-02-25-open-world-browser-part-03-the-unflashy-spikes.html">भाग 3 - वे बेरंग spikes जिन्होंने हमें बचाया</a><br>
सीरीज़ गाइड: <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">/hi/blog/2026-02-25-open-world-browser-series-guide</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Browser में open world बनाना, भाग 3: वे साधारण spikes जिन्होंने हमें बचाया]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-02-25-open-world-browser-part-03-the-unflashy-spikes</link>
            <guid>https://app.cinevva.com/hi/blog/2026-02-25-open-world-browser-part-03-the-unflashy-spikes</guid>
            <pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Durable Object broadcast load, mobile quality की सीमाएं, और behavior generation की विश्वसनीयता दिखने में मामूली थीं, लेकिन इन्होंने महंगी मुश्किलों को आने से रोका।]]></description>
            <content:encoded><![CDATA[<h1 id="browser-में-open-world-बनाना-भाग-3-वे-साधारण-spikes-जिन्होंने-हमें-बचाया" tabindex="-1">Browser में open world बनाना, भाग 3: वे साधारण spikes जिन्होंने हमें बचाया <a class="header-anchor" href="#browser-में-open-world-बनाना-भाग-3-वे-साधारण-spikes-जिन्होंने-हमें-बचाया" aria-label="Permalink to &quot;Browser में open world बनाना, भाग 3: वे साधारण spikes जिन्होंने हमें बचाया&quot;"></a></h1>
<p><em>लेखक <a href="/hi/about.html">Oleg Sidorkin</a>, Cinevva के CTO और सह-संस्थापक</em></p>
<p>यहां नए हैं? <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">series guide</a> का इस्तेमाल करें। यह बताती है कि spike क्या होता है और सभी भागों को जोड़ती है।</p>
<p>इस भाग में चमकदार screenshots कम हैं और architecture का बीमा ज़्यादा।</p>
<p>Spike 1 और 2 के बाद, हमने तीन risk checks किए जो छोटे लगते थे लेकिन उनका असर product के स्तर पर था।</p>
<p>पहला था Durable Objects के साथ broadcast fan out। हमने game जैसी tick rates पर multi client position distribution को टेस्ट किया और latency distribution, हर tick पर CPU, और delivery integrity को ट्रैक किया। अगर यह fail होता, तो हम single island ownership के बजाय जल्दी sharding की तरफ चले जाते।</p>
<p>दूसरा था mobile constraint validation। ये कोई desktop preset को mobile नाम देकर रखना नहीं था, बल्कि उसी baseline terrain से बना एक साफ़ low-cost profile था।</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/01-terrain/?quality=mobile" title="Mobile quality profile based on Spike 1" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/01-terrain/?quality=mobile" target="_blank">mobile profile को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=01-terrain">source देखें</a></p>
<p>हमने segment density, object count, render resolution का दबाव, और fog range को घटाया। सवाल आसान था। क्या यह world mobile जैसी सीमाओं पर पढ़ने लायक और responsive रह सकता है, बिना पूरे renderer को दोबारा लिखे।</p>
<p>तीसरा था creator workflows के लिए behavior generation की विश्वसनीयता। हमने valid JSON rate, अपेक्षित primitives के मुकाबले semantic सटीकता, और response latency का आकलन किया। अगर यह fail होता, तो हम strict form आधारित behavior authoring की तरफ चले जाते।</p>
<p>इस अध्याय की मुख्य सीख यह है कि इन साधारण spikes ने architecture को visual spikes से भी तेज़ बदला। इन्होंने network topology, mobile के वादों, और tool UX पर पक्की सीमाएं तय कर दीं।</p>
<p>भाग 4 में हम दिखने वाले terrain के काम पर लौटते हैं और सिर्फ़ static loading screenshots नहीं, बल्कि movement-time streaming behavior को टेस्ट करते हैं।</p>
<h2 id="इस-अध्याय-में-जिन-technologies-का-ज़िक्र-हुआ" tabindex="-1">इस अध्याय में जिन technologies का ज़िक्र हुआ <a class="header-anchor" href="#इस-अध्याय-में-जिन-technologies-का-ज़िक्र-हुआ" aria-label="Permalink to &quot;इस अध्याय में जिन technologies का ज़िक्र हुआ&quot;"></a></h2>
<p><strong>Cloudflare Durable Objects.</strong> Edge पर deploy होने वाले stateful serverless instances जिनमें built-in persistence और WebSocket support होता है। हर Durable Object एक world shard (या chunk) के लिए authoritative state रखता है। Players WebSocket के ज़रिए जुड़ते हैं और उसी shard के दूसरे players से position broadcasts पाते हैं। जब player किसी adjacent chunk में जाता है, तो वह उस chunk के Durable Object से जुड़ जाता है। Durable Objects state को अपने आप disk पर persist करते हैं और हज़ारों concurrent instances तक scale करते हैं। देखें <a href="https://developers.cloudflare.com/durable-objects/" target="_blank" rel="noreferrer">Cloudflare Durable Objects docs</a> और हमारी <a href="/hi/guides/browser-3d-open-world-tech.html#multiplayer-networking">multiplayer networking पर browser 3D tech guide</a>।</p>
<p><strong>Spatial sharding.</strong> World को geographic region के हिसाब से server instances पर बांटना। हर shard, world grid के एक rectangular इलाके का मालिक होता है। जैसे-जैसे player density बदलती है, shards बंट सकते हैं या जुड़ सकते हैं। किसी shard boundary के पास के players cross-shard visibility queries के ज़रिए दोनों shards का content देखते हैं। इसी तरह <a href="/hi/guides/browser-3d-open-world-tech.html#server-architecture">EVE Online एक ही universe में हज़ारों players को संभालता है</a>।</p>
<p><strong>WebSocket broadcast fan-out.</strong> एक server से कई जुड़े हुए clients तक real-time position updates पहुंचाना। हर client का downstream bandwidth उस भीड़ के साथ linearly बढ़ता है जो आप देख सकते हैं:</p>
<mjx-container tabindex="0" class="MathJax" jax="SVG" display="true" style="direction: ltr; display: block; text-align: center; margin: 1em 0; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.666ex;" xmlns="http://www.w3.org/2000/svg" width="23.398ex" height="2.236ex" role="img" focusable="false" viewBox="0 -694 10341.8 988.2" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D435" d="M231 637Q204 637 199 638T194 649Q194 676 205 682Q206 683 335 683Q594 683 608 681Q671 671 713 636T756 544Q756 480 698 429T565 360L555 357Q619 348 660 311T702 219Q702 146 630 78T453 1Q446 0 242 0Q42 0 39 2Q35 5 35 10Q35 17 37 24Q42 43 47 45Q51 46 62 46H68Q95 46 128 49Q142 52 147 61Q150 65 219 339T288 628Q288 635 231 637ZM649 544Q649 574 634 600T585 634Q578 636 493 637Q473 637 451 637T416 636H403Q388 635 384 626Q382 622 352 506Q352 503 351 500L320 374H401Q482 374 494 376Q554 386 601 434T649 544ZM595 229Q595 273 572 302T512 336Q506 337 429 337Q311 337 310 336Q310 334 293 263T258 122L240 52Q240 48 252 48T333 46Q422 46 429 47Q491 54 543 105T595 229Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(792,-150) scale(0.707)"><path data-c="63" d="M370 305T349 305T313 320T297 358Q297 381 312 396Q317 401 317 402T307 404Q281 408 258 408Q209 408 178 376Q131 329 131 219Q131 137 162 90Q203 29 272 29Q313 29 338 55T374 117Q376 125 379 127T395 129H409Q415 123 415 120Q415 116 411 104T395 71T366 33T318 2T249 -11Q163 -11 99 53T34 214Q34 318 99 383T250 448T370 421T404 357Q404 334 387 320Z" style="stroke-width: 3;"/><path data-c="6C" d="M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z" transform="translate(444,0)" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(722,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(1000,0)" style="stroke-width: 3;"/><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(1444,0)" style="stroke-width: 3;"/><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" transform="translate(2000,0)" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(2809.1,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(3864.8,0)"><g data-mml-node="mi"><path data-c="1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(836,-150) scale(0.707)"><path data-c="76" d="M338 431Q344 429 422 429Q479 429 503 431H508V385H497Q439 381 423 345Q421 341 356 172T288 -2Q283 -11 263 -11Q244 -11 239 -2Q99 359 98 364Q93 378 82 381T43 385H19V431H25L33 430Q41 430 53 430T79 430T104 429T122 428Q217 428 232 431H240V385H226Q187 384 184 370Q184 366 235 234L286 102L377 341V349Q377 363 367 372T349 383T335 385H331V431H338Z" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(528,0)" style="stroke-width: 3;"/><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" transform="translate(806,0)" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(1200,0)" style="stroke-width: 3;"/><path data-c="62" d="M307 -11Q234 -11 168 55L158 37Q156 34 153 28T147 17T143 10L138 1L118 0H98V298Q98 599 97 603Q94 622 83 628T38 637H20V660Q20 683 22 683L32 684Q42 685 61 686T98 688Q115 689 135 690T165 693T176 694H179V543Q179 391 180 391L183 394Q186 397 192 401T207 411T228 421T254 431T286 439T323 442Q401 442 461 379T522 216Q522 115 458 52T307 -11ZM182 98Q182 97 187 90T196 79T206 67T218 55T233 44T250 35T271 29T295 26Q330 26 363 46T412 113Q424 148 424 212Q424 287 412 323Q385 405 300 405Q270 405 239 390T188 347L182 339V98Z" transform="translate(1478,0)" style="stroke-width: 3;"/><path data-c="6C" d="M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z" transform="translate(2034,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(2312,0)" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(6921.8,0)"><path data-c="D7" d="M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(7922.1,0)"><g data-mml-node="mi"><path data-c="1D44F" d="M73 647Q73 657 77 670T89 683Q90 683 161 688T234 694Q246 694 246 685T212 542Q204 508 195 472T180 418L176 399Q176 396 182 402Q231 442 283 442Q345 442 383 396T422 280Q422 169 343 79T173 -11Q123 -11 82 27T40 150V159Q40 180 48 217T97 414Q147 611 147 623T109 637Q104 637 101 637H96Q86 637 83 637T76 640T73 647ZM336 325V331Q336 405 275 405Q258 405 240 397T207 376T181 352T163 330L157 322L136 236Q114 150 114 114Q114 66 138 42Q154 26 178 26Q211 26 245 58Q270 81 285 114T318 219Q336 291 336 325Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(462,-150) scale(0.707)"><path data-c="70" d="M36 -148H50Q89 -148 97 -134V-126Q97 -119 97 -107T97 -77T98 -38T98 6T98 55T98 106Q98 140 98 177T98 243T98 296T97 335T97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 61 434T98 436Q115 437 135 438T165 441T176 442H179V416L180 390L188 397Q247 441 326 441Q407 441 464 377T522 216Q522 115 457 52T310 -11Q242 -11 190 33L182 40V-45V-101Q182 -128 184 -134T195 -145Q216 -148 244 -148H260V-194H252L228 -193Q205 -192 178 -192T140 -191Q37 -191 28 -194H20V-148H36ZM424 218Q424 292 390 347T305 402Q234 402 182 337V98Q222 26 294 26Q345 26 384 80T424 218Z" style="stroke-width: 3;"/><path data-c="6C" d="M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z" transform="translate(556,0)" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(834,0)" style="stroke-width: 3;"/><path data-c="79" d="M69 -66Q91 -66 104 -80T118 -116Q118 -134 109 -145T91 -160Q84 -163 97 -166Q104 -168 111 -168Q131 -168 148 -159T175 -138T197 -106T213 -75T225 -43L242 0L170 183Q150 233 125 297Q101 358 96 368T80 381Q79 382 78 382Q66 385 34 385H19V431H26L46 430Q65 430 88 429T122 428Q129 428 142 428T171 429T200 430T224 430L233 431H241V385H232Q183 385 185 366L286 112Q286 113 332 227L376 341V350Q376 365 366 373T348 383T334 385H331V431H337H344Q351 431 361 431T382 430T405 429T422 429Q477 429 503 431H508V385H497Q441 380 422 345Q420 343 378 235T289 9T227 -131Q180 -204 113 -204Q69 -204 44 -177T19 -116Q19 -89 35 -78T69 -66Z" transform="translate(1334,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(1862,0)" style="stroke-width: 3;"/><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(2306,0)" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="block" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; overflow: hidden; width: 100%;"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><msub><mi>B</mi><mtext>client</mtext></msub><mo>=</mo><msub><mi>N</mi><mtext>visible</mtext></msub><mo>×</mo><msub><mi>b</mi><mtext>player</mtext></msub></math></mjx-assistive-mml></mjx-container><p>game जैसी tick rates (20-30 Hz) पर हर player करीब <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.666ex;" xmlns="http://www.w3.org/2000/svg" width="11.885ex" height="2.236ex" role="img" focusable="false" viewBox="0 -694 5253.3 988.2" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D44F" d="M73 647Q73 657 77 670T89 683Q90 683 161 688T234 694Q246 694 246 685T212 542Q204 508 195 472T180 418L176 399Q176 396 182 402Q231 442 283 442Q345 442 383 396T422 280Q422 169 343 79T173 -11Q123 -11 82 27T40 150V159Q40 180 48 217T97 414Q147 611 147 623T109 637Q104 637 101 637H96Q86 637 83 637T76 640T73 647ZM336 325V331Q336 405 275 405Q258 405 240 397T207 376T181 352T163 330L157 322L136 236Q114 150 114 114Q114 66 138 42Q154 26 178 26Q211 26 245 58Q270 81 285 114T318 219Q336 291 336 325Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(462,-150) scale(0.707)"><path data-c="70" d="M36 -148H50Q89 -148 97 -134V-126Q97 -119 97 -107T97 -77T98 -38T98 6T98 55T98 106Q98 140 98 177T98 243T98 296T97 335T97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 61 434T98 436Q115 437 135 438T165 441T176 442H179V416L180 390L188 397Q247 441 326 441Q407 441 464 377T522 216Q522 115 457 52T310 -11Q242 -11 190 33L182 40V-45V-101Q182 -128 184 -134T195 -145Q216 -148 244 -148H260V-194H252L228 -193Q205 -192 178 -192T140 -191Q37 -191 28 -194H20V-148H36ZM424 218Q424 292 390 347T305 402Q234 402 182 337V98Q222 26 294 26Q345 26 384 80T424 218Z" style="stroke-width: 3;"/><path data-c="6C" d="M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z" transform="translate(556,0)" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(834,0)" style="stroke-width: 3;"/><path data-c="79" d="M69 -66Q91 -66 104 -80T118 -116Q118 -134 109 -145T91 -160Q84 -163 97 -166Q104 -168 111 -168Q131 -168 148 -159T175 -138T197 -106T213 -75T225 -43L242 0L170 183Q150 233 125 297Q101 358 96 368T80 381Q79 382 78 382Q66 385 34 385H19V431H26L46 430Q65 430 88 429T122 428Q129 428 142 428T171 429T200 430T224 430L233 431H241V385H232Q183 385 185 366L286 112Q286 113 332 227L376 341V350Q376 365 366 373T348 383T334 385H331V431H337H344Q351 431 361 431T382 430T405 429T422 429Q477 429 503 431H508V385H497Q441 380 422 345Q420 343 378 235T289 9T227 -131Q180 -204 113 -204Q69 -204 44 -177T19 -116Q19 -89 35 -78T69 -66Z" transform="translate(1334,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(1862,0)" style="stroke-width: 3;"/><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(2306,0)" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(2697.6,0)"><path data-c="2248" d="M55 319Q55 360 72 393T114 444T163 472T205 482Q207 482 213 482T223 483Q262 483 296 468T393 413L443 381Q502 346 553 346Q609 346 649 375T694 454Q694 465 698 474T708 483Q722 483 722 452Q722 386 675 338T555 289Q514 289 468 310T388 357T308 404T224 426Q164 426 125 393T83 318Q81 289 69 289Q55 289 55 319ZM55 85Q55 126 72 159T114 210T163 238T205 248Q207 248 213 248T223 249Q262 249 296 234T393 179L443 147Q502 112 553 112Q609 112 649 141T694 220Q694 249 708 249T722 217Q722 153 675 104T555 55Q514 55 468 76T388 123T308 170T224 192Q164 192 125 159T83 84Q80 55 69 55Q55 55 55 85Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(3753.3,0)"><path data-c="38" d="M70 417T70 494T124 618T248 666Q319 666 374 624T429 515Q429 485 418 459T392 417T361 389T335 371T324 363L338 354Q352 344 366 334T382 323Q457 264 457 174Q457 95 399 37T249 -22Q159 -22 101 29T43 155Q43 263 172 335L154 348Q133 361 127 368Q70 417 70 494ZM286 386L292 390Q298 394 301 396T311 403T323 413T334 425T345 438T355 454T364 471T369 491T371 513Q371 556 342 586T275 624Q268 625 242 625Q201 625 165 599T128 534Q128 511 141 492T167 463T217 431Q224 426 228 424L286 386ZM250 21Q308 21 350 55T392 137Q392 154 387 169T375 194T353 216T330 234T301 253T274 270Q260 279 244 289T218 306L210 311Q204 311 181 294T133 239T107 157Q107 98 150 60T250 21Z" style="stroke-width: 3;"/><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(500,0)" style="stroke-width: 3;"/><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(1000,0)" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>b</mi><mtext>player</mtext></msub><mo>≈</mo><mn>800</mn></math></mjx-assistive-mml></mjx-container> bytes/second का position data बनाता है, तो नज़र में 200 players का खर्च हर client के लिए <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.186ex;" xmlns="http://www.w3.org/2000/svg" width="15.964ex" height="1.692ex" role="img" focusable="false" viewBox="0 -666 7056 748" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mn"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(500,0)" style="stroke-width: 3;"/><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(1000,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(1722.2,0)"><path data-c="D7" d="M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(2722.4,0)"><path data-c="38" d="M70 417T70 494T124 618T248 666Q319 666 374 624T429 515Q429 485 418 459T392 417T361 389T335 371T324 363L338 354Q352 344 366 334T382 323Q457 264 457 174Q457 95 399 37T249 -22Q159 -22 101 29T43 155Q43 263 172 335L154 348Q133 361 127 368Q70 417 70 494ZM286 386L292 390Q298 394 301 396T311 403T323 413T334 425T345 438T355 454T364 471T369 491T371 513Q371 556 342 586T275 624Q268 625 242 625Q201 625 165 599T128 534Q128 511 141 492T167 463T217 431Q224 426 228 424L286 386ZM250 21Q308 21 350 55T392 137Q392 154 387 169T375 194T353 216T330 234T301 253T274 270Q260 279 244 289T218 306L210 311Q204 311 181 294T133 239T107 157Q107 98 150 60T250 21Z" style="stroke-width: 3;"/><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(500,0)" style="stroke-width: 3;"/><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(1000,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(4500.2,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(5556,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/><path data-c="36" d="M42 313Q42 476 123 571T303 666Q372 666 402 630T432 550Q432 525 418 510T379 495Q356 495 341 509T326 548Q326 592 373 601Q351 623 311 626Q240 626 194 566Q147 500 147 364L148 360Q153 366 156 373Q197 433 263 433H267Q313 433 348 414Q372 400 396 374T435 317Q456 268 456 210V192Q456 169 451 149Q440 90 387 34T253 -22Q225 -22 199 -14T143 16T92 75T56 172T42 313ZM257 397Q227 397 205 380T171 335T154 278T148 216Q148 133 160 97T198 39Q222 21 251 21Q302 21 329 59Q342 77 347 104T352 209Q352 289 347 316T329 361Q302 397 257 397Z" transform="translate(500,0)" style="stroke-width: 3;"/><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(1000,0)" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>200</mn><mo>×</mo><mn>800</mn><mo>=</mo><mn>160</mn></math></mjx-assistive-mml></mjx-container> KB/s होता है। naive all-to-all server cost इससे भी बुरी होती है, जो <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="3.119ex" height="1.887ex" role="img" focusable="false" viewBox="0 -833.9 1378.8 833.9" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msup"><g data-mml-node="mi"><path data-c="1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(975.3,363) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><msup><mi>N</mi><mn>2</mn></msup></math></mjx-assistive-mml></mjx-container> की तरह बढ़ती है, और ठीक इसीलिए relevance filtering (spatial interest management) हर connection पर tick budget के अंदर push करने से पहले <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.357ex;" xmlns="http://www.w3.org/2000/svg" width="6.414ex" height="1.902ex" role="img" focusable="false" viewBox="0 -683 2834.8 840.8" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(836,-150) scale(0.707)"><path data-c="76" d="M338 431Q344 429 422 429Q479 429 503 431H508V385H497Q439 381 423 345Q421 341 356 172T288 -2Q283 -11 263 -11Q244 -11 239 -2Q99 359 98 364Q93 378 82 381T43 385H19V431H25L33 430Q41 430 53 430T79 430T104 429T122 428Q217 428 232 431H240V385H226Q187 384 184 370Q184 366 235 234L286 102L377 341V349Q377 363 367 372T349 383T335 385H331V431H338Z" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(528,0)" style="stroke-width: 3;"/><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" transform="translate(806,0)" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(1200,0)" style="stroke-width: 3;"/><path data-c="62" d="M307 -11Q234 -11 168 55L158 37Q156 34 153 28T147 17T143 10L138 1L118 0H98V298Q98 599 97 603Q94 622 83 628T38 637H20V660Q20 683 22 683L32 684Q42 685 61 686T98 688Q115 689 135 690T165 693T176 694H179V543Q179 391 180 391L183 394Q186 397 192 401T207 411T228 421T254 431T286 439T323 442Q401 442 461 379T522 216Q522 115 458 52T307 -11ZM182 98Q182 97 187 90T196 79T206 67T218 55T233 44T250 35T271 29T295 26Q330 26 363 46T412 113Q424 148 424 212Q424 287 412 323Q385 405 300 405Q270 405 239 390T188 347L182 339V98Z" transform="translate(1478,0)" style="stroke-width: 3;"/><path data-c="6C" d="M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z" transform="translate(2034,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(2312,0)" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>N</mi><mtext>visible</mtext></msub></math></mjx-assistive-mml></mjx-container> पर एक सीमा लगा देता है। delta compression और update frequency के तालमेल के लिए हमारी <a href="/hi/guides/browser-3d-open-world-tech.html#client-server-communication">networking guide</a> देखें।</p>
<p><strong>Mobile rendering की सीमाएं.</strong> Mobile GPUs में desktop GPUs के मुकाबले 1/5 से 1/10 throughput होती है, करीब 1 GB memory की सीमा (desktop पर 2-4 GB के मुकाबले), और लगातार load पर thermal throttling होती है। एक mobile quality profile segment density, object count, render resolution, draw distance, और shadow quality को घटाता है। मकसद desktop की बराबरी नहीं, बल्कि पढ़ने लायक और responsive बने रहना है। असली GPU benchmarks के लिए <a href="/hi/guides/browser-3d-open-world-tech.html#browser-3d-performance-real-numbers">browser 3D performance numbers</a> देखें।</p>
<hr>
<p>12 में से भाग 3.<br>
पिछला: <a href="/hi/blog/2026-02-25-open-world-browser-part-02-worker-physics.html">भाग 2 - Worker physics और input lag का डर</a><br>
अगला: <a href="/hi/blog/2026-02-25-open-world-browser-part-04-streaming-before-fancy.html">भाग 4 - Fancy terrain से पहले streaming</a><br>
Series guide: <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">/blog/2026-02-25-open-world-browser-series-guide</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Browser में open world बनाना, भाग 4: fancy terrain से पहले streaming]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-02-25-open-world-browser-part-04-streaming-before-fancy</link>
            <guid>https://app.cinevva.com/hi/blog/2026-02-25-open-world-browser-part-04-streaming-before-fancy</guid>
            <pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[हमने पहले साधारण content के साथ chunk load और swap को टेस्ट किया, फिर progressive heightmap refinement की तरफ बढ़े। यह क्रम काम आया।]]></description>
            <content:encoded><![CDATA[<h1 id="browser-में-open-world-बनाना-भाग-4-fancy-terrain-से-पहले-streaming" tabindex="-1">Browser में open world बनाना, भाग 4: fancy terrain से पहले streaming <a class="header-anchor" href="#browser-में-open-world-बनाना-भाग-4-fancy-terrain-से-पहले-streaming" aria-label="Permalink to &quot;Browser में open world बनाना, भाग 4: fancy terrain से पहले streaming&quot;"></a></h1>
<p><em>लेखक <a href="/hi/about.html">Oleg Sidorkin</a>, Cinevva के CTO और सह-संस्थापक</em></p>
<p>यहां नए हैं? <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">series guide</a> का इस्तेमाल करें। यह बताती है कि spike क्या होता है और सभी भागों को जोड़ती है।</p>
<p>streaming वही जगह है जहां &quot;दिखने में अच्छे&quot; projects आमतौर पर बिखर जाते हैं।</p>
<p>एक still frame में आप बहुत कुछ छिपा सकते हैं। लेकिन chunk boundary पार करते समय होने वाली 40 ms की hitch को आप नहीं छिपा सकते।</p>
<p>हमने जानबूझकर advanced terrain representation बनाने से पहले streaming को टेस्ट किया। इससे हमें load और unload behavior पर साफ signal मिला।</p>
<p>Spike 6 ने साधारण chunk content के साथ neighborhood churn को verify किया।</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/06-chunk-streaming/" title="Spike 6 Chunk Load Swap" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/06-chunk-streaming/" target="_blank">Spike 6 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=06-chunk-streaming">View source</a></p>
<p>फिर हम Spike 11 में असली terrain path की तरफ बढ़े। worker side decode के साथ height chunk streaming और 17 से 33 से 65 sample grids तक progressive refinement।</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/11-chunk-streaming/" title="Spike 11 Heightmap Chunk Streaming" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/11-chunk-streaming/" target="_blank">Spike 11 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=11-chunk-streaming">View source</a></p>
<p>यह क्रम हमारी उम्मीद से ज़्यादा मायने रखता था। अगर हमने सीधे compressed height chunks से शुरुआत की होती, तो हर hitch अस्पष्ट होती। decode का issue, texture upload का issue, या geometry update का issue। Spike 6 ने Spike 11 के complexity जोड़ने से पहले एक uncertainty layer हटा दी।</p>
<p>इस chapter से एक व्यावहारिक सबक आगे के spikes में काम आया। Upload stalls को सीधे मापना चाहिए, average FPS से अंदाज़ा नहीं लगाना चाहिए। average FPS frame spikes को छिपा देता है, और frame spikes ही वो चीज़ हैं जो users असल में महसूस करते हैं।</p>
<p>भाग 5 में हम visual cost chapter में जाएंगे, जहां vegetation, terrain shaders, और cascaded shadows एक ही frame budget के लिए मुकाबला करते हैं।</p>
<h2 id="इस-chapter-में-संदर्भित-technology" tabindex="-1">इस chapter में संदर्भित technology <a class="header-anchor" href="#इस-chapter-में-संदर्भित-technology" aria-label="Permalink to &quot;इस chapter में संदर्भित technology&quot;"></a></h2>
<p><strong>Chunk-based streaming.</strong> दुनिया को independent chunks की एक grid में बांटा जाता है (आमतौर पर 64x64 मीटर)। जैसे-जैसे player आगे बढ़ता है, पीछे के किनारे के chunks unload होते हैं और सामने के किनारे के chunks stream in होते हैं। <a href="/hi/guides/browser-3d-open-world-tech.html#skyrim-s-cell-system">Skyrim का cell system</a> इसी तरह काम करता है: player के चारों ओर 5x5 cells की grid load रहती है, जो उसके चलने पर swap होती रहती है। browser version इस समीकरण में network latency जोड़ता है, जिससे player velocity के आधार पर predictive pre-fetching ज़रूरी हो जाती है। हमारी <a href="/hi/guides/landscape-generation-browser.html#streaming-architecture-for-terrain">streaming architecture guide</a> देखें।</p>
<p><strong>Progressive heightmap refinement.</strong> terrain पहले low resolution पर भेजें, फिर refine करें। grid sizes मनमाने नहीं हैं: हर level एक <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="18.385ex" height="2.497ex" role="img" focusable="false" viewBox="0 -853.7 8126.1 1103.7" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msup" transform="translate(389,0)"><g data-mml-node="mn"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(533,363) scale(0.707)"><path data-c="1D458" d="M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(1562.6,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(2562.8,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(3062.8,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(3674.1,0)"><path data-c="D7" d="M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(4674.3,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msup" transform="translate(5063.3,0)"><g data-mml-node="mn"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(533,363) scale(0.707)"><path data-c="1D458" d="M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(6236.9,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(7237.1,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(7737.1,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo stretchy="false">(</mo><msup><mn>2</mn><mi>k</mi></msup><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo><mo>×</mo><mo stretchy="false">(</mo><msup><mn>2</mn><mi>k</mi></msup><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo></math></mjx-assistive-mml></mjx-container> grid होता है, इसलिए <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.186ex;" xmlns="http://www.w3.org/2000/svg" width="11.295ex" height="2.09ex" role="img" focusable="false" viewBox="0 -841.7 4992.6 923.7" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mn"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/><path data-c="37" d="M55 458Q56 460 72 567L88 674Q88 676 108 676H128V672Q128 662 143 655T195 646T364 644H485V605L417 512Q408 500 387 472T360 435T339 403T319 367T305 330T292 284T284 230T278 162T275 80Q275 66 275 52T274 28V19Q270 2 255 -10T221 -22Q210 -22 200 -19T179 0T168 40Q168 198 265 368Q285 400 349 489L395 552H302Q128 552 119 546Q113 543 108 522T98 479L95 458V455H55V458Z" transform="translate(500,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(1277.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="msup" transform="translate(2333.6,0)"><g data-mml-node="mn"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(533,363) scale(0.707)"><path data-c="34" d="M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(3492.3,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(4492.6,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>17</mn><mo>=</mo><msup><mn>2</mn><mn>4</mn></msup><mo>+</mo><mn>1</mn></math></mjx-assistive-mml></mjx-container>, <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.186ex;" xmlns="http://www.w3.org/2000/svg" width="11.295ex" height="2.072ex" role="img" focusable="false" viewBox="0 -833.9 4992.6 915.9" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mn"><path data-c="33" d="M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z" style="stroke-width: 3;"/><path data-c="33" d="M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z" transform="translate(500,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(1277.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="msup" transform="translate(2333.6,0)"><g data-mml-node="mn"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(533,363) scale(0.707)"><path data-c="35" d="M164 157Q164 133 148 117T109 101H102Q148 22 224 22Q294 22 326 82Q345 115 345 210Q345 313 318 349Q292 382 260 382H254Q176 382 136 314Q132 307 129 306T114 304Q97 304 95 310Q93 314 93 485V614Q93 664 98 664Q100 666 102 666Q103 666 123 658T178 642T253 634Q324 634 389 662Q397 666 402 666Q410 666 410 648V635Q328 538 205 538Q174 538 149 544L139 546V374Q158 388 169 396T205 412T256 420Q337 420 393 355T449 201Q449 109 385 44T229 -22Q148 -22 99 32T50 154Q50 178 61 192T84 210T107 214Q132 214 148 197T164 157Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(3492.3,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(4492.6,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>33</mn><mo>=</mo><msup><mn>2</mn><mn>5</mn></msup><mo>+</mo><mn>1</mn></math></mjx-assistive-mml></mjx-container>, <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.186ex;" xmlns="http://www.w3.org/2000/svg" width="11.295ex" height="2.072ex" role="img" focusable="false" viewBox="0 -833.9 4992.6 915.9" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mn"><path data-c="36" d="M42 313Q42 476 123 571T303 666Q372 666 402 630T432 550Q432 525 418 510T379 495Q356 495 341 509T326 548Q326 592 373 601Q351 623 311 626Q240 626 194 566Q147 500 147 364L148 360Q153 366 156 373Q197 433 263 433H267Q313 433 348 414Q372 400 396 374T435 317Q456 268 456 210V192Q456 169 451 149Q440 90 387 34T253 -22Q225 -22 199 -14T143 16T92 75T56 172T42 313ZM257 397Q227 397 205 380T171 335T154 278T148 216Q148 133 160 97T198 39Q222 21 251 21Q302 21 329 59Q342 77 347 104T352 209Q352 289 347 316T329 361Q302 397 257 397Z" style="stroke-width: 3;"/><path data-c="35" d="M164 157Q164 133 148 117T109 101H102Q148 22 224 22Q294 22 326 82Q345 115 345 210Q345 313 318 349Q292 382 260 382H254Q176 382 136 314Q132 307 129 306T114 304Q97 304 95 310Q93 314 93 485V614Q93 664 98 664Q100 666 102 666Q103 666 123 658T178 642T253 634Q324 634 389 662Q397 666 402 666Q410 666 410 648V635Q328 538 205 538Q174 538 149 544L139 546V374Q158 388 169 396T205 412T256 420Q337 420 393 355T449 201Q449 109 385 44T229 -22Q148 -22 99 32T50 154Q50 178 61 192T84 210T107 214Q132 214 148 197T164 157Z" transform="translate(500,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(1277.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="msup" transform="translate(2333.6,0)"><g data-mml-node="mn"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(533,363) scale(0.707)"><path data-c="36" d="M42 313Q42 476 123 571T303 666Q372 666 402 630T432 550Q432 525 418 510T379 495Q356 495 341 509T326 548Q326 592 373 601Q351 623 311 626Q240 626 194 566Q147 500 147 364L148 360Q153 366 156 373Q197 433 263 433H267Q313 433 348 414Q372 400 396 374T435 317Q456 268 456 210V192Q456 169 451 149Q440 90 387 34T253 -22Q225 -22 199 -14T143 16T92 75T56 172T42 313ZM257 397Q227 397 205 380T171 335T154 278T148 216Q148 133 160 97T198 39Q222 21 251 21Q302 21 329 59Q342 77 347 104T352 209Q352 289 347 316T329 361Q302 397 257 397Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(3492.3,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(4492.6,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>65</mn><mo>=</mo><msup><mn>2</mn><mn>6</mn></msup><mo>+</mo><mn>1</mn></math></mjx-assistive-mml></mjx-container>। <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.186ex;" xmlns="http://www.w3.org/2000/svg" width="2.891ex" height="1.692ex" role="img" focusable="false" viewBox="0 -666 1278 748" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(778,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo>+</mo><mn>1</mn></math></mjx-assistive-mml></mjx-container> हर boundary पर एक shared sample रखता है ताकि neighbors सही ढंग से मिलें, और हर step लगभग sample count को चार गुना कर देता है (<mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="2.345ex" height="1.912ex" role="img" focusable="false" viewBox="0 -833.9 1036.6 844.9" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msup"><g data-mml-node="mi"><path data-c="1D45B" d="M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(633,363) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><msup><mi>n</mi><mn>2</mn></msup></math></mjx-assistive-mml></mjx-container> तब बढ़ता है जब side दोगुनी होती है)। एक 17x17 grid (4m spacing पर 64m chunk के लिए न्यूनतम) compressed होने पर ~200 bytes का होता है और तुरंत एक दिखने वाली surface render करता है। फिर 33x33 refinement stream करें, फिर पूरी 65x65 resolution। हर level पिछले data को बदले बिना samples जोड़ता है। यह सीधे geometry clipmap LOD rings से मेल खाता है जहां दूर का terrain low-resolution data इस्तेमाल करता है और पास का terrain full resolution। <a href="/hi/guides/landscape-generation-browser.html#progressive-chunk-loading">progressive chunk loading</a> देखें।</p>
<p><strong>Delta encoding और compression.</strong> heightmap data अच्छे से compress होता है क्योंकि आसपास के cells की values मिलती-जुलती होती हैं। delta encoding हर cell और उसकी predicted value (neighbors का average) के बीच का अंतर store करता है, जिससे values zero के पास इकट्ठा हो जाती हैं। zlib या brotli के साथ मिलकर, एक 65x65 chunk 8.4 KB raw से 1-2 KB compressed तक गिर जाता है। दूर के chunks के लिए कम precision पर (16-bit के बजाय 8-bit): 0.5-1 KB। <a href="/hi/guides/landscape-generation-browser.html#terrain-data-compression-for-streaming">terrain data compression</a> देखें।</p>
<p><strong>Predictive pre-fetching.</strong> player के पहुंचने से पहले chunks load करना। lead distance को उतना cover करना होता है जितनी दूरी player एक chunk load होने के दौरान तय करता है, <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.65ex;" xmlns="http://www.w3.org/2000/svg" width="16.701ex" height="2.22ex" role="img" focusable="false" viewBox="0 -694 7381.6 981.2" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(553,-150) scale(0.707)"><path data-c="70" d="M36 -148H50Q89 -148 97 -134V-126Q97 -119 97 -107T97 -77T98 -38T98 6T98 55T98 106Q98 140 98 177T98 243T98 296T97 335T97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 61 434T98 436Q115 437 135 438T165 441T176 442H179V416L180 390L188 397Q247 441 326 441Q407 441 464 377T522 216Q522 115 457 52T310 -11Q242 -11 190 33L182 40V-45V-101Q182 -128 184 -134T195 -145Q216 -148 244 -148H260V-194H252L228 -193Q205 -192 178 -192T140 -191Q37 -191 28 -194H20V-148H36ZM424 218Q424 292 390 347T305 402Q234 402 182 337V98Q222 26 294 26Q345 26 384 80T424 218Z" style="stroke-width: 3;"/><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(556,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(948,0)" style="stroke-width: 3;"/><path data-c="66" d="M273 0Q255 3 146 3Q43 3 34 0H26V46H42Q70 46 91 49Q99 52 103 60Q104 62 104 224V385H33V431H104V497L105 564L107 574Q126 639 171 668T266 704Q267 704 275 704T289 705Q330 702 351 679T372 627Q372 604 358 590T321 576T284 590T270 627Q270 647 288 667H284Q280 668 273 668Q245 668 223 647T189 592Q183 572 182 497V431H293V385H185V225Q185 63 186 61T189 57T194 54T199 51T206 49T213 48T222 47T231 47T241 46T251 46H282V0H273Z" transform="translate(1392,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(1698,0)" style="stroke-width: 3;"/><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" transform="translate(2142,0)" style="stroke-width: 3;"/><path data-c="63" d="M370 305T349 305T313 320T297 358Q297 381 312 396Q317 401 317 402T307 404Q281 408 258 408Q209 408 178 376Q131 329 131 219Q131 137 162 90Q203 29 272 29Q313 29 338 55T374 117Q376 125 379 127T395 129H409Q415 123 415 120Q415 116 411 104T395 71T366 33T318 2T249 -11Q163 -11 99 53T34 214Q34 318 99 383T250 448T370 421T404 357Q404 334 387 320Z" transform="translate(2531,0)" style="stroke-width: 3;"/><path data-c="68" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 124T102 167T103 217T103 272T103 329Q103 366 103 407T103 482T102 542T102 586T102 603Q99 622 88 628T43 637H25V660Q25 683 27 683L37 684Q47 685 66 686T103 688Q120 689 140 690T170 693T181 694H184V367Q244 442 328 442Q451 442 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(2975,0)" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(3377.6,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(4433.3,0)"><path data-c="1D463" d="M173 380Q173 405 154 405Q130 405 104 376T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Q21 294 29 316T53 368T97 419T160 441Q202 441 225 417T249 361Q249 344 246 335Q246 329 231 291T200 202T182 113Q182 86 187 69Q200 26 250 26Q287 26 319 60T369 139T398 222T409 277Q409 300 401 317T383 343T365 361T357 383Q357 405 376 424T417 443Q436 443 451 425T467 367Q467 340 455 284T418 159T347 40T241 -11Q177 -11 139 22Q102 54 102 117Q102 148 110 181T151 298Q173 362 173 380Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(5140.6,0)"><path data-c="22C5" d="M78 250Q78 274 95 292T138 310Q162 310 180 294T199 251Q199 226 182 208T139 190T96 207T78 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(5640.8,0)"><g data-mml-node="mi"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(394,-150) scale(0.707)"><path data-c="6C" d="M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z" style="stroke-width: 3;"/><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z" transform="translate(278,0)" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(778,0)" style="stroke-width: 3;"/><path data-c="64" d="M376 495Q376 511 376 535T377 568Q377 613 367 624T316 637H298V660Q298 683 300 683L310 684Q320 685 339 686T376 688Q393 689 413 690T443 693T454 694H457V390Q457 84 458 81Q461 61 472 55T517 46H535V0Q533 0 459 -5T380 -11H373V44L365 37Q307 -11 235 -11Q158 -11 96 50T34 215Q34 315 97 378T244 442Q319 442 376 393V495ZM373 342Q328 405 260 405Q211 405 173 369Q146 341 139 305T131 211Q131 155 138 120T173 59Q203 26 251 26Q322 26 373 103V342Z" transform="translate(1278,0)" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>d</mi><mtext>prefetch</mtext></msub><mo>=</mo><mi>v</mi><mo>⋅</mo><msub><mi>t</mi><mtext>load</mtext></msub></math></mjx-assistive-mml></mjx-container>, इसलिए यह speed के साथ scale करता है: walking speed (5 km/h) पर 2 chunks आगे pre-fetch करें (128m), running speed (15 km/h) पर 4। load ring velocity direction के साथ शिफ्ट होती है। एक priority queue pending requests को urgency के हिसाब से sort करता है और उन chunks के requests cancel कर देता है जिनसे player दूर चला गया है। <a href="/hi/guides/landscape-generation-browser.html#predictive-pre-fetching">predictive pre-fetching</a> देखें।</p>
<hr>
<p>भाग 4, कुल 12 में से।<br>
पिछला: <a href="/hi/blog/2026-02-25-open-world-browser-part-03-the-unflashy-spikes.html">भाग 3 - वे साधारण spikes जिन्होंने हमें बचाया</a><br>
अगला: <a href="/hi/blog/2026-02-25-open-world-browser-part-05-budgeting-the-pretty.html">भाग 5 - खूबसूरत चीज़ों का budget तय करना</a><br>
Series guide: <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">/hi/blog/2026-02-25-open-world-browser-series-guide</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ब्राउज़र में open world बनाना, भाग 5: खूबसूरत चीज़ों का बजट तय करना]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-02-25-open-world-browser-part-05-budgeting-the-pretty</link>
            <guid>https://app.cinevva.com/hi/blog/2026-02-25-open-world-browser-part-05-budgeting-the-pretty</guid>
            <pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Vegetation, terrain materials, और cascaded shadows देखने में शानदार लग रहे थे। असली काम यह साबित करना था कि वे frame budget में फिट हो सकते हैं।]]></description>
            <content:encoded><![CDATA[<h1 id="ब्राउज़र-में-open-world-बनाना-भाग-5-खूबसूरत-चीज़ों-का-बजट-तय-करना" tabindex="-1">ब्राउज़र में open world बनाना, भाग 5: खूबसूरत चीज़ों का बजट तय करना <a class="header-anchor" href="#ब्राउज़र-में-open-world-बनाना-भाग-5-खूबसूरत-चीज़ों-का-बजट-तय-करना" aria-label="Permalink to &quot;ब्राउज़र में open world बनाना, भाग 5: खूबसूरत चीज़ों का बजट तय करना&quot;"></a></h1>
<p><em>लेखक <a href="/hi/about.html">Oleg Sidorkin</a>, Cinevva के CTO और सह-संस्थापक</em></p>
<p>यहां नए हैं? <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">सीरीज़ गाइड</a> का इस्तेमाल करें। इसमें बताया गया है कि spike क्या होता है और सभी भागों के लिंक दिए गए हैं।</p>
<p>यह वह अध्याय था जहां visual महत्वाकांक्षा का सामना गणित से हुआ।</p>
<p>हमने rendering की लागत को अलग-अलग spikes में बांटा क्योंकि एक साथ मिले हुए नतीजों की जांच करना मुश्किल होता है। अगर आप सब कुछ एक ही बार में चालू कर देते हैं, तो आपको सिर्फ इतना पता चलता है कि frame धीमा है। यह पता नहीं चलता कि किस feature ने बजट खा लिया।</p>
<p>Spike 7 का निशाना vegetation density और animation की लागत थी। तरीका यह था कि हर terrain chunk के लिए 32x32 density maps से runtime scattering की जाए, जो बड़े <code>InstancedMesh</code> sets को feed करे। हर घास की पत्ती और झाड़ी के cluster को एक scrolling noise texture से चलने वाला vertex-shader wind मिला। हम जिस मुख्य आंकड़े पर नज़र रखते थे वह triangle count नहीं बल्कि mid-range GPUs पर draw call overhead और vertex throughput था। हमें पता चला कि instances को कम meshes में batch करना, हर पत्ती के polygon count को घटाने से ज़्यादा मायने रखता है।</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/07-gpu-vegetation/" title="Spike 7 GPU Vegetation" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/07-gpu-vegetation/" target="_blank">Spike 7 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=07-gpu-vegetation">सोर्स देखें</a></p>
<p>Spike 8 ने terrain material की जटिलता को आगे बढ़ाया। slope angle और altitude के हिसाब से weighted multi-layer blending, cliff faces के लिए optional triplanar projection, और per-layer normal maps। shader चार texture layers के साथ slope-based splatting कर रहा था, और हर layer को एक diffuse और एक normal sample की ज़रूरत थी। यानी lighting जोड़ने से पहले ही हर fragment पर <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.186ex;" xmlns="http://www.w3.org/2000/svg" width="9.176ex" height="1.717ex" role="img" focusable="false" viewBox="0 -677 4056 759" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mn"><path data-c="34" d="M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(722.2,0)"><path data-c="D7" d="M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(1722.4,0)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(2500.2,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(3556,0)"><path data-c="38" d="M70 417T70 494T124 618T248 666Q319 666 374 624T429 515Q429 485 418 459T392 417T361 389T335 371T324 363L338 354Q352 344 366 334T382 323Q457 264 457 174Q457 95 399 37T249 -22Q159 -22 101 29T43 155Q43 263 172 335L154 348Q133 361 127 368Q70 417 70 494ZM286 386L292 390Q298 394 301 396T311 403T323 413T334 425T345 438T355 454T364 471T369 491T371 513Q371 556 342 586T275 624Q268 625 242 625Q201 625 165 599T128 534Q128 511 141 492T167 463T217 431Q224 426 228 424L286 386ZM250 21Q308 21 350 55T392 137Q392 154 387 169T375 194T353 216T330 234T301 253T274 270Q260 279 244 289T218 306L210 311Q204 311 181 294T133 239T107 157Q107 98 150 60T250 21Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>4</mn><mo>×</mo><mn>2</mn><mo>=</mo><mn>8</mn></math></mjx-assistive-mml></mjx-container> texture fetches, और यह count layers के साथ रैखिक रूप से बढ़ता है, इसलिए पांचवीं layer का मतलब है हर pixel पर 10 fetches। हमने floor ढूंढने के लिए खासतौर पर integrated Intel GPUs पर profile किया। निष्कर्ष यह निकला कि vertical surfaces पर triplanar projection लागत के लायक था, लेकिन पांचवीं splat layer जोड़ना नहीं।</p>
<p><a href="/spikes/08-terrain-material/" target="_blank">Spike 8 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=08-terrain-material">सोर्स देखें</a></p>
<p>Spike 9 का फोकस वास्तविक terrain और object load के तहत cascaded shadow map की लागत पर था। तीन cascades वाला CSM baseline था। हमने खासतौर पर low-angle sun positions के साथ टेस्ट किया क्योंकि cascade pressure सबसे बुरी वहीं होती है। दूर वाला cascade frustum के एक बहुत बड़े हिस्से को कवर करता है, और shadow detail texel density से तय होती है, <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.783ex;" xmlns="http://www.w3.org/2000/svg" width="7.095ex" height="3.009ex" role="img" focusable="false" viewBox="0 -983.7 3135.9 1330" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D70C" d="M58 -216Q25 -216 23 -186Q23 -176 73 26T127 234Q143 289 182 341Q252 427 341 441Q343 441 349 441T359 442Q432 442 471 394T510 276Q510 219 486 165T425 74T345 13T266 -10H255H248Q197 -10 165 35L160 41L133 -71Q108 -168 104 -181T92 -202Q76 -216 58 -216ZM424 322Q424 359 407 382T357 405Q322 405 287 376T231 300Q217 269 193 170L176 102Q193 26 260 26Q298 26 334 62Q367 92 389 158T418 266T424 322Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(794.8,0)"><path data-c="2248" d="M55 319Q55 360 72 393T114 444T163 472T205 482Q207 482 213 482T223 483Q262 483 296 468T393 413L443 381Q502 346 553 346Q609 346 649 375T694 454Q694 465 698 474T708 483Q722 483 722 452Q722 386 675 338T555 289Q514 289 468 310T388 357T308 404T224 426Q164 426 125 393T83 318Q81 289 69 289Q55 289 55 319ZM55 85Q55 126 72 159T114 210T163 238T205 248Q207 248 213 248T223 249Q262 249 296 234T393 179L443 147Q502 112 553 112Q609 112 649 141T694 220Q694 249 708 249T722 217Q722 153 675 104T555 55Q514 55 468 76T388 123T308 170T224 192Q164 192 125 159T83 84Q80 55 69 55Q55 55 55 85Z" style="stroke-width: 3;"/></g><g data-mml-node="mfrac" transform="translate(1850.6,0)"><g data-mml-node="msup" transform="translate(220,394) scale(0.707)"><g data-mml-node="mi"><path data-c="1D445" d="M230 637Q203 637 198 638T193 649Q193 676 204 682Q206 683 378 683Q550 682 564 680Q620 672 658 652T712 606T733 563T739 529Q739 484 710 445T643 385T576 351T538 338L545 333Q612 295 612 223Q612 212 607 162T602 80V71Q602 53 603 43T614 25T640 16Q668 16 686 38T712 85Q717 99 720 102T735 105Q755 105 755 93Q755 75 731 36Q693 -21 641 -21H632Q571 -21 531 4T487 82Q487 109 502 166T517 239Q517 290 474 313Q459 320 449 321T378 323H309L277 193Q244 61 244 59Q244 55 245 54T252 50T269 48T302 46H333Q339 38 339 37T336 19Q332 6 326 0H311Q275 2 180 2Q146 2 117 2T71 2T50 1Q33 1 33 10Q33 12 36 24Q41 43 46 45Q50 46 61 46H67Q94 46 127 49Q141 52 146 61Q149 65 218 339T287 628Q287 635 230 637ZM630 554Q630 586 609 608T523 636Q521 636 500 636T462 637H440Q393 637 386 627Q385 624 352 494T319 361Q319 360 388 360Q466 361 492 367Q556 377 592 426Q608 449 619 486T630 554Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(792,363) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mi" transform="translate(377.5,-346.3) scale(0.707)"><path data-c="1D434" d="M208 74Q208 50 254 46Q272 46 272 35Q272 34 270 22Q267 8 264 4T251 0Q249 0 239 0T205 1T141 2Q70 2 50 0H42Q35 7 35 11Q37 38 48 46H62Q132 49 164 96Q170 102 345 401T523 704Q530 716 547 716H555H572Q578 707 578 706L606 383Q634 60 636 57Q641 46 701 46Q726 46 726 36Q726 34 723 22Q720 7 718 4T704 0Q701 0 690 0T651 1T578 2Q484 2 455 0H443Q437 6 437 9T439 27Q443 40 445 43L449 46H469Q523 49 533 63L521 213H283L249 155Q208 86 208 74ZM516 260Q516 271 504 416T490 562L463 519Q447 492 400 412L310 260L413 259Q516 259 516 260Z" style="stroke-width: 3;"/></g><rect width="1045.4" height="60" x="120" y="220"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>ρ</mi><mo>≈</mo><mfrac><msup><mi>R</mi><mn>2</mn></msup><mi>A</mi></mfrac></math></mjx-assistive-mml></mjx-container> (एक shadow map जिसका resolution <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.048ex;" xmlns="http://www.w3.org/2000/svg" width="1.717ex" height="1.593ex" role="img" focusable="false" viewBox="0 -683 759 704" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D445" d="M230 637Q203 637 198 638T193 649Q193 676 204 682Q206 683 378 683Q550 682 564 680Q620 672 658 652T712 606T733 563T739 529Q739 484 710 445T643 385T576 351T538 338L545 333Q612 295 612 223Q612 212 607 162T602 80V71Q602 53 603 43T614 25T640 16Q668 16 686 38T712 85Q717 99 720 102T735 105Q755 105 755 93Q755 75 731 36Q693 -21 641 -21H632Q571 -21 531 4T487 82Q487 109 502 166T517 239Q517 290 474 313Q459 320 449 321T378 323H309L277 193Q244 61 244 59Q244 55 245 54T252 50T269 48T302 46H333Q339 38 339 37T336 19Q332 6 326 0H311Q275 2 180 2Q146 2 117 2T71 2T50 1Q33 1 33 10Q33 12 36 24Q41 43 46 45Q50 46 61 46H67Q94 46 127 49Q141 52 146 61Q149 65 218 339T287 628Q287 635 230 637ZM630 554Q630 586 609 608T523 636Q521 636 500 636T462 637H440Q393 637 386 627Q385 624 352 494T319 361Q319 360 388 360Q466 361 492 367Q556 377 592 426Q608 449 619 486T630 554Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>R</mi></math></mjx-assistive-mml></mjx-container> है, ground area <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="1.697ex" height="1.62ex" role="img" focusable="false" viewBox="0 -716 750 716" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D434" d="M208 74Q208 50 254 46Q272 46 272 35Q272 34 270 22Q267 8 264 4T251 0Q249 0 239 0T205 1T141 2Q70 2 50 0H42Q35 7 35 11Q37 38 48 46H62Q132 49 164 96Q170 102 345 401T523 704Q530 716 547 716H555H572Q578 707 578 706L606 383Q634 60 636 57Q641 46 701 46Q726 46 726 36Q726 34 723 22Q720 7 718 4T704 0Q701 0 690 0T651 1T578 2Q484 2 455 0H443Q437 6 437 9T439 27Q443 40 445 43L449 46H469Q523 49 533 63L521 213H283L249 155Q208 86 208 74ZM516 260Q516 271 504 416T490 562L463 519Q447 492 400 412L310 260L413 259Q516 259 516 260Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>A</mi></math></mjx-assistive-mml></mjx-container> पर खींचा हुआ)। पूरी view distance पर एक ही map लगाने से <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="1.697ex" height="1.62ex" role="img" focusable="false" viewBox="0 -716 750 716" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D434" d="M208 74Q208 50 254 46Q272 46 272 35Q272 34 270 22Q267 8 264 4T251 0Q249 0 239 0T205 1T141 2Q70 2 50 0H42Q35 7 35 11Q37 38 48 46H62Q132 49 164 96Q170 102 345 401T523 704Q530 716 547 716H555H572Q578 707 578 706L606 383Q634 60 636 57Q641 46 701 46Q726 46 726 36Q726 34 723 22Q720 7 718 4T704 0Q701 0 690 0T651 1T578 2Q484 2 455 0H443Q437 6 437 9T439 27Q443 40 445 43L449 46H469Q523 49 533 63L521 213H283L249 155Q208 86 208 74ZM516 260Q516 271 504 416T490 562L463 519Q447 492 400 412L310 260L413 259Q516 259 516 260Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>A</mi></math></mjx-assistive-mml></mjx-container> बहुत बड़ा हो जाता है और <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.489ex;" xmlns="http://www.w3.org/2000/svg" width="1.17ex" height="1.489ex" role="img" focusable="false" viewBox="0 -442 517 658" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D70C" d="M58 -216Q25 -216 23 -186Q23 -176 73 26T127 234Q143 289 182 341Q252 427 341 441Q343 441 349 441T359 442Q432 442 471 394T510 276Q510 219 486 165T425 74T345 13T266 -10H255H248Q197 -10 165 35L160 41L133 -71Q108 -168 104 -181T92 -202Q76 -216 58 -216ZM424 322Q424 359 407 382T357 405Q322 405 287 376T231 300Q217 269 193 170L176 102Q193 26 260 26Q298 26 334 62Q367 92 389 158T418 266T424 322Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>ρ</mi></math></mjx-assistive-mml></mjx-container> गिर जाता है। Cascades इसे ठीक करते हैं क्योंकि वे frustum को इस तरह बांटते हैं कि हर slice को एक छोटे <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="1.697ex" height="1.62ex" role="img" focusable="false" viewBox="0 -716 750 716" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D434" d="M208 74Q208 50 254 46Q272 46 272 35Q272 34 270 22Q267 8 264 4T251 0Q249 0 239 0T205 1T141 2Q70 2 50 0H42Q35 7 35 11Q37 38 48 46H62Q132 49 164 96Q170 102 345 401T523 704Q530 716 547 716H555H572Q578 707 578 706L606 383Q634 60 636 57Q641 46 701 46Q726 46 726 36Q726 34 723 22Q720 7 718 4T704 0Q701 0 690 0T651 1T578 2Q484 2 455 0H443Q437 6 437 9T439 27Q443 40 445 43L449 46H469Q523 49 533 63L521 213H283L249 155Q208 86 208 74ZM516 260Q516 271 504 416T490 562L463 519Q447 492 400 412L310 260L413 259Q516 259 516 260Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>A</mi></math></mjx-assistive-mml></mjx-container> पर अपना <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.048ex;" xmlns="http://www.w3.org/2000/svg" width="6.2ex" height="1.593ex" role="img" focusable="false" viewBox="0 -683 2740.4 704" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D445" d="M230 637Q203 637 198 638T193 649Q193 676 204 682Q206 683 378 683Q550 682 564 680Q620 672 658 652T712 606T733 563T739 529Q739 484 710 445T643 385T576 351T538 338L545 333Q612 295 612 223Q612 212 607 162T602 80V71Q602 53 603 43T614 25T640 16Q668 16 686 38T712 85Q717 99 720 102T735 105Q755 105 755 93Q755 75 731 36Q693 -21 641 -21H632Q571 -21 531 4T487 82Q487 109 502 166T517 239Q517 290 474 313Q459 320 449 321T378 323H309L277 193Q244 61 244 59Q244 55 245 54T252 50T269 48T302 46H333Q339 38 339 37T336 19Q332 6 326 0H311Q275 2 180 2Q146 2 117 2T71 2T50 1Q33 1 33 10Q33 12 36 24Q41 43 46 45Q50 46 61 46H67Q94 46 127 49Q141 52 146 61Q149 65 218 339T287 628Q287 635 230 637ZM630 554Q630 586 609 608T523 636Q521 636 500 636T462 637H440Q393 637 386 627Q385 624 352 494T319 361Q319 360 388 360Q466 361 492 367Q556 377 592 426Q608 449 619 486T630 554Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(981.2,0)"><path data-c="D7" d="M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(1981.4,0)"><path data-c="1D445" d="M230 637Q203 637 198 638T193 649Q193 676 204 682Q206 683 378 683Q550 682 564 680Q620 672 658 652T712 606T733 563T739 529Q739 484 710 445T643 385T576 351T538 338L545 333Q612 295 612 223Q612 212 607 162T602 80V71Q602 53 603 43T614 25T640 16Q668 16 686 38T712 85Q717 99 720 102T735 105Q755 105 755 93Q755 75 731 36Q693 -21 641 -21H632Q571 -21 531 4T487 82Q487 109 502 166T517 239Q517 290 474 313Q459 320 449 321T378 323H309L277 193Q244 61 244 59Q244 55 245 54T252 50T269 48T302 46H333Q339 38 339 37T336 19Q332 6 326 0H311Q275 2 180 2Q146 2 117 2T71 2T50 1Q33 1 33 10Q33 12 36 24Q41 43 46 45Q50 46 61 46H67Q94 46 127 49Q141 52 146 61Q149 65 218 339T287 628Q287 635 230 637ZM630 554Q630 586 609 608T523 636Q521 636 500 636T462 637H440Q393 637 386 627Q385 624 352 494T319 361Q319 360 388 360Q466 361 492 367Q556 377 592 426Q608 449 619 486T630 554Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>R</mi><mo>×</mo><mi>R</mi></math></mjx-assistive-mml></mjx-container> map मिले, जिससे <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.489ex;" xmlns="http://www.w3.org/2000/svg" width="1.17ex" height="1.489ex" role="img" focusable="false" viewBox="0 -442 517 658" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D70C" d="M58 -216Q25 -216 23 -186Q23 -176 73 26T127 234Q143 289 182 341Q252 427 341 441Q343 441 349 441T359 442Q432 442 471 394T510 276Q510 219 486 165T425 74T345 13T266 -10H255H248Q197 -10 165 35L160 41L133 -71Q108 -168 104 -181T92 -202Q76 -216 58 -216ZM424 322Q424 359 407 382T357 405Q322 405 287 376T231 300Q217 269 193 170L176 102Q193 26 260 26Q298 26 334 62Q367 92 389 158T418 266T424 322Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>ρ</mi></math></mjx-assistive-mml></mjx-container> पास से दूर तक लगभग एक जैसा बना रहता है। हमने दो और चार cascades के बीच GPU time का अंतर मापा, फिर 1024 और 2048 shadow map resolution के बीच। नतीजा यह रहा कि 1024 पर तीन cascades ने हमें target hardware पर 2ms GPU time से ज़्यादा खर्च किए बिना camera के पास स्वीकार्य contact shadows दिए।</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/09-csm-shadows/" title="Spike 9 CSM Shadows" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/09-csm-shadows/" target="_blank">Spike 9 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=09-csm-shadows">सोर्स देखें</a></p>
<p>इस चरण में सबसे मुश्किल हिस्सा product discipline था। कुछ effects बेहद शानदार दिखते थे फिर भी उन्हें सीमित करना पड़ा क्योंकि वे अपने visual असर के मुकाबले frame budget का बहुत बड़ा हिस्सा खा रहे थे।</p>
<p>हमारा नियम सीधा बन गया। कोई feature तभी आगे बढ़ता है जब वह मापे गए frame-time data के साथ अपनी लागत को सही ठहरा सके।</p>
<p>यह सुनने में स्पष्ट लगता है। लेकिन तेज़ prototype cycles में यह आम नहीं है, जहां हर कोई अगली visual जीत को लेकर उत्साहित रहता है। इस नियम को शुरू से बनाए रखने से बाद में clipmaps और volumetric zones को लेकर लिए गए architecture फैसले काफी साफ-सुथरे रहे, क्योंकि हमें पहले से पता था कि उसी 16ms के लिए होड़ करने वाली हर चीज़ की per-feature लागत क्या है।</p>
<p>भाग 6 में हम geometry clipmaps के साथ पहले बड़े terrain architecture pivot तक पहुंचे।</p>
<h2 id="इस-अध्याय-में-संदर्भित-तकनीक" tabindex="-1">इस अध्याय में संदर्भित तकनीक <a class="header-anchor" href="#इस-अध्याय-में-संदर्भित-तकनीक" aria-label="Permalink to &quot;इस अध्याय में संदर्भित तकनीक&quot;"></a></h2>
<p><strong>InstancedMesh और GPU vegetation.</strong> Three.js का <code>InstancedMesh</code> एक ही geometry की N copies को एक draw call में render करता है। vegetation के लिए, एक density map (हर chunk में 32x32) घास की पत्तियों और झाड़ी के clusters का runtime scattering instance buffers में चलाता है। Wind animation vertex shader में एक scrolling noise texture का इस्तेमाल करके चलता है। scale पर, WebGPU का <code>ComputeInstanceCulling</code> rasterization से पहले off-screen और दूर के instances को हटा देता है, और <code>IndirectBatchedMesh</code> कई vegetation types को एक ही buffer में पैक करता है जो multi-draw indirect से draw होता है। हमारी <a href="/hi/guides/landscape-generation-browser.html#gpu-driven-vegetation-culling">GPU vegetation culling पर landscape गाइड</a> देखें।</p>
<p><strong>Triplanar mapping.</strong> सामान्य UV-mapped textures steep slopes पर खिंच जाते हैं क्योंकि UV coordinates सिकुड़ जाते हैं। Triplanar mapping textures को तीनों axes (X, Y, Z) के साथ project करती है और surface normal के आधार पर blend करती है। Cliff faces को X या Z projection मिलता है (कोई खिंचाव नहीं), flat ground को Y projection। blending बिना किसी UV unwrapping के अपने आप और smooth होती है। PBR terrain के लिए, वही blending weights albedo, normal, roughness, और ambient occlusion channels पर लागू होते हैं। <a href="/hi/guides/landscape-generation-browser.html#triplanar-mapping">triplanar mapping की जानकारी</a> देखें।</p>
<p><strong>Slope और altitude आधारित material splatting.</strong> हाथ से बनाए गए splat maps के बजाय, materials को terrain properties के आधार पर fragment shader में procedurally assign किया जाता है। कम altitude पर flat ground को घास मिलती है, steep slopes को चट्टान, high altitude को बर्फ (सिर्फ उन्हीं surfaces पर जो जमाव के लिए काफी flat हों), sea level के पास रेत। transitions smooth blending के लिए <code>smoothstep</code> का इस्तेमाल करते हैं। हमारे implementation में, हर terrain chunk चार texture layers को हर layer पर diffuse और normal samples के साथ evaluate करता है, जिससे lighting से पहले हर fragment पर आठ texture fetches होते हैं। <a href="/hi/guides/landscape-generation-browser.html#slope-and-altitude-based-material-assignment">slope और altitude material assignment</a> देखें।</p>
<p><strong>Cascaded Shadow Maps (CSM).</strong> CSM camera के view frustum को 3-4 distance ranges (cascades) में बांटता है। हर cascade sun के नज़रिए से एक shadow map render करता है, जिसका resolution उसकी distance के हिसाब से होता है। पास वाले cascades को high-resolution shadows मिलती हैं (पेड़ों और इमारतों के नीचे विस्तृत contact shadows), दूर वाले cascades को कम resolution (चौड़ी पहाड़ी shadows)। terrain shader सभी cascades को sample करता है और हर fragment के लिए उपयुक्त एक चुनता है। Performance लागत: 1024x1024 पर 3-4 cascades shadow map rendering के लिए ~0.5-1 ms और sampling के लिए ~0.2-0.3 ms जोड़ते हैं। <a href="/hi/guides/landscape-generation-browser.html#shadows-for-terrain">terrain के लिए shadows</a> देखें।</p>
<hr>
<p>भाग 5, कुल 12 में से।<br>
पिछला: <a href="/hi/blog/2026-02-25-open-world-browser-part-04-streaming-before-fancy.html">भाग 4 - फैंसी terrain से पहले streaming</a><br>
अगला: <a href="/hi/blog/2026-02-25-open-world-browser-part-06-clipmaps.html">भाग 6 - Clipmaps ने कहानी बदल दी</a><br>
सीरीज़ गाइड: <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">/hi/blog/2026-02-25-open-world-browser-series-guide</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ब्राउज़र में open world बनाना, भाग 6: Clipmaps ने कहानी बदल दी]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-02-25-open-world-browser-part-06-clipmaps</link>
            <guid>https://app.cinevva.com/hi/blog/2026-02-25-open-world-browser-part-06-clipmaps</guid>
            <pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Geometry clipmaps ने हमें एक तरीका दिया जिससे terrain की cost का अंदाज़ा लगाते रहना मुमकिन हुआ, भले ही हम कहीं बड़ी दुनिया में घूम रहे हों।]]></description>
            <content:encoded><![CDATA[<h1 id="ब्राउज़र-में-open-world-बनाना-भाग-6-clipmaps-ने-कहानी-बदल-दी" tabindex="-1">ब्राउज़र में open world बनाना, भाग 6: Clipmaps ने कहानी बदल दी <a class="header-anchor" href="#ब्राउज़र-में-open-world-बनाना-भाग-6-clipmaps-ने-कहानी-बदल-दी" aria-label="Permalink to &quot;ब्राउज़र में open world बनाना, भाग 6: Clipmaps ने कहानी बदल दी&quot;"></a></h1>
<p><em>लिखा है <a href="/hi/about.html">Oleg Sidorkin</a> ने, Cinevva के CTO और को-फाउंडर</em></p>
<p>यहाँ नए हैं? <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">सीरीज़ गाइड</a> देखिए। यह बताती है कि spike क्या होता है और सारे भागों के लिंक देती है।</p>
<p>Spike 10 से पहले हमारे दिमाग़ में मॉडल अब भी यही था कि &quot;बड़ी दुनिया का मतलब ज़्यादा geometry।&quot; Spike 10 के बाद मॉडल बन गया &quot;constant geometry budget, camera पर केंद्रित ring updates।&quot; इस बदलाव ने प्रोजेक्ट की दिशा बदल दी।</p>
<p>Geometry clipmaps के पीछे का विचार सीधा है। आप terrain को camera पर केंद्रित concentric rings के एक सेट के रूप में render करते हैं। सबसे अंदरूनी ring में सबसे ज़्यादा vertex density होती है। बाहर की तरफ़ हर ring <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="1.179ex" height="1.595ex" role="img" focusable="false" viewBox="0 -694 521 705" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D458" d="M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>k</mi></math></mjx-assistive-mml></mjx-container> vertex spacing को दोगुना कर देती है, <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.375ex;" xmlns="http://www.w3.org/2000/svg" width="10.935ex" height="2.306ex" role="img" focusable="false" viewBox="0 -853.7 4833.4 1019.3" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D460" d="M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(502,-150) scale(0.707)"><path data-c="1D458" d="M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(1198.2,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(2254,0)"><g data-mml-node="mi"><path data-c="1D460" d="M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(502,-150) scale(0.707)"><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(3381.7,0)"><path data-c="22C5" d="M78 250Q78 274 95 292T138 310Q162 310 180 294T199 251Q199 226 182 208T139 190T96 207T78 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msup" transform="translate(3882,0)"><g data-mml-node="mn"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(533,363) scale(0.707)"><path data-c="1D458" d="M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>s</mi><mi>k</mi></msub><mo>=</mo><msub><mi>s</mi><mn>0</mn></msub><mo>⋅</mo><msup><mn>2</mn><mi>k</mi></msup></math></mjx-assistive-mml></mjx-container>, इसलिए वह अपने अंदरूनी ring से <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="2.891ex" height="1.532ex" role="img" focusable="false" viewBox="0 -677 1278 677" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mn"><path data-c="34" d="M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(500,0)"><path data-c="D7" d="M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>4</mn><mo>×</mo></math></mjx-assistive-mml></mjx-container> ज़मीन के इलाक़े को कवर करती है।</p>
<p>यही दोगुना करना पूरा खेल है। View distance rings की संख्या के साथ geometrically बढ़ती है, <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.375ex;" xmlns="http://www.w3.org/2000/svg" width="13.628ex" height="2.288ex" role="img" focusable="false" viewBox="0 -846 6023.5 1011.5" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(553,-150) scale(0.707)"><path data-c="76" d="M338 431Q344 429 422 429Q479 429 503 431H508V385H497Q439 381 423 345Q421 341 356 172T288 -2Q283 -11 263 -11Q244 -11 239 -2Q99 359 98 364Q93 378 82 381T43 385H19V431H25L33 430Q41 430 53 430T79 430T104 429T122 428Q217 428 232 431H240V385H226Q187 384 184 370Q184 366 235 234L286 102L377 341V349Q377 363 367 372T349 383T335 385H331V431H338Z" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(528,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(806,0)" style="stroke-width: 3;"/><path data-c="77" d="M90 368Q84 378 76 380T40 385H18V431H24L43 430Q62 430 84 429T116 428Q206 428 221 431H229V385H215Q177 383 177 368Q177 367 221 239L265 113L339 328L333 345Q323 374 316 379Q308 384 278 385H258V431H264Q270 428 348 428Q439 428 454 431H461V385H452Q404 385 404 369Q404 366 418 324T449 234T481 143L496 100L537 219Q579 341 579 347Q579 363 564 373T530 385H522V431H529Q541 428 624 428Q692 428 698 431H703V385H697Q696 385 691 385T682 384Q635 377 619 334L559 161Q546 124 528 71Q508 12 503 1T487 -11H479Q460 -11 456 -4Q455 -3 407 133L361 267Q359 263 266 -4Q261 -11 243 -11H238Q225 -11 220 -3L90 368Z" transform="translate(1250,0)" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(2275.2,0)"><path data-c="2248" d="M55 319Q55 360 72 393T114 444T163 472T205 482Q207 482 213 482T223 483Q262 483 296 468T393 413L443 381Q502 346 553 346Q609 346 649 375T694 454Q694 465 698 474T708 483Q722 483 722 452Q722 386 675 338T555 289Q514 289 468 310T388 357T308 404T224 426Q164 426 125 393T83 318Q81 289 69 289Q55 289 55 319ZM55 85Q55 126 72 159T114 210T163 238T205 248Q207 248 213 248T223 249Q262 249 296 234T393 179L443 147Q502 112 553 112Q609 112 649 141T694 220Q694 249 708 249T722 217Q722 153 675 104T555 55Q514 55 468 76T388 123T308 170T224 192Q164 192 125 159T83 84Q80 55 69 55Q55 55 55 85Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(3331,0)"><g data-mml-node="mi"><path data-c="1D460" d="M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(502,-150) scale(0.707)"><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(4458.7,0)"><path data-c="22C5" d="M78 250Q78 274 95 292T138 310Q162 310 180 294T199 251Q199 226 182 208T139 190T96 207T78 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msup" transform="translate(4959,0)"><g data-mml-node="mn"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" transform="translate(533,363) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D43F" d="M228 637Q194 637 192 641Q191 643 191 649Q191 673 202 682Q204 683 217 683Q271 680 344 680Q485 680 506 683H518Q524 677 524 674T522 656Q517 641 513 637H475Q406 636 394 628Q387 624 380 600T313 336Q297 271 279 198T252 88L243 52Q243 48 252 48T311 46H328Q360 46 379 47T428 54T478 72T522 106T564 161Q580 191 594 228T611 270Q616 273 628 273H641Q647 264 647 262T627 203T583 83T557 9Q555 4 553 3T537 0T494 -1Q483 -1 418 -1T294 0H116Q32 0 32 10Q32 17 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628Q285 635 228 637Z" style="stroke-width: 3;"/></g></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>d</mi><mtext>view</mtext></msub><mo>≈</mo><msub><mi>s</mi><mn>0</mn></msub><mo>⋅</mo><msup><mn>2</mn><mrow data-mjx-texclass="ORD"><mi>L</mi></mrow></msup></math></mjx-assistive-mml></mjx-container>, जबकि vertex की cost सिर्फ़ linearly बढ़ती है:</p>
<mjx-container tabindex="0" class="MathJax" jax="SVG" display="true" style="direction: ltr; display: block; text-align: center; margin: 1em 0; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.357ex;" xmlns="http://www.w3.org/2000/svg" width="14.108ex" height="2.357ex" role="img" focusable="false" viewBox="0 -883.9 6235.6 1041.7" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D449" d="M52 648Q52 670 65 683H76Q118 680 181 680Q299 680 320 683H330Q336 677 336 674T334 656Q329 641 325 637H304Q282 635 274 635Q245 630 242 620Q242 618 271 369T301 118L374 235Q447 352 520 471T595 594Q599 601 599 609Q599 633 555 637Q537 637 537 648Q537 649 539 661Q542 675 545 679T558 683Q560 683 570 683T604 682T668 681Q737 681 755 683H762Q769 676 769 672Q769 655 760 640Q757 637 743 637Q730 636 719 635T698 630T682 623T670 615T660 608T652 599T645 592L452 282Q272 -9 266 -16Q263 -18 259 -21L241 -22H234Q216 -22 216 -15Q213 -9 177 305Q139 623 138 626Q133 637 76 637H59Q52 642 52 648Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(616,-150) scale(0.707)"><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" style="stroke-width: 3;"/><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z" transform="translate(389,0)" style="stroke-width: 3;"/><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" transform="translate(889,0)" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(1278,0)" style="stroke-width: 3;"/><path data-c="6C" d="M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z" transform="translate(1778,0)" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(2397.6,0)"><path data-c="2248" d="M55 319Q55 360 72 393T114 444T163 472T205 482Q207 482 213 482T223 483Q262 483 296 468T393 413L443 381Q502 346 553 346Q609 346 649 375T694 454Q694 465 698 474T708 483Q722 483 722 452Q722 386 675 338T555 289Q514 289 468 310T388 357T308 404T224 426Q164 426 125 393T83 318Q81 289 69 289Q55 289 55 319ZM55 85Q55 126 72 159T114 210T163 238T205 248Q207 248 213 248T223 249Q262 249 296 234T393 179L443 147Q502 112 553 112Q609 112 649 141T694 220Q694 249 708 249T722 217Q722 153 675 104T555 55Q514 55 468 76T388 123T308 170T224 192Q164 192 125 159T83 84Q80 55 69 55Q55 55 55 85Z" style="stroke-width: 3;"/></g><g data-mml-node="msup" transform="translate(3453.4,0)"><g data-mml-node="mi"><path data-c="1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(975.3,413) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(5054.4,0)"><path data-c="22C5" d="M78 250Q78 274 95 292T138 310Q162 310 180 294T199 251Q199 226 182 208T139 190T96 207T78 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(5554.6,0)"><path data-c="1D43F" d="M228 637Q194 637 192 641Q191 643 191 649Q191 673 202 682Q204 683 217 683Q271 680 344 680Q485 680 506 683H518Q524 677 524 674T522 656Q517 641 513 637H475Q406 636 394 628Q387 624 380 600T313 336Q297 271 279 198T252 88L243 52Q243 48 252 48T311 46H328Q360 46 379 47T428 54T478 72T522 106T564 161Q580 191 594 228T611 270Q616 273 628 273H641Q647 264 647 262T627 203T583 83T557 9Q555 4 553 3T537 0T494 -1Q483 -1 418 -1T294 0H116Q32 0 32 10Q32 17 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628Q285 635 228 637Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="block" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; overflow: hidden; width: 100%;"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><msub><mi>V</mi><mtext>total</mtext></msub><mo>≈</mo><msup><mi>N</mi><mn>2</mn></msup><mo>⋅</mo><mi>L</mi></math></mjx-assistive-mml></mjx-container><p>जहाँ <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="1.541ex" height="1.545ex" role="img" focusable="false" viewBox="0 -683 681 683" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D43F" d="M228 637Q194 637 192 641Q191 643 191 649Q191 673 202 682Q204 683 217 683Q271 680 344 680Q485 680 506 683H518Q524 677 524 674T522 656Q517 641 513 637H475Q406 636 394 628Q387 624 380 600T313 336Q297 271 279 198T252 88L243 52Q243 48 252 48T311 46H328Q360 46 379 47T428 54T478 72T522 106T564 161Q580 191 594 228T611 270Q616 273 628 273H641Q647 264 647 262T627 203T583 83T557 9Q555 4 553 3T537 0T494 -1Q483 -1 418 -1T294 0H116Q32 0 32 10Q32 17 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628Q285 635 228 637Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>L</mi></math></mjx-assistive-mml></mjx-container> rings हैं और हर एक में <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="6.784ex" height="1.545ex" role="img" focusable="false" viewBox="0 -683 2998.4 683" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(1110.2,0)"><path data-c="D7" d="M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(2110.4,0)"><path data-c="1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>N</mi><mo>×</mo><mi>N</mi></math></mjx-assistive-mml></mjx-container> vertices हैं। आप जितनी दूर देख सकते हैं उसे दोगुना करने की कीमत एक और ring है, geometry का चार गुना नहीं। Triangle count दुनिया के आकार चाहे जो हो, लगभग constant रहता है, क्योंकि आप हमेशा वही <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="1.541ex" height="1.545ex" role="img" focusable="false" viewBox="0 -683 681 683" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D43F" d="M228 637Q194 637 192 641Q191 643 191 649Q191 673 202 682Q204 683 217 683Q271 680 344 680Q485 680 506 683H518Q524 677 524 674T522 656Q517 641 513 637H475Q406 636 394 628Q387 624 380 600T313 336Q297 271 279 198T252 88L243 52Q243 48 252 48T311 46H328Q360 46 379 47T428 54T478 72T522 106T564 161Q580 191 594 228T611 270Q616 273 628 273H641Q647 264 647 262T627 203T583 83T557 9Q555 4 553 3T537 0T494 -1Q483 -1 418 -1T294 0H116Q32 0 32 10Q32 17 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628Q285 635 228 637Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>L</mi></math></mjx-assistive-mml></mjx-container> rings उसी resolution पर render करते हैं।</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/10-clipmap-geomorph/" title="Spike 10 Geometry Clipmaps Geomorphing" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/10-clipmap-geomorph/" target="_blank">Spike 10 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=10-clipmap-geomorph">सोर्स देखें</a></p>
<p>असली काम का तरीक़ा ring boundaries पर geomorphing था। जब कोई vertex एक LOD ring से अगले में जाता है, तो उसकी height को high-res और low-res sample के बीच smoothly blend होना ज़रूरी है। इसके बिना, जब भी camera हिलती है और rings खिसकती हैं, आपको हर बार दिखने वाले pops मिलते हैं। हमने इसे vertex की ring edge से दूरी पर आधारित एक blend factor से संभाला, और vertex shader में height को interpolate किया:</p>
<mjx-container tabindex="0" class="MathJax" jax="SVG" display="true" style="direction: ltr; display: block; text-align: center; margin: 1em 0; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="58.451ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 25835.3 1000" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="210E" d="M137 683Q138 683 209 688T282 694Q294 694 294 685Q294 674 258 534Q220 386 220 383Q220 381 227 388Q288 442 357 442Q411 442 444 415T478 336Q478 285 440 178T402 50Q403 36 407 31T422 26Q450 26 474 56T513 138Q516 149 519 151T535 153Q555 153 555 145Q555 144 551 130Q535 71 500 33Q466 -10 419 -10H414Q367 -10 346 17T325 74Q325 90 361 192T398 345Q398 404 354 404H349Q266 404 205 306L198 293L164 158Q132 28 127 16Q114 -11 83 -11Q69 -11 59 -2T48 16Q48 30 121 320L195 616Q195 629 188 632T149 637H128Q122 643 122 645T124 664Q129 683 137 683Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(853.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(1909.6,0)"><path data-c="6C" d="M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(278,0)" style="stroke-width: 3;"/><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(722,0)" style="stroke-width: 3;"/><path data-c="70" d="M36 -148H50Q89 -148 97 -134V-126Q97 -119 97 -107T97 -77T98 -38T98 6T98 55T98 106Q98 140 98 177T98 243T98 296T97 335T97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 61 434T98 436Q115 437 135 438T165 441T176 442H179V416L180 390L188 397Q247 441 326 441Q407 441 464 377T522 216Q522 115 457 52T310 -11Q242 -11 190 33L182 40V-45V-101Q182 -128 184 -134T195 -145Q216 -148 244 -148H260V-194H252L228 -193Q205 -192 178 -192T140 -191Q37 -191 28 -194H20V-148H36ZM424 218Q424 292 390 347T305 402Q234 402 182 337V98Q222 26 294 26Q345 26 384 80T424 218Z" transform="translate(1114,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(3579.6,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(3968.6,0)"><g data-mml-node="mi"><path data-c="210E" d="M137 683Q138 683 209 688T282 694Q294 694 294 685Q294 674 258 534Q220 386 220 383Q220 381 227 388Q288 442 357 442Q411 442 444 415T478 336Q478 285 440 178T402 50Q403 36 407 31T422 26Q450 26 474 56T513 138Q516 149 519 151T535 153Q555 153 555 145Q555 144 551 130Q535 71 500 33Q466 -10 419 -10H414Q367 -10 346 17T325 74Q325 90 361 192T398 345Q398 404 354 404H349Q266 404 205 306L198 293L164 158Q132 28 127 16Q114 -11 83 -11Q69 -11 59 -2T48 16Q48 30 121 320L195 616Q195 629 188 632T149 637H128Q122 643 122 645T124 664Q129 683 137 683Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(609,-150) scale(0.707)"><path data-c="66" d="M273 0Q255 3 146 3Q43 3 34 0H26V46H42Q70 46 91 49Q99 52 103 60Q104 62 104 224V385H33V431H104V497L105 564L107 574Q126 639 171 668T266 704Q267 704 275 704T289 705Q330 702 351 679T372 627Q372 604 358 590T321 576T284 590T270 627Q270 647 288 667H284Q280 668 273 668Q245 668 223 647T189 592Q183 572 182 497V431H293V385H185V225Q185 63 186 61T189 57T194 54T199 51T206 49T213 48T222 47T231 47T241 46T251 46H282V0H273Z" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(306,0)" style="stroke-width: 3;"/><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(584,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(1140,0)" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(5747.6,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="mstyle" transform="translate(6025.6,0)"><g data-mml-node="mspace"/></g><g data-mml-node="msub" transform="translate(6359.3,0)"><g data-mml-node="mi"><path data-c="210E" d="M137 683Q138 683 209 688T282 694Q294 694 294 685Q294 674 258 534Q220 386 220 383Q220 381 227 388Q288 442 357 442Q411 442 444 415T478 336Q478 285 440 178T402 50Q403 36 407 31T422 26Q450 26 474 56T513 138Q516 149 519 151T535 153Q555 153 555 145Q555 144 551 130Q535 71 500 33Q466 -10 419 -10H414Q367 -10 346 17T325 74Q325 90 361 192T398 345Q398 404 354 404H349Q266 404 205 306L198 293L164 158Q132 28 127 16Q114 -11 83 -11Q69 -11 59 -2T48 16Q48 30 121 320L195 616Q195 629 188 632T149 637H128Q122 643 122 645T124 664Q129 683 137 683Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(609,-150) scale(0.707)"><path data-c="63" d="M370 305T349 305T313 320T297 358Q297 381 312 396Q317 401 317 402T307 404Q281 408 258 408Q209 408 178 376Q131 329 131 219Q131 137 162 90Q203 29 272 29Q313 29 338 55T374 117Q376 125 379 127T395 129H409Q415 123 415 120Q415 116 411 104T395 71T366 33T318 2T249 -11Q163 -11 99 53T34 214Q34 318 99 383T250 448T370 421T404 357Q404 334 387 320Z" style="stroke-width: 3;"/><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z" transform="translate(444,0)" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(944,0)" style="stroke-width: 3;"/><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(1444,0)" style="stroke-width: 3;"/><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" transform="translate(1836,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(2230,0)" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(8909.1,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="mstyle" transform="translate(9187.1,0)"><g data-mml-node="mspace"/></g><g data-mml-node="mi" transform="translate(9520.7,0)"><path data-c="1D6FC" d="M34 156Q34 270 120 356T309 442Q379 442 421 402T478 304Q484 275 485 237V208Q534 282 560 374Q564 388 566 390T582 393Q603 393 603 385Q603 376 594 346T558 261T497 161L486 147L487 123Q489 67 495 47T514 26Q528 28 540 37T557 60Q559 67 562 68T577 70Q597 70 597 62Q597 56 591 43Q579 19 556 5T512 -10H505Q438 -10 414 62L411 69L400 61Q390 53 370 41T325 18T267 -2T203 -11Q124 -11 79 39T34 156ZM208 26Q257 26 306 47T379 90L403 112Q401 255 396 290Q382 405 304 405Q235 405 183 332Q156 292 139 224T121 120Q121 71 146 49T208 26Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(10160.7,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(10549.7,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="mstyle" transform="translate(10827.7,0)"><g data-mml-node="mspace"/></g><g data-mml-node="mi" transform="translate(12994.4,0)"><path data-c="1D6FC" d="M34 156Q34 270 120 356T309 442Q379 442 421 402T478 304Q484 275 485 237V208Q534 282 560 374Q564 388 566 390T582 393Q603 393 603 385Q603 376 594 346T558 261T497 161L486 147L487 123Q489 67 495 47T514 26Q528 28 540 37T557 60Q559 67 562 68T577 70Q597 70 597 62Q597 56 591 43Q579 19 556 5T512 -10H505Q438 -10 414 62L411 69L400 61Q390 53 370 41T325 18T267 -2T203 -11Q124 -11 79 39T34 156ZM208 26Q257 26 306 47T379 90L403 112Q401 255 396 290Q382 405 304 405Q235 405 183 332Q156 292 139 224T121 120Q121 71 146 49T208 26Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(13912.2,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(14968,0)"><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" style="stroke-width: 3;"/><path data-c="6D" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(394,0)" style="stroke-width: 3;"/><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z" transform="translate(1227,0)" style="stroke-width: 3;"/><path data-c="6F" d="M28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30Z" transform="translate(1727,0)" style="stroke-width: 3;"/><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" transform="translate(2227,0)" style="stroke-width: 3;"/><path data-c="68" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 124T102 167T103 217T103 272T103 329Q103 366 103 407T103 482T102 542T102 586T102 603Q99 622 88 628T43 637H25V660Q25 683 27 683L37 684Q47 685 66 686T103 688Q120 689 140 690T170 693T181 694H184V367Q244 442 328 442Q451 442 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(2616,0)" style="stroke-width: 3;"/><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" transform="translate(3172,0)" style="stroke-width: 3;"/><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" transform="translate(3566,0)" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(3955,0)" style="stroke-width: 3;"/><path data-c="70" d="M36 -148H50Q89 -148 97 -134V-126Q97 -119 97 -107T97 -77T98 -38T98 6T98 55T98 106Q98 140 98 177T98 243T98 296T97 335T97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 61 434T98 436Q115 437 135 438T165 441T176 442H179V416L180 390L188 397Q247 441 326 441Q407 441 464 377T522 216Q522 115 457 52T310 -11Q242 -11 190 33L182 40V-45V-101Q182 -128 184 -134T195 -145Q216 -148 244 -148H260V-194H252L228 -193Q205 -192 178 -192T140 -191Q37 -191 28 -194H20V-148H36ZM424 218Q424 292 390 347T305 402Q234 402 182 337V98Q222 26 294 26Q345 26 384 80T424 218Z" transform="translate(4399,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(19923,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(20312,0)"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(553,-150) scale(0.707)"><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(556,0)" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(1000,0)" style="stroke-width: 3;"/><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(1500,0)" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(22252.8,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="mstyle" transform="translate(22530.8,0)"><g data-mml-node="mspace"/></g><g data-mml-node="msub" transform="translate(22864.5,0)"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(553,-150) scale(0.707)"><path data-c="66" d="M273 0Q255 3 146 3Q43 3 34 0H26V46H42Q70 46 91 49Q99 52 103 60Q104 62 104 224V385H33V431H104V497L105 564L107 574Q126 639 171 668T266 704Q267 704 275 704T289 705Q330 702 351 679T372 627Q372 604 358 590T321 576T284 590T270 627Q270 647 288 667H284Q280 668 273 668Q245 668 223 647T189 592Q183 572 182 497V431H293V385H185V225Q185 63 186 61T189 57T194 54T199 51T206 49T213 48T222 47T231 47T241 46T251 46H282V0H273Z" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(306,0)" style="stroke-width: 3;"/><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(806,0)" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(24314.6,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="mstyle" transform="translate(24592.6,0)"><g data-mml-node="mspace"/></g><g data-mml-node="mi" transform="translate(24926.3,0)"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(25446.3,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="block" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; overflow: hidden; width: 100%;"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mi>h</mi><mo>=</mo><mi>lerp</mi><mo stretchy="false">(</mo><msub><mi>h</mi><mtext>fine</mtext></msub><mo>,</mo><mstyle scriptlevel="0"><mspace width="0.167em"/></mstyle><msub><mi>h</mi><mtext>coarse</mtext></msub><mo>,</mo><mstyle scriptlevel="0"><mspace width="0.167em"/></mstyle><mi>α</mi><mo stretchy="false">)</mo><mo>,</mo><mstyle scriptlevel="0"><mspace width="2em"/></mstyle><mi>α</mi><mo>=</mo><mi>smoothstep</mi><mo stretchy="false">(</mo><msub><mi>d</mi><mtext>near</mtext></msub><mo>,</mo><mstyle scriptlevel="0"><mspace width="0.167em"/></mstyle><msub><mi>d</mi><mtext>far</mtext></msub><mo>,</mo><mstyle scriptlevel="0"><mspace width="0.167em"/></mstyle><mi>d</mi><mo stretchy="false">)</mo></math></mjx-assistive-mml></mjx-container><p>जहाँ <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.023ex;" xmlns="http://www.w3.org/2000/svg" width="1.176ex" height="1.593ex" role="img" focusable="false" viewBox="0 -694 520 704" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>d</mi></math></mjx-assistive-mml></mjx-container> camera से vertex की दूरी है। ring के अंदर (<mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.357ex;" xmlns="http://www.w3.org/2000/svg" width="8.585ex" height="1.927ex" role="img" focusable="false" viewBox="0 -694 3794.4 851.8" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(797.8,0)"><path data-c="2264" d="M674 636Q682 636 688 630T694 615T687 601Q686 600 417 472L151 346L399 228Q687 92 691 87Q694 81 694 76Q694 58 676 56H670L382 192Q92 329 90 331Q83 336 83 348Q84 359 96 365Q104 369 382 500T665 634Q669 636 674 636ZM84 -118Q84 -108 99 -98H678Q694 -104 694 -118Q694 -130 679 -138H98Q84 -131 84 -118Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(1853.6,0)"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(553,-150) scale(0.707)"><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(556,0)" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(1000,0)" style="stroke-width: 3;"/><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(1500,0)" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>d</mi><mo>≤</mo><msub><mi>d</mi><mtext>near</mtext></msub></math></mjx-assistive-mml></mjx-container>) vertex अपनी पूरी-resolution height इस्तेमाल करता है; जब तक यह अगली ring तक पहुँचता है (<mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.357ex;" xmlns="http://www.w3.org/2000/svg" width="7.474ex" height="1.927ex" role="img" focusable="false" viewBox="0 -694 3303.7 851.8" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(797.8,0)"><path data-c="2265" d="M83 616Q83 624 89 630T99 636Q107 636 253 568T543 431T687 361Q694 356 694 346T687 331Q685 329 395 192L107 56H101Q83 58 83 76Q83 77 83 79Q82 86 98 95Q117 105 248 167Q326 204 378 228L626 346L360 472Q291 505 200 548Q112 589 98 597T83 616ZM84 -118Q84 -108 99 -98H678Q694 -104 694 -118Q694 -130 679 -138H98Q84 -131 84 -118Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(1853.6,0)"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(553,-150) scale(0.707)"><path data-c="66" d="M273 0Q255 3 146 3Q43 3 34 0H26V46H42Q70 46 91 49Q99 52 103 60Q104 62 104 224V385H33V431H104V497L105 564L107 574Q126 639 171 668T266 704Q267 704 275 704T289 705Q330 702 351 679T372 627Q372 604 358 590T321 576T284 590T270 627Q270 647 288 667H284Q280 668 273 668Q245 668 223 647T189 592Q183 572 182 497V431H293V385H185V225Q185 63 186 61T189 57T194 54T199 51T206 49T213 48T222 47T231 47T241 46T251 46H282V0H273Z" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(306,0)" style="stroke-width: 3;"/><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(806,0)" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>d</mi><mo>≥</mo><msub><mi>d</mi><mtext>far</mtext></msub></math></mjx-assistive-mml></mjx-container>) तब तक यह उस coarse height पर पहुँच चुका होता है जिसे वह ring इस्तेमाल करेगी, इसलिए pop होने को कुछ बचता ही नहीं।</p>
<p>एक बारीक सबक़ camera movement testing से आया। Static screenshots में clipmaps को परखना आसान है और transition artifacts से चूक जाना भी। हमने ring boundaries के आर-पार constant-speed traversals चलाने और temporal noise पर नज़र रखने में समय लगाया। Screenshots ने झूठ बोला। Motion ने सच बताया।</p>
<p>इस spike ने हमें एक साफ़ architectural boundary भी दी। Near-field terrain समय के साथ dynamic और महँगा बन सकता था, volumetric editing, ज़्यादा material complexity, और physics interaction के साथ। Far-field terrain stable, अंदाज़ा लगाने लायक़, और सस्ता रह सकता था। वह अलगाव इस बिंदु से आगे के हर architectural फ़ैसले की रीढ़ बन गया।</p>
<p>अगर आप अपने प्रोजेक्ट के लिए clipmaps को परख रहे हैं, तो stress loops test कीजिए, beauty shots नहीं। लंबे traversal paths, बदलती camera altitude, और बार-बार boundary crossings ही असली समस्याओं को उजागर करते हैं।</p>
<p>भाग 7 में हम volumetric meshing जोड़ते हैं और &quot;terrain एक surface के रूप में&quot; से &quot;terrain एक editable volume के रूप में&quot; की ओर बढ़ते हैं। यही वह बिंदु था जहाँ यह प्रोजेक्ट एक renderer होना बंद हुआ और एक world editor बनना शुरू हुआ।</p>
<h2 id="इस-अध्याय-में-बताई-गई-technology" tabindex="-1">इस अध्याय में बताई गई technology <a class="header-anchor" href="#इस-अध्याय-में-बताई-गई-technology" aria-label="Permalink to &quot;इस अध्याय में बताई गई technology&quot;"></a></h2>
<p><strong>Geometry clipmaps.</strong> Losasso और Hoppe ने SIGGRAPH 2004 में पेश की (<a href="https://hhoppe.com/geomclipmap.pdf" target="_blank" rel="noreferrer">paper</a>), geometry clipmaps terrain को camera पर केंद्रित concentric square rings के रूप में render करती हैं। हर ring पिछली से दोगुने इलाक़े की होती है, आधी vertex resolution पर। कुल vertex count constant होता है: लगभग <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="6.295ex" height="1.887ex" role="img" focusable="false" viewBox="0 -833.9 2782.2 833.9" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msup"><g data-mml-node="mi"><path data-c="1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(975.3,363) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(1601,0)"><path data-c="22C5" d="M78 250Q78 274 95 292T138 310Q162 310 180 294T199 251Q199 226 182 208T139 190T96 207T78 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(2101.2,0)"><path data-c="1D43F" d="M228 637Q194 637 192 641Q191 643 191 649Q191 673 202 682Q204 683 217 683Q271 680 344 680Q485 680 506 683H518Q524 677 524 674T522 656Q517 641 513 637H475Q406 636 394 628Q387 624 380 600T313 336Q297 271 279 198T252 88L243 52Q243 48 252 48T311 46H328Q360 46 379 47T428 54T478 72T522 106T564 161Q580 191 594 228T611 270Q616 273 628 273H641Q647 264 647 262T627 203T583 83T557 9Q555 4 553 3T537 0T494 -1Q483 -1 418 -1T294 0H116Q32 0 32 10Q32 17 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628Q285 635 228 637Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><msup><mi>N</mi><mn>2</mn></msup><mo>⋅</mo><mi>L</mi></math></mjx-assistive-mml></mjx-container>। <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.186ex;" xmlns="http://www.w3.org/2000/svg" width="8.42ex" height="1.731ex" role="img" focusable="false" viewBox="0 -683 3721.6 765" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(1165.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(2221.6,0)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/><path data-c="35" d="M164 157Q164 133 148 117T109 101H102Q148 22 224 22Q294 22 326 82Q345 115 345 210Q345 313 318 349Q292 382 260 382H254Q176 382 136 314Q132 307 129 306T114 304Q97 304 95 310Q93 314 93 485V614Q93 664 98 664Q100 666 102 666Q103 666 123 658T178 642T253 634Q324 634 389 662Q397 666 402 666Q410 666 410 648V635Q328 538 205 538Q174 538 149 544L139 546V374Q158 388 169 396T205 412T256 420Q337 420 393 355T449 201Q449 109 385 44T229 -22Q148 -22 99 32T50 154Q50 178 61 192T84 210T107 214Q132 214 148 197T164 157Z" transform="translate(500,0)" style="stroke-width: 3;"/><path data-c="36" d="M42 313Q42 476 123 571T303 666Q372 666 402 630T432 550Q432 525 418 510T379 495Q356 495 341 509T326 548Q326 592 373 601Q351 623 311 626Q240 626 194 566Q147 500 147 364L148 360Q153 366 156 373Q197 433 263 433H267Q313 433 348 414Q372 400 396 374T435 317Q456 268 456 210V192Q456 169 451 149Q440 90 387 34T253 -22Q225 -22 199 -14T143 16T92 75T56 172T42 313ZM257 397Q227 397 205 380T171 335T154 278T148 216Q148 133 160 97T198 39Q222 21 251 21Q302 21 329 59Q342 77 347 104T352 209Q352 289 347 316T329 361Q302 397 257 397Z" transform="translate(1000,0)" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>N</mi><mo>=</mo><mn>256</mn></math></mjx-assistive-mml></mjx-container> और <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.186ex;" xmlns="http://www.w3.org/2000/svg" width="5.689ex" height="1.731ex" role="img" focusable="false" viewBox="0 -683 2514.6 765" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D43F" d="M228 637Q194 637 192 641Q191 643 191 649Q191 673 202 682Q204 683 217 683Q271 680 344 680Q485 680 506 683H518Q524 677 524 674T522 656Q517 641 513 637H475Q406 636 394 628Q387 624 380 600T313 336Q297 271 279 198T252 88L243 52Q243 48 252 48T311 46H328Q360 46 379 47T428 54T478 72T522 106T564 161Q580 191 594 228T611 270Q616 273 628 273H641Q647 264 647 262T627 203T583 83T557 9Q555 4 553 3T537 0T494 -1Q483 -1 418 -1T294 0H116Q32 0 32 10Q32 17 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628Q285 635 228 637Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(958.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(2014.6,0)"><path data-c="38" d="M70 417T70 494T124 618T248 666Q319 666 374 624T429 515Q429 485 418 459T392 417T361 389T335 371T324 363L338 354Q352 344 366 334T382 323Q457 264 457 174Q457 95 399 37T249 -22Q159 -22 101 29T43 155Q43 263 172 335L154 348Q133 361 127 368Q70 417 70 494ZM286 386L292 390Q298 394 301 396T311 403T323 413T334 425T345 438T355 454T364 471T369 491T371 513Q371 556 342 586T275 624Q268 625 242 625Q201 625 165 599T128 534Q128 511 141 492T167 463T217 431Q224 426 228 424L286 386ZM250 21Q308 21 350 55T392 137Q392 154 387 169T375 194T353 216T330 234T301 253T274 270Q260 279 244 289T218 306L210 311Q204 311 181 294T133 239T107 157Q107 98 150 60T250 21Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>L</mi><mo>=</mo><mn>8</mn></math></mjx-assistive-mml></mjx-container> levels के साथ, यह <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.439ex;" xmlns="http://www.w3.org/2000/svg" width="18.712ex" height="2.394ex" role="img" focusable="false" viewBox="0 -864 8270.6 1058" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msup"><g data-mml-node="mn"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/><path data-c="35" d="M164 157Q164 133 148 117T109 101H102Q148 22 224 22Q294 22 326 82Q345 115 345 210Q345 313 318 349Q292 382 260 382H254Q176 382 136 314Q132 307 129 306T114 304Q97 304 95 310Q93 314 93 485V614Q93 664 98 664Q100 666 102 666Q103 666 123 658T178 642T253 634Q324 634 389 662Q397 666 402 666Q410 666 410 648V635Q328 538 205 538Q174 538 149 544L139 546V374Q158 388 169 396T205 412T256 420Q337 420 393 355T449 201Q449 109 385 44T229 -22Q148 -22 99 32T50 154Q50 178 61 192T84 210T107 214Q132 214 148 197T164 157Z" transform="translate(500,0)" style="stroke-width: 3;"/><path data-c="36" d="M42 313Q42 476 123 571T303 666Q372 666 402 630T432 550Q432 525 418 510T379 495Q356 495 341 509T326 548Q326 592 373 601Q351 623 311 626Q240 626 194 566Q147 500 147 364L148 360Q153 366 156 373Q197 433 263 433H267Q313 433 348 414Q372 400 396 374T435 317Q456 268 456 210V192Q456 169 451 149Q440 90 387 34T253 -22Q225 -22 199 -14T143 16T92 75T56 172T42 313ZM257 397Q227 397 205 380T171 335T154 278T148 216Q148 133 160 97T198 39Q222 21 251 21Q302 21 329 59Q342 77 347 104T352 209Q352 289 347 316T329 361Q302 397 257 397Z" transform="translate(1000,0)" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(1533,393.1) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(2158.8,0)"><path data-c="D7" d="M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(3159,0)"><path data-c="38" d="M70 417T70 494T124 618T248 666Q319 666 374 624T429 515Q429 485 418 459T392 417T361 389T335 371T324 363L338 354Q352 344 366 334T382 323Q457 264 457 174Q457 95 399 37T249 -22Q159 -22 101 29T43 155Q43 263 172 335L154 348Q133 361 127 368Q70 417 70 494ZM286 386L292 390Q298 394 301 396T311 403T323 413T334 425T345 438T355 454T364 471T369 491T371 513Q371 556 342 586T275 624Q268 625 242 625Q201 625 165 599T128 534Q128 511 141 492T167 463T217 431Q224 426 228 424L286 386ZM250 21Q308 21 350 55T392 137Q392 154 387 169T375 194T353 216T330 234T301 253T274 270Q260 279 244 289T218 306L210 311Q204 311 181 294T133 239T107 157Q107 98 150 60T250 21Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(3936.8,0)"><path data-c="2248" d="M55 319Q55 360 72 393T114 444T163 472T205 482Q207 482 213 482T223 483Q262 483 296 468T393 413L443 381Q502 346 553 346Q609 346 649 375T694 454Q694 465 698 474T708 483Q722 483 722 452Q722 386 675 338T555 289Q514 289 468 310T388 357T308 404T224 426Q164 426 125 393T83 318Q81 289 69 289Q55 289 55 319ZM55 85Q55 126 72 159T114 210T163 238T205 248Q207 248 213 248T223 249Q262 249 296 234T393 179L443 147Q502 112 553 112Q609 112 649 141T694 220Q694 249 708 249T722 217Q722 153 675 104T555 55Q514 55 468 76T388 123T308 170T224 192Q164 192 125 159T83 84Q80 55 69 55Q55 55 55 85Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(4992.6,0)"><path data-c="35" d="M164 157Q164 133 148 117T109 101H102Q148 22 224 22Q294 22 326 82Q345 115 345 210Q345 313 318 349Q292 382 260 382H254Q176 382 136 314Q132 307 129 306T114 304Q97 304 95 310Q93 314 93 485V614Q93 664 98 664Q100 666 102 666Q103 666 123 658T178 642T253 634Q324 634 389 662Q397 666 402 666Q410 666 410 648V635Q328 538 205 538Q174 538 149 544L139 546V374Q158 388 169 396T205 412T256 420Q337 420 393 355T449 201Q449 109 385 44T229 -22Q148 -22 99 32T50 154Q50 178 61 192T84 210T107 214Q132 214 148 197T164 157Z" style="stroke-width: 3;"/><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" transform="translate(500,0)" style="stroke-width: 3;"/><path data-c="34" d="M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z" transform="translate(1000,0)" style="stroke-width: 3;"/><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" transform="translate(1500,0)" style="stroke-width: 3;"/><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(1778,0)" style="stroke-width: 3;"/><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(2278,0)" style="stroke-width: 3;"/><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(2778,0)" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><msup><mn>256</mn><mn>2</mn></msup><mo>×</mo><mn>8</mn><mo>≈</mo><mn>524,000</mn></math></mjx-assistive-mml></mjx-container> vertices है, दुनिया का आकार चाहे जो हो। camera हिलने पर CPU हर ring के लिए heightmap data update करता है। vertex shader एक texture से height पढ़ता है और flat grid को displace करता है। हमारी <a href="/hi/guides/landscape-generation-browser.html#geometry-clipmaps">geometry clipmaps पर landscape गाइड</a> और <a href="https://developer.nvidia.com/gpugems/gpugems2/part-i-geometric-complexity/chapter-2-terrain-rendering-using-gpu-based-geometry" target="_blank" rel="noreferrer">GPU Gems 2, Chapter 2</a> देखिए।</p>
<p><strong>Geomorphing.</strong> Terrain LOD में सबसे बड़ा visual artifact popping है: जब कोई patch LOD level बदलता है तो vertices अचानक कूद जाते हैं। Geomorphing इसे एक transition zone के दौरान LOD levels के बीच vertex positions को blend करके ख़त्म कर देता है। हर vertex अपनी current-LOD height और अपनी coarser-LOD height, दोनों स्टोर करता है। camera की दूरी पर आधारित एक morph factor उनके बीच smoothly interpolate करता है: <code>morphedHeight = mix(fineLodHeight, coarseLodHeight, smoothstep(lodNear, lodFar, distance))</code>। transition zone आम तौर पर हर ring का बाहरी 20% होता है। सामान्य camera speeds पर, transition अदृश्य रहता है। <a href="/hi/guides/landscape-generation-browser.html#geomorphing-pop-free-lod-transitions">geomorphing की बारीकियाँ</a> देखिए।</p>
<p><strong>CDLOD (Quadtree-Adaptive Clipmaps).</strong> Strugar (2014, <a href="https://www.vertexasylum.com/CDLOD/cdlod_latest.pdf" target="_blank" rel="noreferrer">paper</a>) द्वारा fixed-ring clipmaps में एक सुधार। एक समान resolution वाली concentric rings के बजाय, CDLOD एक quadtree इस्तेमाल करता है जो terrain की complexity के मुताबिक़ ढल जाता है। समतल इलाक़े coarse nodes इस्तेमाल करते हैं, जबकि ज़्यादा detail वाले इलाक़ों (cliffs, ridges) को बारीक subdivision मिलता है। यह creator worlds के लिए मायने रखता है जहाँ अलग-अलग chunks की complexity बहुत अलग होती है। हमारी <a href="/hi/guides/landscape-generation-browser.html#cdlod-quadtree-adaptive-clipmaps">landscape गाइड में CDLOD</a> देखिए।</p>
<hr>
<p>12 में से भाग 6।<br>
पिछला: <a href="/hi/blog/2026-02-25-open-world-browser-part-05-budgeting-the-pretty.html">भाग 5 - सुंदर चीज़ों का बजट बनाना</a><br>
अगला: <a href="/hi/blog/2026-02-25-open-world-browser-part-07-marching-cubes.html">भाग 7 - Marching cubes और पहली असली गुफाएँ</a><br>
सीरीज़ गाइड: <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">/hi/blog/2026-02-25-open-world-browser-series-guide</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Browser में open world बनाना, भाग 7: Marching cubes और पहली असली गुफाएं]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-02-25-open-world-browser-part-07-marching-cubes</link>
            <guid>https://app.cinevva.com/hi/blog/2026-02-25-open-world-browser-part-07-marching-cubes</guid>
            <pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Spike 12 ने project में real-time WebGPU marching cubes लाया और बदल दिया कि terrain क्या हो सकता है।]]></description>
            <content:encoded><![CDATA[<h1 id="browser-में-open-world-बनाना-भाग-7-marching-cubes-और-पहली-असली-गुफाएं" tabindex="-1">Browser में open world बनाना, भाग 7: Marching cubes और पहली असली गुफाएं <a class="header-anchor" href="#browser-में-open-world-बनाना-भाग-7-marching-cubes-और-पहली-असली-गुफाएं" aria-label="Permalink to &quot;Browser में open world बनाना, भाग 7: Marching cubes और पहली असली गुफाएं&quot;"></a></h1>
<p><em>लेखक <a href="/hi/about.html">Oleg Sidorkin</a>, Cinevva के CTO और सह-संस्थापक</em></p>
<p>यहां नए हैं? <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">series guide</a> का इस्तेमाल करें। यह बताती है कि spike क्या होता है और सभी भागों को जोड़ती है।</p>
<p>Heightmaps तब तक बढ़िया हैं जब तक आपको overhangs की ज़रूरत नहीं पड़ती।</p>
<p>जिस पल आप कटे हुए tunnels, हवा में लटकते चट्टान के किनारे, या गुफा की छतें चाहते हैं, एक शुद्ध heightfield pipeline आपको रोकने लगती है। एक heightmap हर XZ coordinate के लिए सिर्फ एक Y value रखता है। यह physically किसी भी ऐसी surface को दिखाने में असमर्थ है जो खुद के ऊपर मुड़ती हो। हमें एक volumetric representation की ज़रूरत थी।</p>
<p>Spike 12 ने WebGPU compute shaders का इस्तेमाल करके GPU पर marching cubes लागू किया। यह algorithm एक 3D grid पर signed distance field (SDF) का मूल्यांकन करता है और zero-crossing surface पर एक triangle mesh निकालता है। हर cell के 8 corners होते हैं, हर corner या तो surface के अंदर होता है या बाहर, जिससे <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.186ex;" xmlns="http://www.w3.org/2000/svg" width="8.53ex" height="2.072ex" role="img" focusable="false" viewBox="0 -833.9 3770.1 915.9" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msup"><g data-mml-node="mn"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(533,363) scale(0.707)"><path data-c="38" d="M70 417T70 494T124 618T248 666Q319 666 374 624T429 515Q429 485 418 459T392 417T361 389T335 371T324 363L338 354Q352 344 366 334T382 323Q457 264 457 174Q457 95 399 37T249 -22Q159 -22 101 29T43 155Q43 263 172 335L154 348Q133 361 127 368Q70 417 70 494ZM286 386L292 390Q298 394 301 396T311 403T323 413T334 425T345 438T355 454T364 471T369 491T371 513Q371 556 342 586T275 624Q268 625 242 625Q201 625 165 599T128 534Q128 511 141 492T167 463T217 431Q224 426 228 424L286 386ZM250 21Q308 21 350 55T392 137Q392 154 387 169T375 194T353 216T330 234T301 253T274 270Q260 279 244 289T218 306L210 311Q204 311 181 294T133 239T107 157Q107 98 150 60T250 21Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(1214.3,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(2270.1,0)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/><path data-c="35" d="M164 157Q164 133 148 117T109 101H102Q148 22 224 22Q294 22 326 82Q345 115 345 210Q345 313 318 349Q292 382 260 382H254Q176 382 136 314Q132 307 129 306T114 304Q97 304 95 310Q93 314 93 485V614Q93 664 98 664Q100 666 102 666Q103 666 123 658T178 642T253 634Q324 634 389 662Q397 666 402 666Q410 666 410 648V635Q328 538 205 538Q174 538 149 544L139 546V374Q158 388 169 396T205 412T256 420Q337 420 393 355T449 201Q449 109 385 44T229 -22Q148 -22 99 32T50 154Q50 178 61 192T84 210T107 214Q132 214 148 197T164 157Z" transform="translate(500,0)" style="stroke-width: 3;"/><path data-c="36" d="M42 313Q42 476 123 571T303 666Q372 666 402 630T432 550Q432 525 418 510T379 495Q356 495 341 509T326 548Q326 592 373 601Q351 623 311 626Q240 626 194 566Q147 500 147 364L148 360Q153 366 156 373Q197 433 263 433H267Q313 433 348 414Q372 400 396 374T435 317Q456 268 456 210V192Q456 169 451 149Q440 90 387 34T253 -22Q225 -22 199 -14T143 16T92 75T56 172T42 313ZM257 397Q227 397 205 380T171 335T154 278T148 216Q148 133 160 97T198 39Q222 21 251 21Q302 21 329 59Q342 77 347 104T352 209Q352 289 347 316T329 361Q302 397 257 397Z" transform="translate(1000,0)" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><msup><mn>2</mn><mn>8</mn></msup><mo>=</mo><mn>256</mn></math></mjx-assistive-mml></mjx-container> संभव sign patterns बनते हैं। एक lookup table हर pattern को triangles के एक set से जोड़ता है। Vertices cell के edges पर उस बिंदु पर बैठते हैं जहां field zero को पार करती है। corners <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.023ex;" xmlns="http://www.w3.org/2000/svg" width="1.197ex" height="1.02ex" role="img" focusable="false" viewBox="0 -441 529 451" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D44E" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>a</mi></math></mjx-assistive-mml></mjx-container> और <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="0.971ex" height="1.595ex" role="img" focusable="false" viewBox="0 -694 429 705" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D44F" d="M73 647Q73 657 77 670T89 683Q90 683 161 688T234 694Q246 694 246 685T212 542Q204 508 195 472T180 418L176 399Q176 396 182 402Q231 442 283 442Q345 442 383 396T422 280Q422 169 343 79T173 -11Q123 -11 82 27T40 150V159Q40 180 48 217T97 414Q147 611 147 623T109 637Q104 637 101 637H96Q86 637 83 637T76 640T73 647ZM336 325V331Q336 405 275 405Q258 405 240 397T207 376T181 352T163 330L157 322L136 236Q114 150 114 114Q114 66 138 42Q154 26 178 26Q211 26 245 58Q270 81 285 114T318 219Q336 291 336 325Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>b</mi></math></mjx-assistive-mml></mjx-container> के बीच के एक edge के लिए जिनके field values <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.464ex;" xmlns="http://www.w3.org/2000/svg" width="2.143ex" height="2.059ex" role="img" focusable="false" viewBox="0 -705 947.1 910" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D453" d="M118 -162Q120 -162 124 -164T135 -167T147 -168Q160 -168 171 -155T187 -126Q197 -99 221 27T267 267T289 382V385H242Q195 385 192 387Q188 390 188 397L195 425Q197 430 203 430T250 431Q298 431 298 432Q298 434 307 482T319 540Q356 705 465 705Q502 703 526 683T550 630Q550 594 529 578T487 561Q443 561 443 603Q443 622 454 636T478 657L487 662Q471 668 457 668Q445 668 434 658T419 630Q412 601 403 552T387 469T380 433Q380 431 435 431Q480 431 487 430T498 424Q499 420 496 407T491 391Q489 386 482 386T428 385H372L349 263Q301 15 282 -47Q255 -132 212 -173Q175 -205 139 -205Q107 -205 81 -186T55 -132Q55 -95 76 -78T118 -61Q162 -61 162 -103Q162 -122 151 -136T127 -157L118 -162Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(523,-150) scale(0.707)"><path data-c="1D44E" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>f</mi><mi>a</mi></msub></math></mjx-assistive-mml></mjx-container> और <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.464ex;" xmlns="http://www.w3.org/2000/svg" width="1.983ex" height="2.059ex" role="img" focusable="false" viewBox="0 -705 876.3 910" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D453" d="M118 -162Q120 -162 124 -164T135 -167T147 -168Q160 -168 171 -155T187 -126Q197 -99 221 27T267 267T289 382V385H242Q195 385 192 387Q188 390 188 397L195 425Q197 430 203 430T250 431Q298 431 298 432Q298 434 307 482T319 540Q356 705 465 705Q502 703 526 683T550 630Q550 594 529 578T487 561Q443 561 443 603Q443 622 454 636T478 657L487 662Q471 668 457 668Q445 668 434 658T419 630Q412 601 403 552T387 469T380 433Q380 431 435 431Q480 431 487 430T498 424Q499 420 496 407T491 391Q489 386 482 386T428 385H372L349 263Q301 15 282 -47Q255 -132 212 -173Q175 -205 139 -205Q107 -205 81 -186T55 -132Q55 -95 76 -78T118 -61Q162 -61 162 -103Q162 -122 151 -136T127 -157L118 -162Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(523,-150) scale(0.707)"><path data-c="1D44F" d="M73 647Q73 657 77 670T89 683Q90 683 161 688T234 694Q246 694 246 685T212 542Q204 508 195 472T180 418L176 399Q176 396 182 402Q231 442 283 442Q345 442 383 396T422 280Q422 169 343 79T173 -11Q123 -11 82 27T40 150V159Q40 180 48 217T97 414Q147 611 147 623T109 637Q104 637 101 637H96Q86 637 83 637T76 640T73 647ZM336 325V331Q336 405 275 405Q258 405 240 397T207 376T181 352T163 330L157 322L136 236Q114 150 114 114Q114 66 138 42Q154 26 178 26Q211 26 245 58Q270 81 285 114T318 219Q336 291 336 325Z" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>f</mi><mi>b</mi></msub></math></mjx-assistive-mml></mjx-container> हैं, linear interpolation vertex को यहां रखता है</p>
<mjx-container tabindex="0" class="MathJax" jax="SVG" display="true" style="direction: ltr; display: block; text-align: center; margin: 1em 0; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -2.016ex;" xmlns="http://www.w3.org/2000/svg" width="37.407ex" height="5.14ex" role="img" focusable="false" viewBox="0 -1381 16534 2272" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D42F" d="M401 444Q413 441 495 441Q568 441 574 444H580V382H510L409 156Q348 18 339 6Q331 -4 320 -4Q318 -4 313 -4T303 -3H288Q273 -3 264 12T221 102Q206 135 197 156L96 382H26V444H34Q49 441 145 441Q252 441 270 444H279V382H231L284 264Q335 149 338 149Q338 150 389 264T442 381Q442 382 418 382H394V444H401Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(884.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(1940.6,0)"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D429" d="M32 442L123 446Q214 450 215 450H221V409Q222 409 229 413T251 423T284 436T328 446T382 450Q480 450 540 388T600 223Q600 128 539 61T361 -6H354Q292 -6 236 28L227 34V-132H296V-194H287Q269 -191 163 -191Q56 -191 38 -194H29V-132H98V113V284Q98 330 97 348T93 370T83 376Q69 380 42 380H29V442H32ZM457 224Q457 303 427 349T350 395Q282 395 235 352L227 345V104L233 97Q274 45 337 45Q383 45 420 86T457 224Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mi" transform="translate(672,-150) scale(0.707)"><path data-c="1D44E" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(3258.8,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(4259.1,0)"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z" style="stroke-width: 3;"/></g><g data-mml-node="mstyle" transform="translate(4620.1,0)"><g data-mml-node="mspace"/></g><g data-mml-node="mo" transform="translate(4787.1,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(5176.1,0)"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D429" d="M32 442L123 446Q214 450 215 450H221V409Q222 409 229 413T251 423T284 436T328 446T382 450Q480 450 540 388T600 223Q600 128 539 61T361 -6H354Q292 -6 236 28L227 34V-132H296V-194H287Q269 -191 163 -191Q56 -191 38 -194H29V-132H98V113V284Q98 330 97 348T93 370T83 376Q69 380 42 380H29V442H32ZM457 224Q457 303 427 349T350 395Q282 395 235 352L227 345V104L233 97Q274 45 337 45Q383 45 420 86T457 224Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mi" transform="translate(672,-150) scale(0.707)"><path data-c="1D44F" d="M73 647Q73 657 77 670T89 683Q90 683 161 688T234 694Q246 694 246 685T212 542Q204 508 195 472T180 418L176 399Q176 396 182 402Q231 442 283 442Q345 442 383 396T422 280Q422 169 343 79T173 -11Q123 -11 82 27T40 150V159Q40 180 48 217T97 414Q147 611 147 623T109 637Q104 637 101 637H96Q86 637 83 637T76 640T73 647ZM336 325V331Q336 405 275 405Q258 405 240 397T207 376T181 352T163 330L157 322L136 236Q114 150 114 114Q114 66 138 42Q154 26 178 26Q211 26 245 58Q270 81 285 114T318 219Q336 291 336 325Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(6423.6,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(7423.9,0)"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mi"><path data-c="1D429" d="M32 442L123 446Q214 450 215 450H221V409Q222 409 229 413T251 423T284 436T328 446T382 450Q480 450 540 388T600 223Q600 128 539 61T361 -6H354Q292 -6 236 28L227 34V-132H296V-194H287Q269 -191 163 -191Q56 -191 38 -194H29V-132H98V113V284Q98 330 97 348T93 370T83 376Q69 380 42 380H29V442H32ZM457 224Q457 303 427 349T350 395Q282 395 235 352L227 345V104L233 97Q274 45 337 45Q383 45 420 86T457 224Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mi" transform="translate(672,-150) scale(0.707)"><path data-c="1D44E" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(8519.9,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(8908.9,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="mstyle" transform="translate(9186.9,0)"><g data-mml-node="mspace"/></g><g data-mml-node="mi" transform="translate(11353.6,0)"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(11992.4,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mfrac" transform="translate(13048.1,0)"><g data-mml-node="mrow" transform="translate(880.4,676)"><g data-mml-node="mo"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(778,0)"><g data-mml-node="mi"><path data-c="1D453" d="M118 -162Q120 -162 124 -164T135 -167T147 -168Q160 -168 171 -155T187 -126Q197 -99 221 27T267 267T289 382V385H242Q195 385 192 387Q188 390 188 397L195 425Q197 430 203 430T250 431Q298 431 298 432Q298 434 307 482T319 540Q356 705 465 705Q502 703 526 683T550 630Q550 594 529 578T487 561Q443 561 443 603Q443 622 454 636T478 657L487 662Q471 668 457 668Q445 668 434 658T419 630Q412 601 403 552T387 469T380 433Q380 431 435 431Q480 431 487 430T498 424Q499 420 496 407T491 391Q489 386 482 386T428 385H372L349 263Q301 15 282 -47Q255 -132 212 -173Q175 -205 139 -205Q107 -205 81 -186T55 -132Q55 -95 76 -78T118 -61Q162 -61 162 -103Q162 -122 151 -136T127 -157L118 -162Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(523,-150) scale(0.707)"><path data-c="1D44E" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z" style="stroke-width: 3;"/></g></g></g><g data-mml-node="mrow" transform="translate(220,-686)"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D453" d="M118 -162Q120 -162 124 -164T135 -167T147 -168Q160 -168 171 -155T187 -126Q197 -99 221 27T267 267T289 382V385H242Q195 385 192 387Q188 390 188 397L195 425Q197 430 203 430T250 431Q298 431 298 432Q298 434 307 482T319 540Q356 705 465 705Q502 703 526 683T550 630Q550 594 529 578T487 561Q443 561 443 603Q443 622 454 636T478 657L487 662Q471 668 457 668Q445 668 434 658T419 630Q412 601 403 552T387 469T380 433Q380 431 435 431Q480 431 487 430T498 424Q499 420 496 407T491 391Q489 386 482 386T428 385H372L349 263Q301 15 282 -47Q255 -132 212 -173Q175 -205 139 -205Q107 -205 81 -186T55 -132Q55 -95 76 -78T118 -61Q162 -61 162 -103Q162 -122 151 -136T127 -157L118 -162Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(523,-150) scale(0.707)"><path data-c="1D44F" d="M73 647Q73 657 77 670T89 683Q90 683 161 688T234 694Q246 694 246 685T212 542Q204 508 195 472T180 418L176 399Q176 396 182 402Q231 442 283 442Q345 442 383 396T422 280Q422 169 343 79T173 -11Q123 -11 82 27T40 150V159Q40 180 48 217T97 414Q147 611 147 623T109 637Q104 637 101 637H96Q86 637 83 637T76 640T73 647ZM336 325V331Q336 405 275 405Q258 405 240 397T207 376T181 352T163 330L157 322L136 236Q114 150 114 114Q114 66 138 42Q154 26 178 26Q211 26 245 58Q270 81 285 114T318 219Q336 291 336 325Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(1098.6,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(2098.8,0)"><g data-mml-node="mi"><path data-c="1D453" d="M118 -162Q120 -162 124 -164T135 -167T147 -168Q160 -168 171 -155T187 -126Q197 -99 221 27T267 267T289 382V385H242Q195 385 192 387Q188 390 188 397L195 425Q197 430 203 430T250 431Q298 431 298 432Q298 434 307 482T319 540Q356 705 465 705Q502 703 526 683T550 630Q550 594 529 578T487 561Q443 561 443 603Q443 622 454 636T478 657L487 662Q471 668 457 668Q445 668 434 658T419 630Q412 601 403 552T387 469T380 433Q380 431 435 431Q480 431 487 430T498 424Q499 420 496 407T491 391Q489 386 482 386T428 385H372L349 263Q301 15 282 -47Q255 -132 212 -173Q175 -205 139 -205Q107 -205 81 -186T55 -132Q55 -95 76 -78T118 -61Q162 -61 162 -103Q162 -122 151 -136T127 -157L118 -162Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(523,-150) scale(0.707)"><path data-c="1D44E" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z" style="stroke-width: 3;"/></g></g></g><rect width="3245.9" height="60" x="120" y="220"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="block" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; overflow: hidden; width: 100%;"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mrow data-mjx-texclass="ORD"><mi mathvariant="bold">v</mi></mrow><mo>=</mo><msub><mrow data-mjx-texclass="ORD"><mi mathvariant="bold">p</mi></mrow><mi>a</mi></msub><mo>+</mo><mi>t</mi><mstyle scriptlevel="0"><mspace width="0.167em"/></mstyle><mo stretchy="false">(</mo><msub><mrow data-mjx-texclass="ORD"><mi mathvariant="bold">p</mi></mrow><mi>b</mi></msub><mo>−</mo><msub><mrow data-mjx-texclass="ORD"><mi mathvariant="bold">p</mi></mrow><mi>a</mi></msub><mo stretchy="false">)</mo><mo>,</mo><mstyle scriptlevel="0"><mspace width="2em"/></mstyle><mi>t</mi><mo>=</mo><mfrac><mrow><mo>−</mo><msub><mi>f</mi><mi>a</mi></msub></mrow><mrow><msub><mi>f</mi><mi>b</mi></msub><mo>−</mo><msub><mi>f</mi><mi>a</mi></msub></mrow></mfrac></math></mjx-assistive-mml></mjx-container><p>जो edge के साथ वह fraction है जहां field zero पर पहुंचती है। चूंकि एक crossing edge पर <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.464ex;" xmlns="http://www.w3.org/2000/svg" width="2.143ex" height="2.059ex" role="img" focusable="false" viewBox="0 -705 947.1 910" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D453" d="M118 -162Q120 -162 124 -164T135 -167T147 -168Q160 -168 171 -155T187 -126Q197 -99 221 27T267 267T289 382V385H242Q195 385 192 387Q188 390 188 397L195 425Q197 430 203 430T250 431Q298 431 298 432Q298 434 307 482T319 540Q356 705 465 705Q502 703 526 683T550 630Q550 594 529 578T487 561Q443 561 443 603Q443 622 454 636T478 657L487 662Q471 668 457 668Q445 668 434 658T419 630Q412 601 403 552T387 469T380 433Q380 431 435 431Q480 431 487 430T498 424Q499 420 496 407T491 391Q489 386 482 386T428 385H372L349 263Q301 15 282 -47Q255 -132 212 -173Q175 -205 139 -205Q107 -205 81 -186T55 -132Q55 -95 76 -78T118 -61Q162 -61 162 -103Q162 -122 151 -136T127 -157L118 -162Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(523,-150) scale(0.707)"><path data-c="1D44E" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>f</mi><mi>a</mi></msub></math></mjx-assistive-mml></mjx-container> और <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.464ex;" xmlns="http://www.w3.org/2000/svg" width="1.983ex" height="2.059ex" role="img" focusable="false" viewBox="0 -705 876.3 910" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msub"><g data-mml-node="mi"><path data-c="1D453" d="M118 -162Q120 -162 124 -164T135 -167T147 -168Q160 -168 171 -155T187 -126Q197 -99 221 27T267 267T289 382V385H242Q195 385 192 387Q188 390 188 397L195 425Q197 430 203 430T250 431Q298 431 298 432Q298 434 307 482T319 540Q356 705 465 705Q502 703 526 683T550 630Q550 594 529 578T487 561Q443 561 443 603Q443 622 454 636T478 657L487 662Q471 668 457 668Q445 668 434 658T419 630Q412 601 403 552T387 469T380 433Q380 431 435 431Q480 431 487 430T498 424Q499 420 496 407T491 391Q489 386 482 386T428 385H372L349 263Q301 15 282 -47Q255 -132 212 -173Q175 -205 139 -205Q107 -205 81 -186T55 -132Q55 -95 76 -78T118 -61Q162 -61 162 -103Q162 -122 151 -136T127 -157L118 -162Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(523,-150) scale(0.707)"><path data-c="1D44F" d="M73 647Q73 657 77 670T89 683Q90 683 161 688T234 694Q246 694 246 685T212 542Q204 508 195 472T180 418L176 399Q176 396 182 402Q231 442 283 442Q345 442 383 396T422 280Q422 169 343 79T173 -11Q123 -11 82 27T40 150V159Q40 180 48 217T97 414Q147 611 147 623T109 637Q104 637 101 637H96Q86 637 83 637T76 640T73 647ZM336 325V331Q336 405 275 405Q258 405 240 397T207 376T181 352T163 330L157 322L136 236Q114 150 114 114Q114 66 138 42Q154 26 178 26Q211 26 245 58Q270 81 285 114T318 219Q336 291 336 325Z" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><msub><mi>f</mi><mi>b</mi></msub></math></mjx-assistive-mml></mjx-container> के opposite signs होते हैं, <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="0.817ex" height="1.441ex" role="img" focusable="false" viewBox="0 -626 361 637" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>t</mi></math></mjx-assistive-mml></mjx-container> हमेशा <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="4.526ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 2000.7 1000" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="5B" d="M118 -250V750H255V710H158V-210H255V-250H118Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(278,0)"><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(778,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(1222.7,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(1722.7,0)"><path data-c="5D" d="M22 710V750H159V-250H22V-210H119V710H22Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo stretchy="false">[</mo><mn>0</mn><mo>,</mo><mn>1</mn><mo stretchy="false">]</mo></math></mjx-assistive-mml></mjx-container> में आता है। हमने इसे एक साथ चार active 64-cubed chunks पर चलाया और per-frame remesh के साथ animated SDF edits का परीक्षण किया।</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/12-webgpu-marching-cubes/" title="Spike 12 WebGPU Marching Cubes" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/12-webgpu-marching-cubes/" target="_blank">Spike 12 को एक नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=12-webgpu-marching-cubes">Source देखें</a></p>
<p>पहली जीत खुद compute pipeline पर भरोसा थी। एक ही dispatch बिना किसी CPU readback के SDF का मूल्यांकन कर सकता था, cells को classify कर सकता था, और vertices को एक GPU buffer में emit कर सकता था। दूसरी जीत यह पता चलना थी कि &quot;यह काम करता है&quot; कितनी जल्दी artifact hunting में बदल जाता है। गायब triangles शायद ही कभी marching cubes की theory की समस्या होते थे। वे table index के mismatches थे, गलत draw ranges जो active vertex count से आगे पढ़ रहे थे, या chunk boundaries के पास edge-case interactions थे जहां पड़ोसी SDF samples उपलब्ध नहीं थे।</p>
<p>इस spike ने हमें zones में सोचने पर मजबूर किया। Camera के पास, आप volumetric आज़ादी चाहते हैं ताकि players carve कर सकें, खुदाई कर सकें और गुफाएं देख सकें। Camera से दूर, आप clipmap की efficiency चाहते हैं जहां एक flat heightmap सस्ता और पूरी तरह पर्याप्त होता है। यह duality उस architecture की रीढ़ बन गई जिसे हम Spike 13 से आगे लगातार बेहतर करते रहे।</p>
<p>मेरे पसंदीदा debugging पलों में से एक था edits चलते समय wireframe toggle। real time में topology को बनते और घुलते देखना quality के tradeoffs को तुरंत दिखा देता था। आप देख सकते थे कि vertex density कहां काफी ऊंची थी, कहां यह बहुत मोटी हो गई, और ठीक कहां LOD transitions को आगे चलकर cracks से बचने के लिए Transvoxel support की ज़रूरत पड़ेगी।</p>
<p>भाग 8 में हम integration की चुनौती को देखते हैं। raw compute-driven meshes और Three.js scene graph logic को एक स्थिर rendering pipeline में रखना उस isolated demo की तुलना में ज़्यादा मुश्किल था जितना लगा था।</p>
<h2 id="इस-अध्याय-में-बताई-गई-तकनीक" tabindex="-1">इस अध्याय में बताई गई तकनीक <a class="header-anchor" href="#इस-अध्याय-में-बताई-गई-तकनीक" aria-label="Permalink to &quot;इस अध्याय में बताई गई तकनीक&quot;"></a></h2>
<p><strong>Marching cubes.</strong> एक 3D scalar field से triangle mesh निकालने का algorithm (Lorensen और Cline, 1987)। एक नियमित 3D grid में हर cell को उसके 8 corners पर field sample करके classify किया जाता है। sign pattern एक case index (0-255) बनाता है, और एक lookup table हर case को triangles के एक set से जोड़ता है। दो corners के बीच interpolate करके vertices को grid edges पर रखा जाता है। यह algorithm embarrassingly parallel है क्योंकि हर cell स्वतंत्र रूप से process होता है, जो इसे GPU compute के लिए आदर्श बनाता है। हमारी <a href="/hi/guides/landscape-generation-browser.html#signed-distance-fields-sdfs">SDFs और marching cubes पर landscape guide</a> देखें।</p>
<p><strong>Signed Distance Fields (SDFs).</strong> एक volumetric representation जो 3D space में हर बिंदु पर सबसे पास की surface तक की signed distance रखती है। Positive values बाहर हैं, negative अंदर हैं, और zero-crossing surface है। SDFs किसी भी 3D shape को दिखा सकते हैं: गुफाएं, arches, overhangs, और हवा में लटकती geometry जिसे heightmaps नहीं दिखा सकते। Editing field पर natural set algebra है। Material जोड़ना (दो shapes का union) <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="15.06ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 6656.3 1000" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(797.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(1853.6,0)"><path data-c="6D" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(833,0)" style="stroke-width: 3;"/><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(1111,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(3520.6,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(3909.6,0)"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(553,-150) scale(0.707)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(4866.1,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(5310.8,0)"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(553,-150) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(6267.3,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>d</mi><mo>=</mo><mo data-mjx-texclass="OP" movablelimits="true">min</mo><mo stretchy="false">(</mo><msub><mi>d</mi><mn>1</mn></msub><mo>,</mo><msub><mi>d</mi><mn>2</mn></msub><mo stretchy="false">)</mo></math></mjx-assistive-mml></mjx-container> है, हटाना (खुदाई) carve shape को negate करके <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;" xmlns="http://www.w3.org/2000/svg" width="17.259ex" height="2.262ex" role="img" focusable="false" viewBox="0 -750 7628.3 1000" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(797.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(1853.6,0)"><path data-c="6D" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(833,0)" style="stroke-width: 3;"/><path data-c="78" d="M201 0Q189 3 102 3Q26 3 17 0H11V46H25Q48 47 67 52T96 61T121 78T139 96T160 122T180 150L226 210L168 288Q159 301 149 315T133 336T122 351T113 363T107 370T100 376T94 379T88 381T80 383Q74 383 44 385H16V431H23Q59 429 126 429Q219 429 229 431H237V385Q201 381 201 369Q201 367 211 353T239 315T268 274L272 270L297 304Q329 345 329 358Q329 364 327 369T322 376T317 380T310 384L307 385H302V431H309Q324 428 408 428Q487 428 493 431H499V385H492Q443 385 411 368Q394 360 377 341T312 257L296 236L358 151Q424 61 429 57T446 50Q464 46 499 46H516V0H510H502Q494 1 482 1T457 2T432 2T414 3Q403 3 377 3T327 1L304 0H295V46H298Q309 46 320 51T331 63Q331 65 291 120L250 175Q249 174 219 133T185 88Q181 83 181 74Q181 63 188 55T206 46Q208 46 208 23V0H201Z" transform="translate(1333,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(3714.6,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(4103.6,0)"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(553,-150) scale(0.707)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(5060.1,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(5504.8,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(6282.8,0)"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(553,-150) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(7239.3,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>d</mi><mo>=</mo><mo data-mjx-texclass="OP" movablelimits="true">max</mo><mo stretchy="false">(</mo><msub><mi>d</mi><mn>1</mn></msub><mo>,</mo><mo>−</mo><msub><mi>d</mi><mn>2</mn></msub><mo stretchy="false">)</mo></math></mjx-assistive-mml></mjx-container> है, और एक smooth blend एक soft minimum का इस्तेमाल करता है जैसे</p>
<mjx-container tabindex="0" class="MathJax" jax="SVG" display="true" style="direction: ltr; display: block; text-align: center; margin: 1em 0; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -1.577ex;" xmlns="http://www.w3.org/2000/svg" width="64.842ex" height="4.993ex" role="img" focusable="false" viewBox="0 -1509.9 28660.1 2206.9" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" style="stroke-width: 3;"/><path data-c="6D" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(394,0)" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(1227,0)" style="stroke-width: 3;"/><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(1505,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(2061,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(2450,0)"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(553,-150) scale(0.707)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(3406.6,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(3851.2,0)"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(553,-150) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(4807.8,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(5252.4,0)"><path data-c="1D458" d="M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(5773.4,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(6440.2,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(7496,0)"><path data-c="6D" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(833,0)" style="stroke-width: 3;"/><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(1111,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(9163,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(9552,0)"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(553,-150) scale(0.707)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(10508.5,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(10953.2,0)"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(553,-150) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(11909.8,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(12521,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mfrac" transform="translate(13521.2,0)"><g data-mml-node="msup" transform="translate(224.2,676)"><g data-mml-node="mi"><path data-c="210E" d="M137 683Q138 683 209 688T282 694Q294 694 294 685Q294 674 258 534Q220 386 220 383Q220 381 227 388Q288 442 357 442Q411 442 444 415T478 336Q478 285 440 178T402 50Q403 36 407 31T422 26Q450 26 474 56T513 138Q516 149 519 151T535 153Q555 153 555 145Q555 144 551 130Q535 71 500 33Q466 -10 419 -10H414Q367 -10 346 17T325 74Q325 90 361 192T398 345Q398 404 354 404H349Q266 404 205 306L198 293L164 158Q132 28 127 16Q114 -11 83 -11Q69 -11 59 -2T48 16Q48 30 121 320L195 616Q195 629 188 632T149 637H128Q122 643 122 645T124 664Q129 683 137 683Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(609,363) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mrow" transform="translate(220,-686)"><g data-mml-node="mn"><path data-c="34" d="M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(500,0)"><path data-c="1D458" d="M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z" style="stroke-width: 3;"/></g></g><rect width="1221" height="60" x="120" y="220"/></g><g data-mml-node="mo" transform="translate(14982.2,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="mstyle" transform="translate(15260.2,0)"><g data-mml-node="mspace"/></g><g data-mml-node="mi" transform="translate(17426.9,0)"><path data-c="210E" d="M137 683Q138 683 209 688T282 694Q294 694 294 685Q294 674 258 534Q220 386 220 383Q220 381 227 388Q288 442 357 442Q411 442 444 415T478 336Q478 285 440 178T402 50Q403 36 407 31T422 26Q450 26 474 56T513 138Q516 149 519 151T535 153Q555 153 555 145Q555 144 551 130Q535 71 500 33Q466 -10 419 -10H414Q367 -10 346 17T325 74Q325 90 361 192T398 345Q398 404 354 404H349Q266 404 205 306L198 293L164 158Q132 28 127 16Q114 -11 83 -11Q69 -11 59 -2T48 16Q48 30 121 320L195 616Q195 629 188 632T149 637H128Q122 643 122 645T124 664Q129 683 137 683Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(18280.7,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(19336.4,0)"><path data-c="6D" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(833,0)" style="stroke-width: 3;"/><path data-c="78" d="M201 0Q189 3 102 3Q26 3 17 0H11V46H25Q48 47 67 52T96 61T121 78T139 96T160 122T180 150L226 210L168 288Q159 301 149 315T133 336T122 351T113 363T107 370T100 376T94 379T88 381T80 383Q74 383 44 385H16V431H23Q59 429 126 429Q219 429 229 431H237V385Q201 381 201 369Q201 367 211 353T239 315T268 274L272 270L297 304Q329 345 329 358Q329 364 327 369T322 376T317 380T310 384L307 385H302V431H309Q324 428 408 428Q487 428 493 431H499V385H492Q443 385 411 368Q394 360 377 341T312 257L296 236L358 151Q424 61 429 57T446 50Q464 46 499 46H516V0H510H502Q494 1 482 1T457 2T432 2T414 3Q403 3 377 3T327 1L304 0H295V46H298Q309 46 320 51T331 63Q331 65 291 120L250 175Q249 174 219 133T185 88Q181 83 181 74Q181 63 188 55T206 46Q208 46 208 23V0H201Z" transform="translate(1333,0)" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="OPEN" transform="translate(21197.4,0)"><g data-mml-node="mo" transform="translate(0 -0.5)"><path data-c="28" d="M152 251Q152 646 388 850H416Q422 844 422 841Q422 837 403 816T357 753T302 649T255 482T236 250Q236 124 255 19T301 -147T356 -251T403 -315T422 -340Q422 -343 416 -349H388Q359 -325 332 -296T271 -213T212 -97T170 56T152 251Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mi" transform="translate(21655.4,0)"><path data-c="1D458" d="M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(22398.7,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(23398.9,0) translate(0 -0.5)"><path data-c="7C" d="M139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(23676.9,0)"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(553,-150) scale(0.707)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(24855.7,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(25855.9,0)"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(553,-150) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(26812.4,0) translate(0 -0.5)"><path data-c="7C" d="M139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(27090.4,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="mstyle" transform="translate(27368.4,0)"><g data-mml-node="mspace"/></g><g data-mml-node="mn" transform="translate(27702.1,0)"><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" data-mjx-texclass="CLOSE" transform="translate(28202.1,0)"><g data-mml-node="mo" transform="translate(0 -0.5)"><path data-c="29" d="M305 251Q305 -145 69 -349H56Q43 -349 39 -347T35 -338Q37 -333 60 -307T108 -239T160 -136T204 27T221 250T204 473T160 636T108 740T60 807T35 839Q35 850 50 850H56H69Q197 743 256 566Q305 425 305 251Z" style="stroke-width: 3;"/></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="block" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; overflow: hidden; width: 100%;"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mi>smin</mi><mo stretchy="false">(</mo><msub><mi>d</mi><mn>1</mn></msub><mo>,</mo><msub><mi>d</mi><mn>2</mn></msub><mo>,</mo><mi>k</mi><mo stretchy="false">)</mo><mo>=</mo><mo data-mjx-texclass="OP" movablelimits="true">min</mo><mo stretchy="false">(</mo><msub><mi>d</mi><mn>1</mn></msub><mo>,</mo><msub><mi>d</mi><mn>2</mn></msub><mo stretchy="false">)</mo><mo>−</mo><mfrac><msup><mi>h</mi><mn>2</mn></msup><mrow><mn>4</mn><mi>k</mi></mrow></mfrac><mo>,</mo><mstyle scriptlevel="0"><mspace width="2em"/></mstyle><mi>h</mi><mo>=</mo><mo data-mjx-texclass="OP" movablelimits="true">max</mo><mrow data-mjx-texclass="OPEN"><mo minsize="1.2em" maxsize="1.2em">(</mo></mrow><mi>k</mi><mo>−</mo><mo data-mjx-texclass="ORD" stretchy="false">|</mo><msub><mi>d</mi><mn>1</mn></msub><mo>−</mo><msub><mi>d</mi><mn>2</mn></msub><mo data-mjx-texclass="ORD" stretchy="false">|</mo><mo>,</mo><mstyle scriptlevel="0"><mspace width="0.167em"/></mstyle><mn>0</mn><mrow data-mjx-texclass="CLOSE"><mo minsize="1.2em" maxsize="1.2em">)</mo></mrow></math></mjx-assistive-mml></mjx-container><p>जहां <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="1.179ex" height="1.595ex" role="img" focusable="false" viewBox="0 -694 521 705" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D458" d="M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>k</mi></math></mjx-assistive-mml></mjx-container> blend radius को नियंत्रित करता है। जैसे-जैसे <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.05ex;" xmlns="http://www.w3.org/2000/svg" width="5.829ex" height="1.62ex" role="img" focusable="false" viewBox="0 -694 2576.6 716" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D458" d="M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(798.8,0)"><path data-c="2192" d="M56 237T56 250T70 270H835Q719 357 692 493Q692 494 692 496T691 499Q691 511 708 511H711Q720 511 723 510T729 506T732 497T735 481T743 456Q765 389 816 336T935 261Q944 258 944 250Q944 244 939 241T915 231T877 212Q836 186 806 152T761 85T740 35T732 4Q730 -6 727 -8T711 -11Q691 -11 691 0Q691 7 696 25Q728 151 835 230H70Q56 237 56 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(2076.6,0)"><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>k</mi><mo accent="false" stretchy="false">→</mo><mn>0</mn></math></mjx-assistive-mml></mjx-container> होता है, यह वापस एक hard <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="3.771ex" height="1.514ex" role="img" focusable="false" viewBox="0 -669 1667 669" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo"><path data-c="6D" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(833,0)" style="stroke-width: 3;"/><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(1111,0)" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo data-mjx-texclass="OP" movablelimits="true">min</mo></math></mjx-assistive-mml></mjx-container> में सिमट जाता है। <a href="/hi/guides/landscape-generation-browser.html#signed-distance-fields-sdfs">SDF terrain representation</a> देखें।</p>
<p><strong>WebGPU compute shaders.</strong> GPU programs जो general-purpose computation चलाते हैं, rasterization pipeline से बंधे नहीं होते। एक compute shader threads के workgroups dispatch करता है जो parallel में execute होते हैं। Marching cubes के लिए, हर thread एक grid cell process करता है: SDF sample करना, cell classify करना, triangulation देखना, edge vertices interpolate करना, और atomic counters का इस्तेमाल करके एक mesh buffer में append करना। किसी CPU readback की ज़रूरत नहीं होती क्योंकि output buffer सीधे rendering के लिए vertex data के रूप में इस्तेमाल होता है। Will Usher का <a href="https://www.willusher.io/webgpu-marching-cubes/" target="_blank" rel="noreferrer">webgpu-marching-cubes</a> browser में real-time 256^3 grid processing दिखाता है। हमारी <a href="/hi/guides/landscape-generation-browser.html#gpu-driven-lod-with-webgpu">WebGPU-driven LOD पर landscape guide</a> देखें।</p>
<p><strong>Hybrid heightmap + SDF architecture.</strong> Browser terrain के लिए व्यावहारिक तरीका: heightmaps पूरी दुनिया को ढकते हैं (सस्ते, compact), जबकि SDF volumes सिर्फ उन chunks में मौजूद होते हैं जिन्हें गुफाओं, overhangs, या creator-carved features की ज़रूरत होती है (5-10% chunks)। Camera के पास, volumetric आज़ादी carving और गुफाओं की अनुमति देती है। दूर, heightmaps efficient flat terrain देते हैं। <a href="/hi/guides/landscape-generation-browser.html#hybrid-heightmap-base--volumetric-overlays">hybrid terrain representation</a> देखें।</p>
<hr>
<p>भाग 7, कुल 12 में से।<br>
पिछला: <a href="/hi/blog/2026-02-25-open-world-browser-part-06-clipmaps.html">भाग 6 - Clipmaps ने कहानी बदल दी</a><br>
अगला: <a href="/hi/blog/2026-02-25-open-world-browser-part-08-webgpu-integration.html">भाग 8 - अपना baseline खोए बिना integration</a><br>
Series guide: <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">/hi/blog/2026-02-25-open-world-browser-series-guide</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Browser में open world बनाना, भाग 8: अपनी baseline खोए बिना integration]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-02-25-open-world-browser-part-08-webgpu-integration</link>
            <guid>https://app.cinevva.com/hi/blog/2026-02-25-open-world-browser-part-08-webgpu-integration</guid>
            <pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Spikes 13 और 14 features से ज़्यादा process discipline के बारे में थे। हमने एक साफ baseline को freeze किया, फिर एक बार में एक layer को मज़बूत किया।]]></description>
            <content:encoded><![CDATA[<h1 id="browser-में-open-world-बनाना-भाग-8-अपनी-baseline-खोए-बिना-integration" tabindex="-1">Browser में open world बनाना, भाग 8: अपनी baseline खोए बिना integration <a class="header-anchor" href="#browser-में-open-world-बनाना-भाग-8-अपनी-baseline-खोए-बिना-integration" aria-label="Permalink to &quot;Browser में open world बनाना, भाग 8: अपनी baseline खोए बिना integration&quot;"></a></h1>
<p><em>लेखक <a href="/hi/about.html">Oleg Sidorkin</a>, Cinevva के CTO और सह-संस्थापक</em></p>
<p>यहां नए हैं? <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">series guide</a> का इस्तेमाल करें। यह बताती है कि spike क्या होता है और सभी भागों को जोड़ती है।</p>
<p>Integration वही जगह है जहां projects उलझ जाते हैं। आपके पास अलग-अलग चलते हुए हिस्से होते हैं। आप उन्हें जोड़ते हैं और अचानक हर bug ऐसा लगता है जैसे वह कहीं भी हो सकता है।</p>
<p>Spikes 13 और 14 इसी जाल का हमारा जवाब थे। Spike 13 ने एक साफ Three.js WebGPU baseline तैयार की। बस एक renderer, एक scene, एक camera, और एक सरल mesh। न terrain, न compute, न effects। हमने पक्का किया कि Three.js का WebGPU backend सही तरह से initialize हुआ, कि render loop स्थिर था, और कि TSL (Three.js Shading Language) node materials उम्मीद के मुताबिक काम कर रहे थे। यह checkpoint पास होने के बाद ही हमने layers जोड़ना शुरू किया।</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/13-threejs-webgpu/" title="Spike 13 Three.js WebGPU Baseline" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/13-threejs-webgpu/" target="_blank">Spike 13 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=13-threejs-webgpu">Source देखें</a></p>
<p>Spike 14 क्रमिक रूप से मज़बूत करने का काम था। हमने एक बार में एक क्षमता जोड़ी: पहले camera controls, फिर lighting, फिर marching cubes pipeline से आया compute-generated mesh, फिर buffer plumbing ताकि GPU output सीधे Three.js geometry attributes में जाए। हर जोड़ के बाद हमने पक्का किया कि पिछली layer अब भी सही तरह से काम कर रही है।</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/14-threejs-webgpu-incremental/" title="Spike 14 Incremental Hardening" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/14-threejs-webgpu-incremental/" target="_blank">Spike 14 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=14-threejs-webgpu-incremental">Source देखें</a></p>
<p>यह सुनने में धीमा लगता है। यह ठीक एक दिन के लिए धीमा था, और इसने हमें थोड़ी देर बाद कई दिन बचाए जब seam logic और policy switching जटिल हो गए।</p>
<p>जिस खास तरह के bug ने इस discipline को सही ठहराया वह था hairline artifacts। पतली-पतली परतें जो geometry corruption जैसी दिखती थीं पर असल में पुराना data थीं। Compute shader एक buffer में N vertices लिखता, लेकिन draw call अब भी पिछले frame के N+M vertices render करने के लिए सेट रहता। वे अतिरिक्त vertices पुराने dispatch का कूड़ा रखते थे। दिखने में नतीजा था झिलमिलाते रेज़र-पतले triangles जो बेतरतीब ढंग से आते और गायब होते थे।</p>
<p>इस तरह के bug को आप intuition से नहीं हराते। आप इसे controlled deltas से हराते हैं जहां आपको ठीक-ठीक पता होता है कि आखिरी चलते हुए state और मौजूदा टूटे हुए state के बीच क्या बदला।</p>
<p>WebGPU integration ने हमें buffer lifecycle के बारे में भी सिखाया। WebGPU में GPU buffers एक बार किसी खास usage के लिए map हो जाने पर immutable होते हैं। अगर marching cubes output बढ़ने की वजह से आपको vertex buffer का आकार बदलना हो, तो आपको एक नया buffer बनाना होता है और binding को update करना होता है। यहां कोई <code>realloc</code> नहीं है। उस lifecycle को सही करना, यानी in-flight GPU काम से टकराए बिना पुराने buffers को नष्ट करना, ऐसे explicit fence management की मांग करता था जो WebGL में मौजूद नहीं है।</p>
<p>भाग 9 में हम Transvoxel seam के काम में उतरते हैं। वह chapter जानबूझकर एक scaffold से शुरू होता है। इस मुकाम तक आते-आते हमने यह सबक पूरी तरह अपना लिया था कि integration में जल्दबाज़ी रहस्य पैदा करती है, और सोच-समझकर किया गया setup ऐसे problems पैदा करता है जिन्हें debug किया जा सके।</p>
<h2 id="इस-chapter-में-बताई-गई-technology" tabindex="-1">इस chapter में बताई गई technology <a class="header-anchor" href="#इस-chapter-में-बताई-गई-technology" aria-label="Permalink to &quot;इस chapter में बताई गई technology&quot;"></a></h2>
<p><strong>WebGPU.</strong> WebGL का उत्तराधिकारी, जो browser में compute shaders और indirect rendering के साथ low-level GPU access देता है। Open worlds के लिए WebGPU की दो अहम खूबियां: compute shaders GPU की तरफ terrain generation, foliage placement, और culling को मुमकिन बनाते हैं; indirect rendering GPU को compute output के आधार पर तय करने देता है कि क्या draw करना है, जिससे घने scenes में CPU की अड़चनें खत्म हो जाती हैं। Desktop पर Chrome, Edge, और Firefox में उपलब्ध है। देखें <a href="/hi/guides/browser-3d-open-world-tech.html#webgpu-the-performance-unlock">WebGPU performance की बढ़त के तौर पर</a>।</p>
<p><strong>Three.js Shading Language (TSL).</strong> Three.js का node-आधारित shader system जो कच्चे GLSL/WGSL की जगह composable JavaScript expressions लाता है। <code>texture()</code>, <code>positionWorld</code>, <code>smoothstep()</code>, और <code>fog()</code> जैसे TSL nodes runtime पर एक shader graph बनाते हैं जो उपयुक्त backend (WebGL GLSL या WebGPU WGSL) में compile होता है। TSL की वजह से material logic एक बार लिखकर दोनों renderers के लिए चलाना मुमकिन है। Node graph हर frame पर evaluate होता है, इसलिए dynamic uniforms और conditional branching सहज रूप से काम करते हैं।</p>
<p><strong>WebGPU में GPU buffer lifecycle.</strong> WebGPU buffers खास usage flags (<code>VERTEX</code>, <code>STORAGE</code>, <code>COPY_DST</code>, आदि) के साथ बनते हैं और बनने के बाद इनका आकार नहीं बदला जा सकता। अगर कोई marching cubes dispatch buffer की क्षमता से ज़्यादा vertices पैदा करता है, तो आपको एक नया buffer बनाना होगा, binding update करना होगा, और पुराने को नष्ट करना होगा। ऐसा buffer नष्ट करना जिसका अब भी किसी in-flight GPU command में reference है, errors पैदा करता है। Explicit fence management (<code>device.queue.onSubmittedWorkDone()</code> के ज़रिए) यह पक्का करता है कि पुराना buffer तब तक नष्ट न हो जब तक GPU उसका इस्तेमाल पूरा न कर ले। यह lifecycle discipline WebGL में मौजूद नहीं है, जहां driver memory को अपने आप संभालता है।</p>
<p><strong>Incremental hardening.</strong> Integration के लिए एक process discipline: एक known-good baseline तैयार करो, एक बार में एक क्षमता जोड़ो, और हर जोड़ के बाद पक्का करो कि पिछली layer अब भी काम कर रही है। यह तरीका एक दिन के लिए धीमा होता है और बाद की debugging में कई दिन बचाता है क्योंकि हर regression को एक खास, controlled बदलाव तक ढूंढा जा सकता है। यह baseline-फिर-increment pattern <a href="/hi/guides/browser-3d-open-world-tech.html#what-we-d-build-first">AAA open world development</a> में आम है जहां risk संभालने के लिए systems को एक खास क्रम में integrate किया जाता है।</p>
<hr>
<p>12 में से भाग 8।<br>
पिछला: <a href="/hi/blog/2026-02-25-open-world-browser-part-07-marching-cubes.html">भाग 7 - Marching cubes और पहली असली caves</a><br>
अगला: <a href="/hi/blog/2026-02-25-open-world-browser-part-09-transvoxel-first-cut.html">भाग 9 - Transvoxel एक scaffold से शुरू हुआ</a><br>
Series guide: <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">/hi/blog/2026-02-25-open-world-browser-series-guide</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Browser में open world बनाना, भाग 9: Transvoxel एक scaffold से शुरू हुआ]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-02-25-open-world-browser-part-09-transvoxel-first-cut</link>
            <guid>https://app.cinevva.com/hi/blog/2026-02-25-open-world-browser-part-09-transvoxel-first-cut</guid>
            <pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[हमने सीधे पूरे seam coverage में छलांग नहीं लगाई। पहले हमने एक seam test rig बनाया, फिर reference data से एक face को validate किया।]]></description>
            <content:encoded><![CDATA[<h1 id="browser-में-open-world-बनाना-भाग-9-transvoxel-एक-scaffold-से-शुरू-हुआ" tabindex="-1">Browser में open world बनाना, भाग 9: Transvoxel एक scaffold से शुरू हुआ <a class="header-anchor" href="#browser-में-open-world-बनाना-भाग-9-transvoxel-एक-scaffold-से-शुरू-हुआ" aria-label="Permalink to &quot;Browser में open world बनाना, भाग 9: Transvoxel एक scaffold से शुरू हुआ&quot;"></a></h1>
<p><em>लेखक <a href="/hi/about.html">Oleg Sidorkin</a>, Cinevva के CTO और सह-संस्थापक</em></p>
<p>यहां नए हैं? <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">series guide</a> का इस्तेमाल करें। यह बताती है कि spike क्या होता है और सभी भागों को जोड़ती है।</p>
<p>Seams वही जगह हैं जहां आपका भरोसा दम तोड़ देता है।</p>
<p>जब तक दो resolutions नहीं मिलतीं, तब तक सब कुछ स्थिर दिख सकता है। LOD 0 का एक chunk LOD 1 के chunk के बगल में बैठता है। उनके meshes अलग-अलग generate होते हैं। जहां वे एक boundary साझा करते हैं, वहां vertex positions मेल नहीं खातीं क्योंकि कम-resolution वाले chunk में grid density आधी होती है। इसका नतीजा होता है दिखने वाली दरारें, T-junctions, और झिलमिलाते किनारे।</p>
<p>Transvoxel algorithm इसे दो अलग resolutions वाले chunks के बीच की boundary face पर खास transition cells generate करके हल करता है। ये cells high-res और low-res दोनों grids से एक साथ sample लेती हैं और ऐसे triangles बनाती हैं जो दोनों surfaces को आपस में जोड़ देते हैं। यह algorithm अपनी ही lookup tables इस्तेमाल करता है, जो सामान्य marching cubes tables से अलग होती हैं, और इसमें 512 transition cell cases होते हैं।</p>
<p>इस मुकाम तक हमारे पास इतने integration के घाव थे कि हम implementation में जल्दबाजी न करने की समझ रखते थे।</p>
<p>Spike 15 का एक ही काम था: पूरे algorithm को छूने से पहले एक ऐसा seam test rig बनाना जिस पर हम भरोसा कर सकें। हमने एक नियंत्रित माहौल तैयार किया जहां ज्ञात SDF data के दो chunks अलग-अलग resolutions पर अगल-बगल बैठे थे, और main mesh, seam mesh, wireframe, और normals को अलग-अलग toggle करने के लिए visualization controls थे।</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/15-transvoxel-seam/" title="Spike 15 Transvoxel Seam Scaffold" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/15-transvoxel-seam/" target="_blank">Spike 15 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=15-transvoxel-seam">Source देखें</a></p>
<p>जब test rig स्थिर हो गया, तो Spike 16 ने एक ही face पर table-driven transition cell generation को validate किया। हमने एक axis-aligned face चुनी (+X boundary), सिर्फ़ उसी face के लिए transition cell evaluation को implement किया, और output की तुलना Transvoxel paper के reference data से की।</p>
<p><a href="/spikes/16-transvoxel-face/" target="_blank">Spike 16 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=16-transvoxel-face">Source देखें</a></p>
<p>हमने जानबूझकर एक बार में एक ही face टेस्ट की, क्योंकि transition table की wiring में कई स्वतंत्र failure modes होते हैं। Case index की गणना दोनों grids से सही vertices sample करने पर निर्भर करती है। एक transition cell के अंदर vertex indexing सामान्य marching cubes cells से अलग numbering scheme इस्तेमाल करती है। Winding order को main mesh के साथ एक जैसा रखना पड़ता है वरना backface culling आपके seam triangles को खा जाएगा। अगर आप एक साथ छहों faces टेस्ट करें, तो हर लक्षण random लगता है। अगर आप एक face को अच्छी तरह टेस्ट करें, तो आपको सार्थक और debug करने लायक failures मिलते हैं।</p>
<p>इस चरण की एक और सूक्ष्म जीत थी tooling में निवेश। हमने visibility toggles, seam-only rendering, और color-coded LOD indicators पहले ही बना लिए थे। उस समय ये controls फालतू बोझ जैसे लगते थे। बाद में, जब corner cases बिगड़े, तो इन्होंने बार-बार अपनी कीमत वसूल कर दी क्योंकि हम ठीक-ठीक अलग कर सकते थे कि कौन-सी seam cells गड़बड़ कर रही थीं।</p>
<p>इस अध्याय के अंत तक हम &quot;seams से निपट चुके&quot; नहीं थे। हम ऐसी स्थिति में थे जहां seam bugs से डरने के बजाय उन पर तर्क किया जा सकता था।</p>
<p>भाग 10 में असली roller coaster शुरू होती है। Mixed LOD corners, winding flips, partial overdraw ghosts, और वे पल जहां आप पक्का मान बैठते हैं कि algorithm गलत है और फिर पता चलता है कि bug दरअसल एक draw range है जो active vertex count से आगे पढ़ रहा था।</p>
<h2 id="इस-अध्याय-में-जिस-technology-का-ज़िक्र-हुआ" tabindex="-1">इस अध्याय में जिस technology का ज़िक्र हुआ <a class="header-anchor" href="#इस-अध्याय-में-जिस-technology-का-ज़िक्र-हुआ" aria-label="Permalink to &quot;इस अध्याय में जिस technology का ज़िक्र हुआ&quot;"></a></h2>
<p><strong>The Transvoxel algorithm.</strong> Eric Lengyel द्वारा डिज़ाइन किया गया (<a href="https://transvoxel.org/" target="_blank" rel="noreferrer">transvoxel.org</a>), Transvoxel volumetric terrain LOD की सबसे कठिन समस्या को हल करता है: अलग-अलग resolutions वाले chunks के बीच seams। जब एक high-res chunk एक low-res chunk के बगल में बैठता है, तो marching cubes meshes boundary पर align नहीं होते, जिससे दिखने वाली दरारें बनती हैं। Transvoxel boundary faces पर खास transition cells डालता है जो resolution के अंतर को अतिरिक्त triangles से पाटते हैं, जो दोनों तरफ़ से मेल खाते हैं। यह algorithm अपनी ही lookup tables इस्तेमाल करता है (सामान्य marching cubes से अलग) जिनमें 512 transition cell cases होते हैं, जो 73 equivalence classes में सिमट जाते हैं। यह patent-free है और इसका इस्तेमाल रिलीज़ हुई games में हुआ है (Space Engineers, Astroneer)। हमारी <a href="/hi/guides/landscape-generation-browser.html#the-transvoxel-algorithm">Transvoxel पर landscape guide</a> देखें।</p>
<p><strong>Transition cells.</strong> दो LOD levels के बीच की face पर generate होने वाली खास cells। सामान्य marching cubes cells के उलट, जो एक grid से 8 corners sample करती हैं, transition cells high-res और low-res दोनों grids से एक साथ sample लेती हैं। High-res face में <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.186ex;" xmlns="http://www.w3.org/2000/svg" width="9.176ex" height="1.692ex" role="img" focusable="false" viewBox="0 -666 4056 748" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mn"><path data-c="33" d="M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(722.2,0)"><path data-c="D7" d="M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(1722.4,0)"><path data-c="33" d="M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(2500.2,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(3556,0)"><path data-c="39" d="M352 287Q304 211 232 211Q154 211 104 270T44 396Q42 412 42 436V444Q42 537 111 606Q171 666 243 666Q245 666 249 666T257 665H261Q273 665 286 663T323 651T370 619T413 560Q456 472 456 334Q456 194 396 97Q361 41 312 10T208 -22Q147 -22 108 7T68 93T121 149Q143 149 158 135T173 96Q173 78 164 65T148 49T135 44L131 43Q131 41 138 37T164 27T206 22H212Q272 22 313 86Q352 142 352 280V287ZM244 248Q292 248 321 297T351 430Q351 508 343 542Q341 552 337 562T323 588T293 615T246 625Q208 625 181 598Q160 576 154 546T147 441Q147 358 152 329T172 282Q197 248 244 248Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>3</mn><mo>×</mo><mn>3</mn><mo>=</mo><mn>9</mn></math></mjx-assistive-mml></mjx-container> sample points होते हैं, जबकि low-res face में <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.186ex;" xmlns="http://www.w3.org/2000/svg" width="9.176ex" height="1.717ex" role="img" focusable="false" viewBox="0 -677 4056 759" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mn"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(722.2,0)"><path data-c="D7" d="M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(1722.4,0)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(2500.2,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(3556,0)"><path data-c="34" d="M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>2</mn><mo>×</mo><mn>2</mn><mo>=</mo><mn>4</mn></math></mjx-assistive-mml></mjx-container>। यही 9 samples algorithm को इसके <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.186ex;" xmlns="http://www.w3.org/2000/svg" width="8.53ex" height="2.072ex" role="img" focusable="false" viewBox="0 -833.9 3770.1 915.9" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msup"><g data-mml-node="mn"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(533,363) scale(0.707)"><path data-c="39" d="M352 287Q304 211 232 211Q154 211 104 270T44 396Q42 412 42 436V444Q42 537 111 606Q171 666 243 666Q245 666 249 666T257 665H261Q273 665 286 663T323 651T370 619T413 560Q456 472 456 334Q456 194 396 97Q361 41 312 10T208 -22Q147 -22 108 7T68 93T121 149Q143 149 158 135T173 96Q173 78 164 65T148 49T135 44L131 43Q131 41 138 37T164 27T206 22H212Q272 22 313 86Q352 142 352 280V287ZM244 248Q292 248 321 297T351 430Q351 508 343 542Q341 552 337 562T323 588T293 615T246 625Q208 625 181 598Q160 576 154 546T147 441Q147 358 152 329T172 282Q197 248 244 248Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(1214.3,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(2270.1,0)"><path data-c="35" d="M164 157Q164 133 148 117T109 101H102Q148 22 224 22Q294 22 326 82Q345 115 345 210Q345 313 318 349Q292 382 260 382H254Q176 382 136 314Q132 307 129 306T114 304Q97 304 95 310Q93 314 93 485V614Q93 664 98 664Q100 666 102 666Q103 666 123 658T178 642T253 634Q324 634 389 662Q397 666 402 666Q410 666 410 648V635Q328 538 205 538Q174 538 149 544L139 546V374Q158 388 169 396T205 412T256 420Q337 420 393 355T449 201Q449 109 385 44T229 -22Q148 -22 99 32T50 154Q50 178 61 192T84 210T107 214Q132 214 148 197T164 157Z" style="stroke-width: 3;"/><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" transform="translate(500,0)" style="stroke-width: 3;"/><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" transform="translate(1000,0)" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><msup><mn>2</mn><mn>9</mn></msup><mo>=</mo><mn>512</mn></math></mjx-assistive-mml></mjx-container> raw cases देते हैं, जो rotations और reflections को मोड़ देने पर 73 अलग triangulations में सिमट जाते हैं। Cell classification और triangulation समर्पित tables इस्तेमाल करती हैं जो दोनों resolutions के vertices को जोड़ने वाले triangles बनाती हैं। Vertex numbering scheme सामान्य MC cells से अलग है, जो implementation bugs का एक आम स्रोत है।</p>
<p><strong>LOD transition seams.</strong> दो mesh resolutions के बीच की boundary जहां topology mismatch visual artifacts पैदा करता है। बिना stitching के, एक LOD 0 chunk (1m grid) एक LOD 1 chunk (2m grid) के बगल में T-junctions पैदा करता है: fine mesh में boundary पर ऐसे vertices होते हैं जिन्हें coarse mesh साझा नहीं करता, जिससे दरारें बनती हैं जहां से रोशनी छनकर आती है। Transvoxel, geomorphing, और skirt geometry इन seams को ठीक करने के तीन तरीके हैं। Volumetric terrain के लिए Transvoxel मानक समाधान है क्योंकि geomorphing सिर्फ़ heightmaps के लिए काम करता है। <a href="/hi/guides/landscape-generation-browser.html#lod-for-volumetric-terrain">Volumetric terrain के लिए LOD</a> देखें।</p>
<hr>
<p>भाग 9, कुल 12 में से।<br>
पिछला: <a href="/hi/blog/2026-02-25-open-world-browser-part-08-webgpu-integration.html">भाग 8 - अपनी baseline खोए बिना integration</a><br>
अगला: <a href="/hi/blog/2026-02-25-open-world-browser-part-10-seam-chaos.html">भाग 10 - Seam अफरातफरी और corner की boss fight</a><br>
Series guide: <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">/hi/blog/2026-02-25-open-world-browser-series-guide</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ब्राउज़र में एक open world बनाना, भाग 10: Seam का अफरा-तफरी और corner वाली boss fight]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-02-25-open-world-browser-part-10-seam-chaos</link>
            <guid>https://app.cinevva.com/hi/blog/2026-02-25-open-world-browser-part-10-seam-chaos</guid>
            <pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Spikes 17 से 22 वह जगह थी जहाँ theory की मुलाकात edge cases से हुई। हमने winding bugs, गायब triangles, overdraw ghosts, और hybrid fallback logic का पीछा किया।]]></description>
            <content:encoded><![CDATA[<h1 id="ब्राउज़र-में-एक-open-world-बनाना-भाग-10-seam-का-अफरा-तफरी-और-corner-वाली-boss-fight" tabindex="-1">ब्राउज़र में एक open world बनाना, भाग 10: Seam का अफरा-तफरी और corner वाली boss fight <a class="header-anchor" href="#ब्राउज़र-में-एक-open-world-बनाना-भाग-10-seam-का-अफरा-तफरी-और-corner-वाली-boss-fight" aria-label="Permalink to &quot;ब्राउज़र में एक open world बनाना, भाग 10: Seam का अफरा-तफरी और corner वाली boss fight&quot;"></a></h1>
<p><em>लिखा है <a href="/hi/about.html">Oleg Sidorkin</a> ने, जो Cinevva के CTO और Co-Founder हैं</em></p>
<p>यहाँ पहली बार आए हैं? <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">series guide</a> देखें। यह समझाता है कि spike क्या होता है और सभी भागों को link करता है।</p>
<p>अगर पहले के भाग व्यवस्थित से लगते थे, तो यह अध्याय combat जैसा लगा।</p>
<p>Spikes 17 से 22 हमारा corner-case वाला दौर था। Dual-LOD marching cubes, heightmap-to-MC boundary seams, mixed-resolution corner chunks जहाँ तीन या चार LOD levels मिलते हैं, GPU seam generation, और fallback mode का व्यवहार। हर spike किसी एक खास failure scenario को संभालता था जिससे हम टकरा चुके थे या जिसका हमें अंदेशा था।</p>
<p>Spike 17 ने dual marching cubes को दो LOD levels एक साथ active रखकर test किया। चुनौती यह थी कि एक ही chunk के neighbors अलग-अलग faces पर अलग-अलग resolutions पर हो सकते थे। Spike 16 का transition cell logic एक समय में एक face के लिए काम करता था, लेकिन जब एक chunk को कई faces पर transition cells चाहिए होती थीं, तो vertex buffer का प्रबंधन उलझ जाता था। हर face की transition cells को इस तरह generate और append करना पड़ता था कि बाकी की पर असर न पड़े।</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/19-transvoxel-corner-grid/" title="Spike 19 Corner Grid Transvoxel" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/19-transvoxel-corner-grid/" target="_blank">Spike 19 को नई tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=19-transvoxel-corner-grid">Source देखें</a></p>
<p>पहला बार-बार आने वाला खलनायक था winding order। कई बार हमें लगा कि हमारे पास topology की समस्याएँ हैं, फिर पता चला कि वे orientation की समस्याएँ थीं। Backface culling valid seam triangles को खा रहा था क्योंकि winding main mesh के मुकाबले उल्टा हो गया था। एक ही असली वजह, पर camera angle के हिसाब से अलग-अलग दिखने वाला लक्षण। हल यह था कि transition cell emission code में एक तय winding convention लागू की जाए और उसे double-sided material toggle से verify किया जाए।</p>
<p>दूसरा खलनायक था आंशिक सहीपन से पैदा हुआ झूठा भरोसा। एक seam किसी एक camera angle से perfect दिख सकता था और तब टूट जाता था जब LOD roles higher और lower resolution वाले chunks के बीच आपस में बदल जाते थे। Transition cell asymmetric होती है। यह high-res side और low-res side से अलग-अलग तरीके से sample लेती है। अगर किसी एक configuration के लिए &quot;कौन सा side high-res है&quot; वाला logic उल्टा हो जाए, तो आपको bug सिर्फ तभी दिखता है जब camera किसी खास position पर जाता है।</p>
<p>फिर आया हमारी सबसे पसंदीदा recoveries में से एक। हम heightmap tiles पर एक seam cutoff artifact का पीछा कर रहे थे और इल्ज़ाम transition logic पर लगा रहे थे। इस पर दो दिन फूँक दिए। असली दोषी था stale overdraw। पिछले frame की higher-resolution geometry अब भी buffer tail में जीवित थी, उस chunk के lower LOD पर downscale हो जाने के बाद भी। Draw range अब भी पुराने, बड़े vertex count पर सेट था। जैसे ही हमने draw range को compute shader के atomic counter से रिपोर्ट किए गए active vertex count तक clip किया, वह &quot;रहस्यमयी seam issue&quot; गायब हो गया।</p>
<p>यह एक बढ़िया याद दिलाने वाली बात थी कि rendering bugs अक्सर meshing bugs का भेस धर लेते हैं। Geometry पूरे समय सही थी। Draw call बस valid data के अंत के पार पढ़ रहा था।</p>
<p>Spike 22 तक हम hybrid fallback test कर रहे थे, जहाँ chunks खास परिस्थितियों में marching cubes से heightmap mode में switch हो सकते थे, जैसे जब chunk में कोई volumetric edits न हों और वह camera से काफ़ी दूर बैठा हो। इससे हमें एक all-or-nothing policy के मुकाबले ज़्यादा व्यावहारिक रास्ता मिला। पास के edited chunks volumetric आज़ादी के लिए MC इस्तेमाल करते हैं। दूर के unedited chunks efficiency के लिए heightmaps इस्तेमाल करते हैं।</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/22-gpu-mc-heightmap-fallback/" title="Spike 22 MC Heightmap Fallback" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/22-gpu-mc-heightmap-fallback/" target="_blank">Spike 22 को नई tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=22-gpu-mc-heightmap-fallback">Source देखें</a></p>
<p>यह अध्याय roller coaster की वह तीखी ढलान था। निराश करने वाला और productive, दोनों एक साथ। अलग-अलग fixes में से कई छोटे थे, कभी-कभी एक ही line जो किसी comparison operator या offset को बदल देती थी। लेकिन उन fixes से जो समझ बनी कि LOD transitions, buffer management, और draw ranges आपस में कैसे interact करते हैं, वह बिलकुल छोटी नहीं थी।</p>
<p>भाग 11 में हम उस stabilization layer को देखते हैं जो इस अफरा-तफरी के बाद आई: policy-based chunk modes और reactive bug-fixing से explicit system rules की ओर बदलाव।</p>
<h2 id="इस-अध्याय-में-जिस-technology-का-ज़िक्र-हुआ" tabindex="-1">इस अध्याय में जिस technology का ज़िक्र हुआ <a class="header-anchor" href="#इस-अध्याय-में-जिस-technology-का-ज़िक्र-हुआ" aria-label="Permalink to &quot;इस अध्याय में जिस technology का ज़िक्र हुआ&quot;"></a></h2>
<p><strong>Dual-LOD marching cubes.</strong> Marching cubes को दो resolution levels पर एक साथ चलाना, जहाँ transition cells boundary को सिल देती हैं। चुनौती यह है कि एक ही chunk के neighbors अलग-अलग faces पर अलग-अलग resolutions पर हो सकते हैं, जिसके लिए हर face के लिए अलग transition cell generation चाहिए। हर face की transition cells vertex buffer में इस तरह append होती हैं कि बाकी की पर असर न पड़े। Atomic counters सभी faces में मिलाकर कुल active vertex count track करते हैं।</p>
<p><strong>Winding order.</strong> हर triangle के अंदर vertex का क्रम तय करता है कि कौन सा side &quot;front&quot; face है। Backface culling के लिए एक तय winding (आमतौर पर बाहर से देखने पर counter-clockwise) ज़रूरी है। जब transition cells triangles emit करती हैं, तो winding को main mesh की convention से मेल खाना चाहिए। इसे उल्टा कर देने पर backface culling valid seam triangles को खा जाता है, जो कुछ camera angles से गायब surfaces जैसा दिखता है। एक आम debugging तकनीक है material पर <code>side: THREE.DoubleSide</code> को toggle करना, ताकि यह पुष्टि हो सके कि artifacts winding की समस्याएँ हैं या असली topology gaps।</p>
<p><strong>Heightmap-to-MC fallback.</strong> एक hybrid chunk mode जहाँ दूर या unedited chunks heightmap terrain (सस्ता, सपाट surface) इस्तेमाल करते हैं जबकि पास के या edited chunks marching cubes (volumetric, caves को support करता है) इस्तेमाल करते हैं। Fallback का फ़ैसला camera से दूरी पर और इस पर निर्भर करता है कि chunk में SDF edits हैं या नहीं। एक heightmap chunk और एक MC chunk के बीच के seam को अपनी खुद की transition geometry चाहिए, Transvoxel जैसी ही, पर दो अलग representations को जोड़ती हुई न कि दो LOD levels को। देखें <a href="/hi/guides/landscape-generation-browser.html#hybrid-heightmap-base--volumetric-overlays">hybrid heightmap + volumetric overlays</a>।</p>
<p><strong>Draw range और atomic counters.</strong> GPU-driven mesh generation में, compute shader vertices को एक buffer में लिखता है और एक atomic counter बढ़ाता है ताकि track हो सके कि कितने vertices emit हुए। Draw call को इस counter को vertex count के तौर पर इस्तेमाल करना चाहिए, buffer capacity को नहीं। अगर draw range active count तक clip नहीं हुआ, तो पिछले frames के stale vertices (जो अब भी buffer tail में जीवित हैं) ghost geometry पैदा करते हैं: पतले sliver और झिलमिलाते triangles जो topology errors जैसे दिखते हैं पर असल में valid data के पार पढ़ने से बने rendering artifacts होते हैं।</p>
<hr>
<p>12 में से भाग 10।<br>
पिछला: <a href="/hi/blog/2026-02-25-open-world-browser-part-09-transvoxel-first-cut.html">भाग 9 - Transvoxel की शुरुआत एक scaffold से हुई</a><br>
अगला: <a href="/hi/blog/2026-02-25-open-world-browser-part-11-policy-modes.html">भाग 11 - Policy mode, hardcoded mode नहीं</a><br>
Series guide: <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">/hi/blog/2026-02-25-open-world-browser-series-guide</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Browser में open world बनाना, भाग 11: Policy mode, hardcoded mode नहीं]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-02-25-open-world-browser-part-11-policy-modes</link>
            <guid>https://app.cinevva.com/hi/blog/2026-02-25-open-world-browser-part-11-policy-modes</guid>
            <pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Spike 23 ने हमें reactive fixes से हटाकर explicit policy की ओर शिफ्ट किया। Distance-driven LOD, edit-driven HM/MC switching, और बेहतर seam debugging controls।]]></description>
            <content:encoded><![CDATA[<h1 id="browser-में-open-world-बनाना-भाग-11-policy-mode-hardcoded-mode-नहीं" tabindex="-1">Browser में open world बनाना, भाग 11: Policy mode, hardcoded mode नहीं <a class="header-anchor" href="#browser-में-open-world-बनाना-भाग-11-policy-mode-hardcoded-mode-नहीं" aria-label="Permalink to &quot;Browser में open world बनाना, भाग 11: Policy mode, hardcoded mode नहीं&quot;"></a></h1>
<p><em>लेखक <a href="/hi/about.html">Oleg Sidorkin</a>, Cinevva के CTO और सह-संस्थापक</em></p>
<p>यहां नए हैं? <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">series guide</a> का इस्तेमाल करें। यह बताती है कि spike क्या होता है और सभी भागों को जोड़ती है।</p>
<p>Seam की उथल-पुथल वाले भाग के बाद, हमें reacting बंद करके governing शुरू करनी थी।</p>
<p>Spike 23 ने ad-hoc behavior की जगह explicit policy rules रख दिए। Chunks अपने local state के मुताबिक जो मन में आए वो करने के बजाय, अब एक central policy system फैसले लेता था। इस chunk को कौन सा LOD level मिलेगा? यह heightmap के रूप में render होगा या marching cubes के रूप में? इसे transition cells की ज़रूरत है, और किन faces पर? जवाब एक policy function से आते थे जो camera से distance, edit history, और neighbor resolution states को परखता था।</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/23-policy-chunk-modes/" title="Spike 23 Policy Chunk Modes" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/23-policy-chunk-modes/" target="_blank">Spike 23 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=23-policy-chunk-modes">Source देखें</a></p>
<p>Distance-based LOD assignment camera के चारों ओर concentric rings का इस्तेमाल करती थी, जो clipmap concept जैसी ही है पर chunk grid पर लागू होती है। Ring 0 के chunks को full-resolution MC मिलता है। Ring 1 को half-resolution MC मिलता है। Ring 2 और उससे आगे को heightmap mode मिलता है। Adjacency constraint बेहद ज़रूरी था: किन्हीं दो पड़ोसी chunks के लिए हमें <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.666ex;" xmlns="http://www.w3.org/2000/svg" width="12.84ex" height="2.361ex" role="img" focusable="false" viewBox="0 -749.5 5675.3 1043.7" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo" transform="translate(0 -0.5)"><path data-c="7C" d="M139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(278,0)"><g data-mml-node="mi"><path data-c="1D43F" d="M228 637Q194 637 192 641Q191 643 191 649Q191 673 202 682Q204 683 217 683Q271 680 344 680Q485 680 506 683H518Q524 677 524 674T522 656Q517 641 513 637H475Q406 636 394 628Q387 624 380 600T313 336Q297 271 279 198T252 88L243 52Q243 48 252 48T311 46H328Q360 46 379 47T428 54T478 72T522 106T564 161Q580 191 594 228T611 270Q616 273 628 273H641Q647 264 647 262T627 203T583 83T557 9Q555 4 553 3T537 0T494 -1Q483 -1 418 -1T294 0H116Q32 0 32 10Q32 17 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628Q285 635 228 637Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(714,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(1508.2,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(2508.4,0)"><g data-mml-node="mi"><path data-c="1D43F" d="M228 637Q194 637 192 641Q191 643 191 649Q191 673 202 682Q204 683 217 683Q271 680 344 680Q485 680 506 683H518Q524 677 524 674T522 656Q517 641 513 637H475Q406 636 394 628Q387 624 380 600T313 336Q297 271 279 198T252 88L243 52Q243 48 252 48T311 46H328Q360 46 379 47T428 54T478 72T522 106T564 161Q580 191 594 228T611 270Q616 273 628 273H641Q647 264 647 262T627 203T583 83T557 9Q555 4 553 3T537 0T494 -1Q483 -1 418 -1T294 0H116Q32 0 32 10Q32 17 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628Q285 635 228 637Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(714,-150) scale(0.707)"><path data-c="1D457" d="M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(3563.7,0) translate(0 -0.5)"><path data-c="7C" d="M139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(4119.5,0)"><path data-c="2264" d="M674 636Q682 636 688 630T694 615T687 601Q686 600 417 472L151 346L399 228Q687 92 691 87Q694 81 694 76Q694 58 676 56H670L382 192Q92 329 90 331Q83 336 83 348Q84 359 96 365Q104 369 382 500T665 634Q669 636 674 636ZM84 -118Q84 -108 99 -98H678Q694 -104 694 -118Q694 -130 679 -138H98Q84 -131 84 -118Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(5175.3,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo data-mjx-texclass="ORD" stretchy="false">|</mo><msub><mi>L</mi><mi>i</mi></msub><mo>−</mo><msub><mi>L</mi><mi>j</mi></msub><mo data-mjx-texclass="ORD" stretchy="false">|</mo><mo>≤</mo><mn>1</mn></math></mjx-assistive-mml></mjx-container> चाहिए। एक face के आर-पार resolution ratio <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="6.754ex" height="2.02ex" role="img" focusable="false" viewBox="0 -893 2985.2 893" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msup"><g data-mml-node="mn"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g><g data-mml-node="TeXAtom" transform="translate(533,363) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mo" transform="translate(0 -0.5)"><path data-c="7C" d="M139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(278,0)"><g data-mml-node="mi"><path data-c="1D43F" d="M228 637Q194 637 192 641Q191 643 191 649Q191 673 202 682Q204 683 217 683Q271 680 344 680Q485 680 506 683H518Q524 677 524 674T522 656Q517 641 513 637H475Q406 636 394 628Q387 624 380 600T313 336Q297 271 279 198T252 88L243 52Q243 48 252 48T311 46H328Q360 46 379 47T428 54T478 72T522 106T564 161Q580 191 594 228T611 270Q616 273 628 273H641Q647 264 647 262T627 203T583 83T557 9Q555 4 553 3T537 0T494 -1Q483 -1 418 -1T294 0H116Q32 0 32 10Q32 17 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628Q285 635 228 637Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(714,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(1286,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(2064,0)"><g data-mml-node="mi"><path data-c="1D43F" d="M228 637Q194 637 192 641Q191 643 191 649Q191 673 202 682Q204 683 217 683Q271 680 344 680Q485 680 506 683H518Q524 677 524 674T522 656Q517 641 513 637H475Q406 636 394 628Q387 624 380 600T313 336Q297 271 279 198T252 88L243 52Q243 48 252 48T311 46H328Q360 46 379 47T428 54T478 72T522 106T564 161Q580 191 594 228T611 270Q616 273 628 273H641Q647 264 647 262T627 203T583 83T557 9Q555 4 553 3T537 0T494 -1Q483 -1 418 -1T294 0H116Q32 0 32 10Q32 17 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628Q285 635 228 637Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(714,-150) scale(0.707)"><path data-c="1D457" d="M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(3119.3,0) translate(0 -0.5)"><path data-c="7C" d="M139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139Z" style="stroke-width: 3;"/></g></g></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><msup><mn>2</mn><mrow data-mjx-texclass="ORD"><mo data-mjx-texclass="ORD" stretchy="false">|</mo><msub><mi>L</mi><mi>i</mi></msub><mo>−</mo><msub><mi>L</mi><mi>j</mi></msub><mo data-mjx-texclass="ORD" stretchy="false">|</mo></mrow></msup></math></mjx-assistive-mml></mjx-container> होता है, और Transvoxel transition tables सिर्फ 2:1 case के लिए परिभाषित हैं (<mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.666ex;" xmlns="http://www.w3.org/2000/svg" width="12.84ex" height="2.361ex" role="img" focusable="false" viewBox="0 -749.5 5675.3 1043.7" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mo" transform="translate(0 -0.5)"><path data-c="7C" d="M139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(278,0)"><g data-mml-node="mi"><path data-c="1D43F" d="M228 637Q194 637 192 641Q191 643 191 649Q191 673 202 682Q204 683 217 683Q271 680 344 680Q485 680 506 683H518Q524 677 524 674T522 656Q517 641 513 637H475Q406 636 394 628Q387 624 380 600T313 336Q297 271 279 198T252 88L243 52Q243 48 252 48T311 46H328Q360 46 379 47T428 54T478 72T522 106T564 161Q580 191 594 228T611 270Q616 273 628 273H641Q647 264 647 262T627 203T583 83T557 9Q555 4 553 3T537 0T494 -1Q483 -1 418 -1T294 0H116Q32 0 32 10Q32 17 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628Q285 635 228 637Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(714,-150) scale(0.707)"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(1508.2,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(2508.4,0)"><g data-mml-node="mi"><path data-c="1D43F" d="M228 637Q194 637 192 641Q191 643 191 649Q191 673 202 682Q204 683 217 683Q271 680 344 680Q485 680 506 683H518Q524 677 524 674T522 656Q517 641 513 637H475Q406 636 394 628Q387 624 380 600T313 336Q297 271 279 198T252 88L243 52Q243 48 252 48T311 46H328Q360 46 379 47T428 54T478 72T522 106T564 161Q580 191 594 228T611 270Q616 273 628 273H641Q647 264 647 262T627 203T583 83T557 9Q555 4 553 3T537 0T494 -1Q483 -1 418 -1T294 0H116Q32 0 32 10Q32 17 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628Q285 635 228 637Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(714,-150) scale(0.707)"><path data-c="1D457" d="M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(3563.7,0) translate(0 -0.5)"><path data-c="7C" d="M139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(4119.5,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(5175.3,0)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo data-mjx-texclass="ORD" stretchy="false">|</mo><msub><mi>L</mi><mi>i</mi></msub><mo>−</mo><msub><mi>L</mi><mi>j</mi></msub><mo data-mjx-texclass="ORD" stretchy="false">|</mo><mo>=</mo><mn>1</mn></math></mjx-assistive-mml></mjx-container>)। 2 levels की छलांग के लिए 4:1 transition चाहिए होगा जिसे ये tables व्यक्त नहीं कर सकतीं, इसलिए policy lower-detail chunk को तब तक upgrade करने पर मजबूर करती है जब तक constraint पूरी न हो जाए।</p>
<p>HM/MC switching logic हर chunk के edit bitmap को जांचता था। अगर किसी chunk में कोई भी volumetric edits थीं (caves, tunnels, terrain sculpts), तो वह distance की परवाह किए बिना MC mode में ही रहता था। बिना edit वाले chunks काफी दूर चले जाने पर heightmap mode में आ सकते थे। इस hybrid approach ने हमें वहां volumetric freedom दी जहां वह मायने रखती थी और वहां efficiency दी जहां नहीं रखती थी।</p>
<p>यह spike बाहर से पहले के कुछ spikes के मुकाबले छोटा लगा। असल में यह development के लिए quality-of-life में एक बड़ा सुधार था।</p>
<p>जब आपका system यह बता सकता है कि किसी chunk ने mode क्यों बदला, तो आप अंदाज़ा लगाने में कम समय बिताते हैं। हमने color-coded overlays जोड़े: heightmap chunks के लिए हरा, MC chunks के लिए नीला, transition-active faces के लिए नारंगी। जब seam visibility के लिए dedicated render controls होते हैं, तो visual debugging की उलझन घट जाती है। जब draw ranges को policy system से मिले active vertex counts से साफ़ तौर पर जोड़ा जाता है, तो stale geometry ghosts आपकी दोपहर बर्बाद करना बंद कर देते हैं।</p>
<p>हमने इस spike में camera behavior को भी पूरी तरह बदल दिया। पहले के spikes में simple orbit controls थे जो screenshots के लिए ठीक थे पर bugs को reproduce करने के लिए बेकार थे। Spike 23 ने configurable speed, altitude lock toggle, और position readout के साथ WASD fly camera जोड़ा। यह छोटी बात लगती है। इसका मतलब था &quot;मैंने उस ridge के पास कहीं एक bug देखा&quot; और &quot;bug position (142, 12, -67) पर northwest की ओर मुंह करके दिखता है&quot; के बीच का फर्क।</p>
<p>इस भाग की सबसे अहम बात यह है कि policy ने complexity घटाई नहीं। उसने complexity को व्यवस्थित किया। edge cases की संख्या वही रही। पर अब हर edge case का एक नाम था, एक trigger condition थी, और code में एक जगह थी जहां आप breakpoint लगा सकते थे। यह एक अलग तरह की जीत है, और यही तय करता है कि कोई system विकसित होता रह सकता है या अपने ही बोझ तले बैठ जाता है।</p>
<p>Spike 23 के अंत तक, हमारे पास एक near-field behavior layer था जो इतना predictable था कि उसे interaction bugs के लगातार डर के बिना far-field clipmap ring strategy से जोड़ा जा सके।</p>
<p>भाग 12 में हम Spike 24 को देखेंगे, जहां ring transitions, skybox fog, और Three.js version-level shader integration project के इस अध्याय को समाप्त करते हैं।</p>
<h2 id="इस-अध्याय-में-संदर्भित-technology" tabindex="-1">इस अध्याय में संदर्भित technology <a class="header-anchor" href="#इस-अध्याय-में-संदर्भित-technology" aria-label="Permalink to &quot;इस अध्याय में संदर्भित technology&quot;"></a></h2>
<p><strong>Distance-based LOD policy.</strong> एक central function जो हर chunk को camera से distance, edit history, और neighbor states के आधार पर LOD level और rendering mode देती है। Concentric distance rings base LOD तय करते हैं: ring 0 = full-res MC, ring 1 = half-res MC, ring 2+ = heightmap mode। जैसे-जैसे camera हिलता है, policy function हर frame चलती है और chunk transitions को trigger करती है। यह ad-hoc per-chunk फैसलों की जगह एक predictable, debuggable rule system रख देती है। compute shader के समकक्ष के लिए <a href="/hi/guides/landscape-generation-browser.html#gpu-driven-lod-with-webgpu">GPU-driven LOD selection</a> देखें।</p>
<p><strong>Adjacency constraints.</strong> Transvoxel algorithm सिर्फ 2:1 resolution ratios संभालता है। अगर दो पड़ोसी chunks एक LOD level से ज़्यादा का फर्क रखते हैं (जैसे LOD 0 के बगल में LOD 2), तो transition tables valid seam geometry नहीं बना सकतीं। Policy system इसे तब लागू करता है जब LOD फर्क 1 से ज़्यादा हो जाने पर lower-detail chunk को upgrade कर देता है। यह constraint propagation cascade कर सकता है: एक chunk को upgrade करने से उसके पड़ोसियों को भी upgrade करना पड़ सकता है। Implementation एक simple iterative pass है जो typical grid configurations के लिए 2-3 iterations में converge हो जाता है।</p>
<p><strong>Mode selection के लिए edit bitmap.</strong> हर chunk एक bitmap रखता है जो दर्ज करता है कि उसमें volumetric SDF edits (caves, tunnels, sculpts) हैं या नहीं। किसी भी edit वाले chunks distance की परवाह किए बिना marching cubes mode में रहते हैं, जिससे creator के बदलाव सुरक्षित रहते हैं। बिना edit वाले chunks camera से काफी दूर होने पर heightmap mode में आ जाते हैं, जिससे compute और memory बचती है। Bitmap हर chunk के लिए एक ही flag है पर इसे edit density track करने के लिए बढ़ाया जा सकता है ताकि mode के और बारीक फैसले लिए जा सकें।</p>
<p><strong>Debug visualization overlays.</strong> Color-coded chunk rendering जहां हरा = heightmap mode, नीला = MC mode, नारंगी = transition-active faces। LOD level numbers, mode labels, और wireframe toggles के साथ per-chunk overlays। ये development tools हैं, shipped features नहीं, पर LOD transitions और seam artifacts को debug करते समय ये बार-बार अपनी कीमत वसूल कर लेते हैं। exact world position बताने वाले WASD fly camera के साथ मिलकर ये &quot;मैंने कहीं एक bug देखा&quot; को &quot;bug (142, 12, -67) पर इस LOD configuration के साथ दिखता है&quot; में बदल देते हैं।</p>
<hr>
<p>भाग 11, कुल 12 में से।<br>
पिछला: <a href="/hi/blog/2026-02-25-open-world-browser-part-10-seam-chaos.html">भाग 10 - Seam की उथल-पुथल और corner का बॉस फाइट</a><br>
अगला: <a href="/hi/blog/2026-02-25-open-world-browser-part-12-lessons.html">भाग 12 - Rings, sky fog, और हम फिर से क्या करेंगे</a><br>
Series guide: <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">/hi/blog/2026-02-25-open-world-browser-series-guide</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ब्राउज़र में open world बनाना, भाग 12: Rings, sky fog, और जो हम दोबारा करेंगे]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-02-25-open-world-browser-part-12-lessons</link>
            <guid>https://app.cinevva.com/hi/blog/2026-02-25-open-world-browser-part-12-lessons</guid>
            <pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Spike 24 ने इस चैप्टर को clipmap ring transitions, skybox fog integration, और मेहनत से सीखे गए सबकों की एक लंबी लिस्ट के साथ बंद किया।]]></description>
            <content:encoded><![CDATA[<h1 id="ब्राउज़र-में-open-world-बनाना-भाग-12-rings-sky-fog-और-जो-हम-दोबारा-करेंगे" tabindex="-1">ब्राउज़र में open world बनाना, भाग 12: Rings, sky fog, और जो हम दोबारा करेंगे <a class="header-anchor" href="#ब्राउज़र-में-open-world-बनाना-भाग-12-rings-sky-fog-और-जो-हम-दोबारा-करेंगे" aria-label="Permalink to &quot;ब्राउज़र में open world बनाना, भाग 12: Rings, sky fog, और जो हम दोबारा करेंगे&quot;"></a></h1>
<p><em>लिखा है <a href="/hi/about.html">Oleg Sidorkin</a> ने, Cinevva के CTO और को-फाउंडर</em></p>
<p>यहाँ नए हैं? <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">सीरीज़ गाइड</a> देखिए। यह बताती है कि spike क्या होता है और सारे भागों के लिंक देती है।</p>
<p>Spike 24 को बस &quot;terrain में clipmap rings जोड़ना&quot; होना था। यह एक पूरा finale बन गया जिसने rendering, shaders, module infrastructure, और visual integration सबको एक साथ छुआ।</p>
<p>Core terrain task vertex shader में concentric clipmap rings generate करना था। हर ring एक flat grid mesh है जो camera पर centered है, और जिसके vertices heightmap samples से displace होते हैं। Inner ring full resolution इस्तेमाल करता है। हर अगला ring vertex spacing को दोगुना करता है और बड़े area को cover करता है। मुश्किल हिस्सा rings के बीच की boundary है: जहाँ एक high-resolution ring एक low-resolution ring से मिलता है, वहाँ finer mesh के edge vertices को coarser mesh के edge के midpoint पर snap करना पड़ता है। हमने 2:1 edge morphing किया, जिसमें boundary vertices (वे जिनका grid coordinate ring edge के साथ odd होता है) को detect करके उनकी height को उनके दो even neighbors के midpoint पर snap किया, <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.781ex;" xmlns="http://www.w3.org/2000/svg" width="19.274ex" height="2.737ex" role="img" focusable="false" viewBox="0 -864.9 8519.1 1209.9" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="210E" d="M137 683Q138 683 209 688T282 694Q294 694 294 685Q294 674 258 534Q220 386 220 383Q220 381 227 388Q288 442 357 442Q411 442 444 415T478 336Q478 285 440 178T402 50Q403 36 407 31T422 26Q450 26 474 56T513 138Q516 149 519 151T535 153Q555 153 555 145Q555 144 551 130Q535 71 500 33Q466 -10 419 -10H414Q367 -10 346 17T325 74Q325 90 361 192T398 345Q398 404 354 404H349Q266 404 205 306L198 293L164 158Q132 28 127 16Q114 -11 83 -11Q69 -11 59 -2T48 16Q48 30 121 320L195 616Q195 629 188 632T149 637H128Q122 643 122 645T124 664Q129 683 137 683Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(853.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mstyle" transform="translate(1909.6,0)"><g data-mml-node="mfrac"><g data-mml-node="mn" transform="translate(220,394) scale(0.707)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(220,-345) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g><rect width="553.6" height="60" x="120" y="220"/></g></g><g data-mml-node="mo" transform="translate(2703.1,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(3092.1,0)"><g data-mml-node="mi"><path data-c="210E" d="M137 683Q138 683 209 688T282 694Q294 694 294 685Q294 674 258 534Q220 386 220 383Q220 381 227 388Q288 442 357 442Q411 442 444 415T478 336Q478 285 440 178T402 50Q403 36 407 31T422 26Q450 26 474 56T513 138Q516 149 519 151T535 153Q555 153 555 145Q555 144 551 130Q535 71 500 33Q466 -10 419 -10H414Q367 -10 346 17T325 74Q325 90 361 192T398 345Q398 404 354 404H349Q266 404 205 306L198 293L164 158Q132 28 127 16Q114 -11 83 -11Q69 -11 59 -2T48 16Q48 30 121 320L195 616Q195 629 188 632T149 637H128Q122 643 122 645T124 664Q129 683 137 683Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(609,-150) scale(0.707)"><path data-c="6C" d="M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z" style="stroke-width: 3;"/><path data-c="65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z" transform="translate(278,0)" style="stroke-width: 3;"/><path data-c="66" d="M273 0Q255 3 146 3Q43 3 34 0H26V46H42Q70 46 91 49Q99 52 103 60Q104 62 104 224V385H33V431H104V497L105 564L107 574Q126 639 171 668T266 704Q267 704 275 704T289 705Q330 702 351 679T372 627Q372 604 358 590T321 576T284 590T270 627Q270 647 288 667H284Q280 668 273 668Q245 668 223 647T189 592Q183 572 182 497V431H293V385H185V225Q185 63 186 61T189 57T194 54T199 51T206 49T213 48T222 47T231 47T241 46T251 46H282V0H273Z" transform="translate(722,0)" style="stroke-width: 3;"/><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" transform="translate(1028,0)" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(4975.3,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(5975.5,0)"><g data-mml-node="mi"><path data-c="210E" d="M137 683Q138 683 209 688T282 694Q294 694 294 685Q294 674 258 534Q220 386 220 383Q220 381 227 388Q288 442 357 442Q411 442 444 415T478 336Q478 285 440 178T402 50Q403 36 407 31T422 26Q450 26 474 56T513 138Q516 149 519 151T535 153Q555 153 555 145Q555 144 551 130Q535 71 500 33Q466 -10 419 -10H414Q367 -10 346 17T325 74Q325 90 361 192T398 345Q398 404 354 404H349Q266 404 205 306L198 293L164 158Q132 28 127 16Q114 -11 83 -11Q69 -11 59 -2T48 16Q48 30 121 320L195 616Q195 629 188 632T149 637H128Q122 643 122 645T124 664Q129 683 137 683Z" style="stroke-width: 3;"/></g><g data-mml-node="mtext" transform="translate(609,-150) scale(0.707)"><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(392,0)" style="stroke-width: 3;"/><path data-c="67" d="M329 409Q373 453 429 453Q459 453 472 434T485 396Q485 382 476 371T449 360Q416 360 412 390Q410 404 415 411Q415 412 416 414V415Q388 412 363 393Q355 388 355 386Q355 385 359 381T368 369T379 351T388 325T392 292Q392 230 343 187T222 143Q172 143 123 171Q112 153 112 133Q112 98 138 81Q147 75 155 75T227 73Q311 72 335 67Q396 58 431 26Q470 -13 470 -72Q470 -139 392 -175Q332 -206 250 -206Q167 -206 107 -175Q29 -140 29 -75Q29 -39 50 -15T92 18L103 24Q67 55 67 108Q67 155 96 193Q52 237 52 292Q52 355 102 398T223 442Q274 442 318 416L329 409ZM299 343Q294 371 273 387T221 404Q192 404 171 388T145 343Q142 326 142 292Q142 248 149 227T179 192Q196 182 222 182Q244 182 260 189T283 207T294 227T299 242Q302 258 302 292T299 343ZM403 -75Q403 -50 389 -34T348 -11T299 -2T245 0H218Q151 0 138 -6Q118 -15 107 -34T95 -74Q95 -84 101 -97T122 -127T170 -155T250 -167Q319 -167 361 -139T403 -75Z" transform="translate(670,0)" style="stroke-width: 3;"/><path data-c="68" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 124T102 167T103 217T103 272T103 329Q103 366 103 407T103 482T102 542T102 586T102 603Q99 622 88 628T43 637H25V660Q25 683 27 683L37 684Q47 685 66 686T103 688Q120 689 140 690T170 693T181 694H184V367Q244 442 328 442Q451 442 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(1170,0)" style="stroke-width: 3;"/><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" transform="translate(1726,0)" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(8130.1,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>h</mi><mo>=</mo><mstyle displaystyle="false" scriptlevel="0"><mfrac><mn>1</mn><mn>2</mn></mfrac></mstyle><mo stretchy="false">(</mo><msub><mi>h</mi><mtext>left</mtext></msub><mo>+</mo><msub><mi>h</mi><mtext>right</mtext></msub><mo stretchy="false">)</mo></math></mjx-assistive-mml></mjx-container>। यह ठीक वही point है जहाँ coarse ring का single edge बैठेगा, इसलिए fine और coarse edges एक ही line describe करते हैं। इससे transition geometry के बिना watertight seams बनते हैं।</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0;border:1px solid rgba(255,255,255,0.12)">
<iframe src="/spikes/24-gpu-clipmap-rings/" title="Spike 24 Clipmap Rings and Sky Fog" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background:#000" loading="lazy" allowfullscreen></iframe>
</div>
<p><a href="/spikes/24-gpu-clipmap-rings/" target="_blank">Spike 24 को नए tab में खोलें ↗</a> · <a href="/blog/spike-source?spike=24-gpu-clipmap-rings">Source देखें</a></p>
<p>फिर आया fog और sky integration। हम चाहते थे कि दूर का terrain असली sky color में fade हो, किसी flat constant में नहीं। इसका मतलब था कि fog shader को पता होना चाहिए कि हर fragment की direction में sky किस color का होगा। हमने एक equirectangular HDR skybox texture load किया और इसे fragment shader में camera से fragment तक की view direction से sample किया, जिसे TSL के <code>equirectUV</code> node के ज़रिये equirectangular UV coordinates में convert किया। Fog factor distance-based था, जो camera-space depth के लिए <code>positionView.z.negate()</code> इस्तेमाल करता था, और एक near और far distance के बीच <code>smoothstep</code> से blend होता था।</p>
<p>Module wiring किसी भी geometry से ज़्यादा परेशान करने वाला निकला। हमने Three.js 0.183.1 में upgrade किया, जिसने build outputs को restructure कर दिया। <code>three/tsl</code> import को <code>three.tsl.js</code> पर resolve होना था, और TSL internally <code>three/webgpu</code> को एक bare specifier के तौर पर import करता था। दोनों mappings को HTML import map में explicit होना पड़ा। इनमें से एक भी छूटने पर &quot;does not provide an export&quot; या &quot;failed to resolve module specifier&quot; जैसी cryptic errors आती थीं, जिनमें यह कोई संकेत नहीं होता था कि कौन सी mapping गलत है। एक बार दोनों import map में आ जाने पर, shader graph सही से load हो गया।</p>
<p>हमें एक skybox orientation issue भी था जहाँ texture उल्टा render हो रहा था। इसका fix था equirectangular texture पर <code>flipY = true</code>, जो loaded textures के लिए Three.js का default है पर हमारे शुरुआती code में <code>false</code> set था।</p>
<p>मूल fog implementation sky को एक लगभग-constant direction पर sample करता था, जिससे natural gradient की जगह एक पतली horizon-color वाली पट्टी बनती थी। इसका fix था per pixel असली camera-to-fragment world direction compute करना, <code>positionWorld.sub(cameraPosition).normalize()</code> से, और उसे fog color lookup के लिए <code>equirectUV</code> में pass करना। इससे terrain fragments उस sky color में fade होने लगे जो असल में उनके पीछे है, और यह किसी भी camera angle से सही दिखता है।</p>
<p>इन सारे individual fixes के नीचे, core outcome बना रहा। अब हमारे पास एक terrain system है जो near-field volumetric editing (Transvoxel seams के साथ marching cubes), mid-field heightmap chunks, और far-field clipmap rings को मिलाता है, और इन सबको एक policy layer govern करती है जो mode, LOD, और transition behavior तय करती है।</p>
<p>अगर मुझे उन patterns के नाम बताने हों जो मैं अगले project में दोहराऊँगा, तो ये होंगे:</p>
<p>Feature work से पहले risk spikes से शुरू करें। Spike 1 ने &quot;क्या हम इतनी तेज़ render भी कर सकते हैं&quot; वाले सवाल को content pipelines में invest करने से पहले ही खत्म कर दिया।</p>
<p>Integration jumps से पहले known-good baselines को freeze करें। Spikes 13 और 14 ने regressions bisect करने के हमारे कई दिन बचाए।</p>
<p>Optimization marathons से पहले policy और observability को force करें। Spike 23 ने mystery bugs को trigger rules वाली named conditions में बदल दिया।</p>
<p>Screenshots नहीं, motion के तहत test करें। Clipmap pops, seam flicker, और streaming hitches सब still frames में छुप जाते हैं।</p>
<p>Average FPS नहीं, हर feature की frame-time cost measure करें। Averages उन spikes को छुपा देते हैं जो users असल में महसूस करते हैं।</p>
<p>और बेतरतीब हिस्से publish करें। गलत मोड़, stale-buffer ghost hunts, वे दो दिन जब draw range गलत था और हम transition logic को दोष दे रहे थे। यही वे हिस्से हैं जिनसे लोग असल में सीख सकते हैं।</p>
<h2 id="external-reality-check-vuntra-city-devlogs" tabindex="-1">External reality check: Vuntra City devlogs <a class="header-anchor" href="#external-reality-check-vuntra-city-devlogs" aria-label="Permalink to &quot;External reality check: Vuntra City devlogs&quot;"></a></h2>
<p>यह सीरीज़ खत्म करने के बाद, हमने अपनी open-world assumptions के against एक external implementation check के तौर पर <code>@VuntraCity</code> devlogs को review किया। यह एक native UE5 project है, browser stack नहीं, पर system patterns इतने अच्छे से map हो जाते हैं कि comparison काम का रहता है।</p>
<p>पहला signal यह है कि traversal speed को सिर्फ़ gameplay नहीं, बल्कि एक streaming control के तौर पर लेना होगा। Vuntra City में high-speed transit को जानबूझकर ज़्यादातर interiors के ऊपर से route किया जाता है, और detail range movement speed के साथ scale होता है ताकि spawn churn और stalls से बचा जा सके (<a href="https://www.youtube.com/watch?v=KKeBElJS6-M" target="_blank" rel="noreferrer">transport system</a>, <a href="https://www.youtube.com/watch?v=aPuYXyJet38" target="_blank" rel="noreferrer">performance techniques</a>)। यह हमारी policy-layer direction से मेल खाता है: movement mode को chunk radius, interior activation, और per frame allowed work पर सीधे असर डालना चाहिए।</p>
<p>दूसरा signal architecture है। उनके maps और address system को world topology को rendered objects से अलग करना पड़ा ताकि unloaded regions के लिए भी global queries चल सकें (<a href="https://www.youtube.com/watch?v=6dLn1GQpu2c" target="_blank" rel="noreferrer">maps and addresses</a>)। यह वही separation है जो हमें browser में world search, quest routing, moderation scans, और POI indexing के लिए चाहिए, render-bound data paths को force किए बिना।</p>
<p>तीसरा signal simulation tiering है। उनका million-NPC design coarse schedule state को सस्ता और global रखता है, और महँगा behavior budget सिर्फ़ player के पास खर्च करता है (<a href="https://www.youtube.com/watch?v=nBV0yAAJUf0" target="_blank" rel="noreferrer">million-NPC overview</a>, <a href="https://www.youtube.com/watch?v=eUi7DB1ar3s" target="_blank" rel="noreferrer">system deep dive</a>)। यह हमारे अपने AOI-first simulation model को मज़बूत करता है, जहाँ near-field fidelity और far-field determinism अलग-अलग concerns हैं जिनके budgets भी अलग हैं।</p>
<p>और चौथा signal design quality है, raw scale नहीं। उनके सबसे मज़बूत exploration moments constant UI overlays की जगह weighted distributions, rare outliers, और diegetic navigation clues से आते हैं (<a href="https://www.youtube.com/watch?v=4MZ5-KQW3pc" target="_blank" rel="noreferrer">procedural environment notes</a>, <a href="https://www.youtube.com/watch?v=ixR1hqZJlv4" target="_blank" rel="noreferrer">no minimap loop</a>)। हमारे लिए यह एक याद दिलाने वाली बात है कि technical systems को सिर्फ़ maximal throughput के लिए नहीं, बल्कि discoverable variation पैदा करने के लिए tune करना चाहिए।</p>
<h2 id="इस-चैप्टर-में-referenced-technology" tabindex="-1">इस चैप्टर में referenced technology <a class="header-anchor" href="#इस-चैप्टर-में-referenced-technology" aria-label="Permalink to &quot;इस चैप्टर में referenced technology&quot;"></a></h2>
<p><strong>Clipmap ring geometry.</strong> हर ring एक flat grid mesh है जो camera पर centered है और जिसके vertices heightmap samples से displace होते हैं। Inner ring full resolution इस्तेमाल करता है। हर अगला ring vertex spacing दोगुना करता है और बड़े area को cover करता है। मुश्किल हिस्सा boundary है: जहाँ एक high-res ring एक low-res ring से मिलता है, वहाँ finer mesh के edge vertices coarser mesh के edge के midpoint पर snap होते हैं। यह technique Losasso और Hoppe के SIGGRAPH 2004 paper (<a href="https://hhoppe.com/geomclipmap.pdf" target="_blank" rel="noreferrer">PDF</a>) से आती है और <a href="https://developer.nvidia.com/gpugems/gpugems2/part-i-geometric-complexity/chapter-2-terrain-rendering-using-gpu-based-geometry" target="_blank" rel="noreferrer">GPU Gems 2, Chapter 2</a> में detail में बताई गई है। हमारी <a href="/hi/guides/landscape-generation-browser.html#geometry-clipmaps">geometry clipmaps वाली landscape guide</a> देखें।</p>
<p><strong>2:1 edge morphing.</strong> दो clipmap rings के बीच की boundary पर, finer ring के पास उन positions पर vertices होते हैं जो coarser ring share नहीं करता। जिन boundary vertices का grid coordinate ring edge के साथ odd होता है उन्हें detect किया जाता है और उनकी height दो पड़ोसी even vertices के बीच interpolate की जाती है। इससे dedicated transition geometry के बिना watertight seams बनते हैं। Interpolation vertex shader में चलता है: boundary vertices के लिए <code>morphedHeight = mix(heightLeft, heightRight, 0.5)</code>, और इसमें वही geomorphing framework इस्तेमाल होता है जो <a href="/hi/guides/landscape-generation-browser.html#geomorphing-pop-free-lod-transitions">हमारी guide</a> में बताया गया है।</p>
<p><strong>Equirectangular skybox mapping.</strong> एक single 2D image जो longitude-latitude projection से sky directions के पूरे sphere को map करती है। Horizontal axis 0-360 degrees cover करती है, vertical axis 0-180 degrees। एक normalized view direction <mjx-container class="MathJax" jax="SVG" style="direction: ltr; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.667ex;" xmlns="http://www.w3.org/2000/svg" width="14.501ex" height="3.07ex" role="img" focusable="false" viewBox="0 -1062 6409.6 1357" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mover"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(427,268) translate(-250 0)"><path data-c="5E" d="M112 560L249 694L257 686Q387 562 387 560L361 531Q359 532 303 581L250 627L195 580Q182 569 169 557T148 538L140 532Q138 530 125 546L112 560Z" style="stroke-width: 3;"/></g></g></g><g data-mml-node="mo" transform="translate(797.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(1853.6,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(2242.6,0)"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(553,-150) scale(0.707)"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(3250,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(3694.7,0)"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(553,-150) scale(0.707)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(4644.2,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(5088.8,0)"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(553,-150) scale(0.707)"><path data-c="1D467" d="M347 338Q337 338 294 349T231 360Q211 360 197 356T174 346T162 335T155 324L153 320Q150 317 138 317Q117 317 117 325Q117 330 120 339Q133 378 163 406T229 440Q241 442 246 442Q271 442 291 425T329 392T367 375Q389 375 411 408T434 441Q435 442 449 442H462Q468 436 468 434Q468 430 463 420T449 399T432 377T418 358L411 349Q368 298 275 214T160 106L148 94L163 93Q185 93 227 82T290 71Q328 71 360 90T402 140Q406 149 409 151T424 153Q443 153 443 143Q443 138 442 134Q425 72 376 31T278 -11Q252 -11 232 6T193 40T155 57Q111 57 76 -3Q70 -11 59 -11H54H41Q35 -5 35 -2Q35 13 93 84Q132 129 225 214T340 322Q352 338 347 338Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(6020.6,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;"><math xmlns="http://www.w3.org/1998/Math/MathML"><mrow data-mjx-texclass="ORD"><mover><mi>d</mi><mo stretchy="false">^</mo></mover></mrow><mo>=</mo><mo stretchy="false">(</mo><msub><mi>d</mi><mi>x</mi></msub><mo>,</mo><msub><mi>d</mi><mi>y</mi></msub><mo>,</mo><msub><mi>d</mi><mi>z</mi></msub><mo stretchy="false">)</mo></math></mjx-assistive-mml></mjx-container> अपने longitude और latitude को पढ़कर UV coordinates में convert होती है:</p>
<mjx-container tabindex="0" class="MathJax" jax="SVG" display="true" style="direction: ltr; display: block; text-align: center; margin: 1em 0; position: relative;"><svg style="overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -1.577ex;" xmlns="http://www.w3.org/2000/svg" width="48.882ex" height="4.982ex" role="img" focusable="false" viewBox="0 -1505 21605.8 2202" aria-hidden="true"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D462" d="M21 287Q21 295 30 318T55 370T99 420T158 442Q204 442 227 417T250 358Q250 340 216 246T182 105Q182 62 196 45T238 27T291 44T328 78L339 95Q341 99 377 247Q407 367 413 387T427 416Q444 431 463 431Q480 431 488 421T496 402L420 84Q419 79 419 68Q419 43 426 35T447 26Q469 29 482 57T512 145Q514 153 532 153Q551 153 551 144Q550 139 549 130T540 98T523 55T498 17T462 -8Q454 -10 438 -10Q372 -10 347 46Q345 45 336 36T318 21T296 6T267 -6T233 -11Q189 -11 155 7Q103 38 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(849.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mfrac" transform="translate(1905.6,0)"><g data-mml-node="mn" transform="translate(220,676)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(220,-686)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g><rect width="700" height="60" x="120" y="220"/></g><g data-mml-node="mo" transform="translate(3067.8,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mfrac" transform="translate(4068,0)"><g data-mml-node="mrow" transform="translate(220,710)"><g data-mml-node="TeXAtom" data-mjx-texclass="OP"><g data-mml-node="mi"><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" style="stroke-width: 3;"/><path data-c="74" d="M27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27Z" transform="translate(500,0)" style="stroke-width: 3;"/><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" transform="translate(889,0)" style="stroke-width: 3;"/><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(1389,0)" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(2111.7,0)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(2611.7,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(3000.7,0)"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(553,-150) scale(0.707)"><path data-c="1D467" d="M347 338Q337 338 294 349T231 360Q211 360 197 356T174 346T162 335T155 324L153 320Q150 317 138 317Q117 317 117 325Q117 330 120 339Q133 378 163 406T229 440Q241 442 246 442Q271 442 291 425T329 392T367 375Q389 375 411 408T434 441Q435 442 449 442H462Q468 436 468 434Q468 430 463 420T449 399T432 377T418 358L411 349Q368 298 275 214T160 106L148 94L163 93Q185 93 227 82T290 71Q328 71 360 90T402 140Q406 149 409 151T424 153Q443 153 443 143Q443 138 442 134Q425 72 376 31T278 -11Q252 -11 232 6T193 40T155 57Q111 57 76 -3Q70 -11 59 -11H54H41Q35 -5 35 -2Q35 13 93 84Q132 129 225 214T340 322Q352 338 347 338Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(3932.5,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="mstyle" transform="translate(4210.5,0)"><g data-mml-node="mspace"/></g><g data-mml-node="msub" transform="translate(4544.1,0)"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(553,-150) scale(0.707)"><path data-c="1D465" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(5551.6,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mrow" transform="translate(2655.3,-686)"><g data-mml-node="mn"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(500,0)"><path data-c="1D70B" d="M132 -11Q98 -11 98 22V33L111 61Q186 219 220 334L228 358H196Q158 358 142 355T103 336Q92 329 81 318T62 297T53 285Q51 284 38 284Q19 284 19 294Q19 300 38 329T93 391T164 429Q171 431 389 431Q549 431 553 430Q573 423 573 402Q573 371 541 360Q535 358 472 358H408L405 341Q393 269 393 222Q393 170 402 129T421 65T431 37Q431 20 417 5T381 -10Q370 -10 363 -7T347 17T331 77Q330 86 330 121Q330 170 339 226T357 318T367 358H269L268 354Q268 351 249 275T206 114T175 17Q164 -11 132 -11Z" style="stroke-width: 3;"/></g></g><rect width="6140.6" height="60" x="120" y="220"/></g><g data-mml-node="mo" transform="translate(10448.6,0)"><path data-c="2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z" style="stroke-width: 3;"/></g><g data-mml-node="mstyle" transform="translate(10726.6,0)"><g data-mml-node="mspace"/></g><g data-mml-node="mi" transform="translate(12893.3,0)"><path data-c="1D463" d="M173 380Q173 405 154 405Q130 405 104 376T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Q21 294 29 316T53 368T97 419T160 441Q202 441 225 417T249 361Q249 344 246 335Q246 329 231 291T200 202T182 113Q182 86 187 69Q200 26 250 26Q287 26 319 60T369 139T398 222T409 277Q409 300 401 317T383 343T365 361T357 383Q357 405 376 424T417 443Q436 443 451 425T467 367Q467 340 455 284T418 159T347 40T241 -11Q177 -11 139 22Q102 54 102 117Q102 148 110 181T151 298Q173 362 173 380Z" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(13656,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z" style="stroke-width: 3;"/></g><g data-mml-node="mfrac" transform="translate(14711.8,0)"><g data-mml-node="mn" transform="translate(220,676)"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" style="stroke-width: 3;"/></g><g data-mml-node="mn" transform="translate(220,-686)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" style="stroke-width: 3;"/></g><rect width="700" height="60" x="120" y="220"/></g><g data-mml-node="mo" transform="translate(15874,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z" style="stroke-width: 3;"/></g><g data-mml-node="mfrac" transform="translate(16874.3,0)"><g data-mml-node="mrow" transform="translate(220,755)"><g data-mml-node="mi"><path data-c="61" d="M137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106Z" style="stroke-width: 3;"/><path data-c="72" d="M36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36Z" transform="translate(500,0)" style="stroke-width: 3;"/><path data-c="63" d="M370 305T349 305T313 320T297 358Q297 381 312 396Q317 401 317 402T307 404Q281 408 258 408Q209 408 178 376Q131 329 131 219Q131 137 162 90Q203 29 272 29Q313 29 338 55T374 117Q376 125 379 127T395 129H409Q415 123 415 120Q415 116 411 104T395 71T366 33T318 2T249 -11Q163 -11 99 53T34 214Q34 318 99 383T250 448T370 421T404 357Q404 334 387 320Z" transform="translate(892,0)" style="stroke-width: 3;"/><path data-c="73" d="M295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316Z" transform="translate(1336,0)" style="stroke-width: 3;"/><path data-c="69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z" transform="translate(1730,0)" style="stroke-width: 3;"/><path data-c="6E" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z" transform="translate(2008,0)" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(2564,0)"><path data-c="2061" d="" style="stroke-width: 3;"/></g><g data-mml-node="mo" transform="translate(2564,0)"><path data-c="28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z" style="stroke-width: 3;"/></g><g data-mml-node="msub" transform="translate(2953,0)"><g data-mml-node="mi"><path data-c="1D451" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z" style="stroke-width: 3;"/></g><g data-mml-node="mi" transform="translate(553,-150) scale(0.707)"><path data-c="1D466" d="M21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mo" transform="translate(3902.5,0)"><path data-c="29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z" style="stroke-width: 3;"/></g></g><g data-mml-node="mi" transform="translate(2080.7,-686)"><path data-c="1D70B" d="M132 -11Q98 -11 98 22V33L111 61Q186 219 220 334L228 358H196Q158 358 142 355T103 336Q92 329 81 318T62 297T53 285Q51 284 38 284Q19 284 19 294Q19 300 38 329T93 391T164 429Q171 431 389 431Q549 431 553 430Q573 423 573 402Q573 371 541 360Q535 358 472 358H408L405 341Q393 269 393 222Q393 170 402 129T421 65T431 37Q431 20 417 5T381 -10Q370 -10 363 -7T347 17T331 77Q330 86 330 121Q330 170 339 226T357 318T367 358H269L268 354Q268 351 249 275T206 114T175 17Q164 -11 132 -11Z" style="stroke-width: 3;"/></g><rect width="4491.5" height="60" x="120" y="220"/></g></g></g></svg><mjx-assistive-mml unselectable="on" display="block" style="top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; overflow: hidden; width: 100%;"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mi>u</mi><mo>=</mo><mfrac><mn>1</mn><mn>2</mn></mfrac><mo>+</mo><mfrac><mrow><mrow data-mjx-texclass="OP"><mi>atan</mi><mn>2</mn></mrow><mo stretchy="false">(</mo><msub><mi>d</mi><mi>z</mi></msub><mo>,</mo><mstyle scriptlevel="0"><mspace width="0.167em"/></mstyle><msub><mi>d</mi><mi>x</mi></msub><mo stretchy="false">)</mo></mrow><mrow><mn>2</mn><mi>π</mi></mrow></mfrac><mo>,</mo><mstyle scriptlevel="0"><mspace width="2em"/></mstyle><mi>v</mi><mo>=</mo><mfrac><mn>1</mn><mn>2</mn></mfrac><mo>−</mo><mfrac><mrow><mi>arcsin</mi><mo data-mjx-texclass="NONE">⁡</mo><mo stretchy="false">(</mo><msub><mi>d</mi><mi>y</mi></msub><mo stretchy="false">)</mo></mrow><mi>π</mi></mfrac></math></mjx-assistive-mml></mjx-container><p>Three.js में, <code>texture.mapping = EquirectangularReflectionMapping</code> को <code>SRGBColorSpace</code> के साथ set करने से यह scene background के तौर पर enable हो जाता है। TSL में, <code>equirectUV(direction)</code> वही conversion apply करता है, और एक 3D view direction को texture sampling के लिए 2D UV coordinates में बदल देता है।</p>
<p><strong>Per-fragment fog color from sky.</strong> Standard fog fragments को एक single constant color की तरफ़ blend करता है। एक detailed skybox वाले scene के लिए यह गलत दिखता है क्योंकि sky color direction के हिसाब से बदलता है। इसका fix है per pixel camera-to-fragment world direction compute करना (<code>positionWorld.sub(cameraPosition).normalize()</code>) और fog color के लिए skybox को उस direction पर sample करना। हर fragment उस sky color की तरफ़ fade होता है जो असल में उसके पीछे है, जिससे किसी भी camera angle से सही blending बनती है। Fog factor camera-space depth के लिए <code>positionView.z.negate()</code> के साथ <code>smoothstep(nearDist, farDist, viewDepth)</code> इस्तेमाल करता है।</p>
<p><strong>Import maps for ES modules.</strong> एक browser-native mechanism (<code>&lt;script type=&quot;importmap&quot;&gt;</code>) जो bare module specifiers (जैसे <code>three/tsl</code>) को असली URLs पर map करता है। जब Three.js 0.183.1 ने अपने build outputs restructure किए, तो <code>three/tsl</code> को <code>three.tsl.js</code> पर resolve होना था और TSL internally <code>three/webgpu</code> को एक bare specifier के तौर पर import करता था। दोनों mappings को import map में explicit होना पड़ा, वरना browser &quot;does not provide an export&quot; या &quot;failed to resolve module specifier&quot; errors देता था।</p>
<h2 id="आगे-पढ़ें" tabindex="-1">आगे पढ़ें <a class="header-anchor" href="#आगे-पढ़ें" aria-label="Permalink to &quot;आगे पढ़ें&quot;"></a></h2>
<p>इस सीरीज़ में इस्तेमाल हुई technologies की गहरी जानकारी के लिए, हमारी companion guides देखें:</p>
<ul>
<li><a href="/hi/guides/landscape-generation-browser.html">Landscape Generation with Dynamic LOD and Streaming for Browser Open Worlds</a> heightmaps, SDFs, marching cubes, Transvoxel, geometry clipmaps, geomorphing, streaming architecture, terrain materials, और vegetation rendering को cover करती है।</li>
<li><a href="/hi/guides/browser-3d-open-world-tech.html">Browser 3D Open World Tech for Multiplayer Creator Worlds</a> rendering stacks, WebGPU, physics, networking, multiplayer architecture, और Skyrim, The Witcher 3, Breath of the Wild, और GTA V से सीखे सबकों को cover करती है।</li>
</ul>
<p>इस बारह-भाग वाली सवारी में हमारे साथ चलने के लिए शुक्रिया।</p>
<p>भाग 1: <a href="/hi/blog/2026-02-25-open-world-browser-part-01-risk-first.html">हमने इसे तोड़ने की कोशिश से शुरू किया</a><br>
भाग 2: <a href="/hi/blog/2026-02-25-open-world-browser-part-02-worker-physics.html">Worker physics और input lag का डर</a><br>
भाग 3: <a href="/hi/blog/2026-02-25-open-world-browser-part-03-the-unflashy-spikes.html">वे unflashy spikes जिन्होंने हमें बचाया</a><br>
भाग 4: <a href="/hi/blog/2026-02-25-open-world-browser-part-04-streaming-before-fancy.html">Fancy terrain से पहले streaming</a><br>
भाग 5: <a href="/hi/blog/2026-02-25-open-world-browser-part-05-budgeting-the-pretty.html">खूबसूरत चीज़ों का budget बनाना</a><br>
भाग 6: <a href="/hi/blog/2026-02-25-open-world-browser-part-06-clipmaps.html">Clipmaps ने कहानी बदल दी</a><br>
भाग 7: <a href="/hi/blog/2026-02-25-open-world-browser-part-07-marching-cubes.html">Marching cubes और पहली असली caves</a><br>
भाग 8: <a href="/hi/blog/2026-02-25-open-world-browser-part-08-webgpu-integration.html">Baseline खोए बिना integration</a><br>
भाग 9: <a href="/hi/blog/2026-02-25-open-world-browser-part-09-transvoxel-first-cut.html">Transvoxel एक scaffold से शुरू हुआ</a><br>
भाग 10: <a href="/hi/blog/2026-02-25-open-world-browser-part-10-seam-chaos.html">Seam chaos और corner boss fight</a><br>
भाग 11: <a href="/hi/blog/2026-02-25-open-world-browser-part-11-policy-modes.html">Policy mode, hardcoded mode नहीं</a></p>
<hr>
<p>भाग 12, कुल 14 में से।<br>
पिछला: <a href="/hi/blog/2026-02-25-open-world-browser-part-11-policy-modes.html">भाग 11 - Policy mode, hardcoded mode नहीं</a><br>
अगला: <a href="/hi/blog/2026-04-13-open-world-browser-part-13-terrain-sculpting.html">भाग 13 - Terrain sculpting और math function की मौत</a><br>
सीरीज़ गाइड: <a href="/hi/blog/2026-02-25-open-world-browser-series-guide.html">/hi/blog/2026-02-25-open-world-browser-series-guide</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ब्राउज़र में ओपन वर्ल्ड सीरीज़ गाइड]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-02-25-open-world-browser-series-guide</link>
            <guid>https://app.cinevva.com/hi/blog/2026-02-25-open-world-browser-series-guide</guid>
            <pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[29-भाग वाली ओपन वर्ल्ड ब्राउज़र सीरीज़ का पढ़ने का क्रम, साथ में आसान भाषा में spike शब्दावली और लाइव डेमो मैप।]]></description>
            <content:encoded><![CDATA[<h1 id="ब्राउज़र-में-ओपन-वर्ल्ड-सीरीज़-गाइड" tabindex="-1">ब्राउज़र में ओपन वर्ल्ड सीरीज़ गाइड <a class="header-anchor" href="#ब्राउज़र-में-ओपन-वर्ल्ड-सीरीज़-गाइड" aria-label="Permalink to &quot;ब्राउज़र में ओपन वर्ल्ड सीरीज़ गाइड&quot;"></a></h1>
<p><em>लिखा है <a href="/hi/about.html">Oleg Sidorkin</a> ने, जो Cinevva के CTO और सह-संस्थापक हैं</em></p>
<p>यह पेज पूरी सीरीज़ का नेविगेशन हब है।</p>
<p>अगर आप किसी एक रैंडम भाग से यहाँ पहुँचे हैं, तो यहीं से शुरू करें।</p>
<p>मार्च 2026 अपडेट: हमने <a href="/hi/blog/2026-02-25-open-world-browser-part-12-lessons.html">Part 12</a> में Vuntra City devlogs से एक बाहरी इम्प्लीमेंटेशन क्रॉस-चेक जोड़ा और उन्हीं निष्कर्षों के साथ साथी <a href="/hi/guides/browser-3d-open-world-tech.html">browser open world tech guide</a> को बढ़ाया।</p>
<p>अप्रैल 2026 अपडेट: Parts 13-14 में terrain sculpting (Spikes 25-27) और visual/gameplay लेयर शामिल है: multi-material texturing, instanced vegetation, और HM+SDF collision वाला एक character controller (Spikes 28-30)।</p>
<p>मई 2026 अपडेट: सीरीज़ 29 भागों तक पहुँची। Parts 15-29 में build का लंबा बीच का हिस्सा शामिल है, multiplayer terrain और water, एक code-structure refactor, animations और AI scattering, imposters और parallax, वह visibility buffer जिसका फायदा नहीं हुआ, clouds और meshlet culling, batched avatars और proximity voice, world persistence और GPU wind, universal characters, water के तीन तरीके, एक procedural island, grass और occlusion, और एक pluggable character controller जो किसी भी body को चलाता है (Spikes 31-60)।</p>
<p>जून 2026 अपडेट: Part 30 में एक collision-aware camera जोड़ा गया, एक spring-arm boom जिसमें pluggable collider contract है और एक signed-distance probe जो view को overhangs और cave ceilings के सामने रोकती है, सिर्फ पहाड़ियों के सामने नहीं।</p>
<h2 id="इस-सीरीज़-में-spike-का-क्या-मतलब-है" tabindex="-1">इस सीरीज़ में &quot;spike&quot; का क्या मतलब है <a class="header-anchor" href="#इस-सीरीज़-में-spike-का-क्या-मतलब-है" aria-label="Permalink to &quot;इस सीरीज़ में &quot;spike&quot; का क्या मतलब है&quot;"></a></h2>
<p>एक spike एक छोटा, केंद्रित प्रयोग है।</p>
<p>हर spike एक जोखिम भरे सवाल को टेस्ट करता है। हम scope को कसा हुआ रखते हैं, जो मायने रखता है उसे मापते हैं, और तय करते हैं कि आगे क्या करना है। इसे एक सीखने का उपकरण समझें, कोई पॉलिश किया हुआ feature नहीं।</p>
<p>इस प्रोजेक्ट में, spikes ज़्यादातर <code>/spikes/*</code> के नीचे स्टैंडअलोन पेज हैं जिन्हें आप लाइव चला सकते हैं।</p>
<h2 id="सीरीज़-को-क्रम-में-पढ़ें" tabindex="-1">सीरीज़ को क्रम में पढ़ें <a class="header-anchor" href="#सीरीज़-को-क्रम-में-पढ़ें" aria-label="Permalink to &quot;सीरीज़ को क्रम में पढ़ें&quot;"></a></h2>
<ol>
<li><a href="/hi/blog/2026-02-25-open-world-browser-part-01-risk-first.html">Part 1: We started by trying to break it</a></li>
<li><a href="/hi/blog/2026-02-25-open-world-browser-part-02-worker-physics.html">Part 2: Worker physics and the input lag fear</a></li>
<li><a href="/hi/blog/2026-02-25-open-world-browser-part-03-the-unflashy-spikes.html">Part 3: The unflashy spikes that saved us</a></li>
<li><a href="/hi/blog/2026-02-25-open-world-browser-part-04-streaming-before-fancy.html">Part 4: Streaming before fancy terrain</a></li>
<li><a href="/hi/blog/2026-02-25-open-world-browser-part-05-budgeting-the-pretty.html">Part 5: Budgeting the pretty stuff</a></li>
<li><a href="/hi/blog/2026-02-25-open-world-browser-part-06-clipmaps.html">Part 6: Clipmaps changed the plot</a></li>
<li><a href="/hi/blog/2026-02-25-open-world-browser-part-07-marching-cubes.html">Part 7: Marching cubes and the first real caves</a></li>
<li><a href="/hi/blog/2026-02-25-open-world-browser-part-08-webgpu-integration.html">Part 8: Integration without losing our baseline</a></li>
<li><a href="/hi/blog/2026-02-25-open-world-browser-part-09-transvoxel-first-cut.html">Part 9: Transvoxel started with a scaffold</a></li>
<li><a href="/hi/blog/2026-02-25-open-world-browser-part-10-seam-chaos.html">Part 10: Seam chaos and the corner boss fight</a></li>
<li><a href="/hi/blog/2026-02-25-open-world-browser-part-11-policy-modes.html">Part 11: Policy mode, not hardcoded mode</a></li>
<li><a href="/hi/blog/2026-02-25-open-world-browser-part-12-lessons.html">Part 12: Rings, sky fog, and what we would do again</a></li>
<li><a href="/hi/blog/2026-04-13-open-world-browser-part-13-terrain-sculpting.html">Part 13: Terrain sculpting and the death of the math function</a></li>
<li><a href="/hi/blog/2026-04-13-open-world-browser-part-14-world-comes-alive.html">Part 14: The world comes alive</a></li>
<li><a href="/hi/blog/2026-04-13-open-world-browser-part-15-multiplayer-and-water.html">Part 15: Replace the baseline, then sync it</a></li>
<li><a href="/hi/blog/2026-04-28-open-world-browser-part-16-structure-and-authoring.html">Part 16: Structure for a world that keeps growing</a></li>
<li><a href="/hi/blog/2026-05-01-open-world-browser-part-17-animations-and-search.html">Part 17: Animations that didn't need retargeting, and a live asset search</a></li>
<li><a href="/hi/blog/2026-05-02-open-world-browser-part-18-ai-scattering.html">Part 18: A scatter brush that feels AI-placed</a></li>
<li><a href="/hi/blog/2026-05-04-open-world-browser-part-19-imposters.html">Part 19: The imposter that has to survive a forest</a></li>
<li><a href="/hi/blog/2026-05-05-open-world-browser-part-20-parallax-occlusion.html">Part 20: Faking depth on a flat plane</a></li>
<li><a href="/hi/blog/2026-05-06-open-world-browser-part-21-visibility-buffer.html">Part 21: A faster renderer that wasn't faster</a></li>
<li><a href="/hi/blog/2026-05-07-open-world-browser-part-22-clouds-and-meshlets.html">Part 22: Clouds you can light, and culling that has to be fed</a></li>
<li><a href="/hi/blog/2026-05-08-open-world-browser-part-23-avatars-and-voice.html">Part 23: Fifty avatars and a voice in the room</a></li>
<li><a href="/hi/blog/2026-05-09-open-world-browser-part-24-persistence-and-wind.html">Part 24: Saving a world, and wind you can see</a></li>
<li><a href="/hi/blog/2026-05-10-open-world-browser-part-25-universal-characters.html">Part 25: One skeleton, every outfit</a></li>
<li><a href="/hi/blog/2026-05-12-open-world-browser-part-26-water.html">Part 26: Three ways to make water</a></li>
<li><a href="/hi/blog/2026-05-13-open-world-browser-part-27-island-and-terrain.html">Part 27: An island from noise, ground that looks like ground</a></li>
<li><a href="/hi/blog/2026-05-14-open-world-browser-part-28-grass-and-occlusion.html">Part 28: Grass to the horizon, and ground that hides itself</a></li>
<li><a href="/hi/blog/2026-05-15-open-world-browser-part-29-pluggable-character.html">Part 29: One controller, any body</a></li>
<li><a href="/hi/blog/2026-06-04-open-world-browser-part-30-collision-aware-camera.html">Part 30: A camera that respects walls</a></li>
</ol>
<h2 id="लाइव-spike-मैप" tabindex="-1">लाइव spike मैप <a class="header-anchor" href="#लाइव-spike-मैप" aria-label="Permalink to &quot;लाइव spike मैप&quot;"></a></h2>
<p>अगर आप सीधे तकनीकी टाइमलाइन में क्लिक करके जाना चाहते हैं तो इनसे शुरू करें।</p>
<p><a href="/spikes/01-terrain/" target="_blank">Spike 1</a> terrain और instancing · <a href="/blog/spike-source?spike=01-terrain">source</a><br>
<a href="/spikes/02-rapier-worker/" target="_blank">Spike 2</a> worker physics · <a href="/blog/spike-source?spike=02-rapier-worker">source</a><br>
Spike 3 Durable Object broadcast लोड टेस्ट एक सर्विस स्क्रिप्ट के रूप में चला, स्टैंडअलोन पेज के रूप में नहीं<br>
Spike 4 mobile quality constraints, Spike 1 query param के ज़रिए टेस्ट किया गया<br>
Spike 5 LLM behavior reliability, एक स्क्रिप्ट के रूप में चला, स्टैंडअलोन पेज के रूप में नहीं<br>
<a href="/spikes/06-chunk-streaming/" target="_blank">Spike 6</a> chunk load और swap · <a href="/blog/spike-source?spike=06-chunk-streaming">source</a><br>
<a href="/spikes/07-gpu-vegetation/" target="_blank">Spike 7</a> density maps से vegetation · <a href="/blog/spike-source?spike=07-gpu-vegetation">source</a><br>
<a href="/spikes/08-terrain-material/" target="_blank">Spike 8</a> terrain material cost · <a href="/blog/spike-source?spike=08-terrain-material">source</a><br>
<a href="/spikes/09-csm-shadows/" target="_blank">Spike 9</a> cascaded shadows budget · <a href="/blog/spike-source?spike=09-csm-shadows">source</a><br>
<a href="/spikes/10-clipmap-geomorph/" target="_blank">Spike 10</a> clipmaps और geomorphing · <a href="/blog/spike-source?spike=10-clipmap-geomorph">source</a><br>
<a href="/spikes/11-chunk-streaming/" target="_blank">Spike 11</a> heightmap chunk streaming · <a href="/blog/spike-source?spike=11-chunk-streaming">source</a><br>
<a href="/spikes/12-webgpu-marching-cubes/" target="_blank">Spike 12</a> WebGPU marching cubes · <a href="/blog/spike-source?spike=12-webgpu-marching-cubes">source</a><br>
<a href="/spikes/13-threejs-webgpu/" target="_blank">Spike 13</a> WebGPU integration baseline · <a href="/blog/spike-source?spike=13-threejs-webgpu">source</a><br>
<a href="/spikes/14-threejs-webgpu-incremental/" target="_blank">Spike 14</a> incremental hardening · <a href="/blog/spike-source?spike=14-threejs-webgpu-incremental">source</a><br>
<a href="/spikes/15-transvoxel-seam/" target="_blank">Spike 15</a> seam scaffold · <a href="/blog/spike-source?spike=15-transvoxel-seam">source</a><br>
<a href="/spikes/16-transvoxel-face/" target="_blank">Spike 16</a> पहला Transvoxel face · <a href="/blog/spike-source?spike=16-transvoxel-face">source</a><br>
<a href="/spikes/17-dual-mc-lod/" target="_blank">Spike 17</a> dual MC LOD · <a href="/blog/spike-source?spike=17-dual-mc-lod">source</a><br>
<a href="/spikes/18-transvoxel-heightmap-seam/" target="_blank">Spike 18</a> heightmap seam · <a href="/blog/spike-source?spike=18-transvoxel-heightmap-seam">source</a><br>
<a href="/spikes/19-transvoxel-corner-grid/" target="_blank">Spike 19</a> mixed-resolution corner · <a href="/blog/spike-source?spike=19-transvoxel-corner-grid">source</a><br>
<a href="/spikes/20-gpu-transvoxel-corner/" target="_blank">Spike 20</a> GPU corner seam · <a href="/blog/spike-source?spike=20-gpu-transvoxel-corner">source</a><br>
<a href="/spikes/21-gpu-mc-transvoxel-corner/" target="_blank">Spike 21</a> GPU MC corner seam · <a href="/blog/spike-source?spike=21-gpu-mc-transvoxel-corner">source</a><br>
<a href="/spikes/22-gpu-mc-heightmap-fallback/" target="_blank">Spike 22</a> MC से HM fallback · <a href="/blog/spike-source?spike=22-gpu-mc-heightmap-fallback">source</a><br>
<a href="/spikes/23-policy-chunk-modes/" target="_blank">Spike 23</a> policy-based chunk modes · <a href="/blog/spike-source?spike=23-policy-chunk-modes">source</a><br>
<a href="/spikes/24-gpu-clipmap-rings/" target="_blank">Spike 24</a> clipmap rings और sky fog · <a href="/blog/spike-source?spike=24-gpu-clipmap-rings">source</a><br>
<a href="/spikes/25-heightmap-brush/" target="_blank">Spike 25</a> sampled data पर heightmap brush · <a href="/blog/spike-source?spike=25-heightmap-brush">source</a><br>
<a href="/spikes/26-sdf-brush/" target="_blank">Spike 26</a> GPU compute के ज़रिए SDF brush · <a href="/blog/spike-source?spike=26-sdf-brush">source</a><br>
<a href="/spikes/27-hm-mc-brush/" target="_blank">Spike 27</a> HM + MC + brush integration · <a href="/blog/spike-source?spike=27-hm-mc-brush">source</a><br>
<a href="/spikes/28-multi-material/" target="_blank">Spike 28</a> multi-material texturing · <a href="/blog/spike-source?spike=28-multi-material">source</a><br>
<a href="/spikes/29-vegetation/" target="_blank">Spike 29</a> vegetation और shader grass · <a href="/blog/spike-source?spike=29-vegetation">source</a><br>
<a href="/spikes/30-physics/" target="_blank">Spike 30</a> terrain physics और character controller · <a href="/blog/spike-source?spike=30-physics">source</a><br>
<a href="/spikes/31-multiplayer-sync/" target="_blank">Spike 31</a> multiplayer terrain sync · <a href="/blog/spike-source?spike=31-multiplayer-sync">source</a><br>
<a href="/spikes/32-water-swimming/" target="_blank">Spike 32</a> water और swimming · <a href="/blog/spike-source?spike=32-water-swimming">source</a><br>
<a href="/spikes/33-code-structure/" target="_blank">Spike 33</a> code structure refactor · <a href="/blog/spike-source?spike=33-code-structure">source</a><br>
<a href="/spikes/34-world-authoring/" target="_blank">Spike 34</a> in-world authoring · <a href="/blog/spike-source?spike=34-world-authoring">source</a><br>
<a href="/spikes/35-combat-animations/" target="_blank">Spike 35</a> combat animations और retargeting · <a href="/blog/spike-source?spike=35-combat-animations">source</a><br>
<a href="/spikes/36-polyhaven-models/" target="_blank">Spike 36</a> लाइव Poly Haven asset search · <a href="/blog/spike-source?spike=36-polyhaven-models">source</a><br>
<a href="/spikes/37-ai-scattering/" target="_blank">Spike 37</a> AI-assisted prop scattering · <a href="/blog/spike-source?spike=37-ai-scattering">source</a><br>
<a href="/spikes/38-imposters/" target="_blank">Spike 38</a> octahedral imposters · <a href="/blog/spike-source?spike=38-imposters">source</a><br>
<a href="/spikes/39-parallax-pom/" target="_blank">Spike 39</a> parallax occlusion mapping · <a href="/blog/spike-source?spike=39-parallax-pom">source</a><br>
<a href="/spikes/40-visibility-buffer/" target="_blank">Spike 40</a> visibility buffer renderer · <a href="/blog/spike-source?spike=40-visibility-buffer">source</a><br>
<a href="/spikes/41-imposter-forest/" target="_blank">Spike 41</a> एक forest में imposters · <a href="/blog/spike-source?spike=41-imposter-forest">source</a><br>
<a href="/spikes/42-imposter-flicker/" target="_blank">Spike 42</a> imposter flicker fix · <a href="/blog/spike-source?spike=42-imposter-flicker">source</a><br>
<a href="/spikes/43-clouds-atmosphere/" target="_blank">Spike 43</a> atmosphere और volumetric clouds · <a href="/blog/spike-source?spike=43-clouds-atmosphere">source</a><br>
<a href="/spikes/44-meshlet-clusters/" target="_blank">Spike 44</a> meshlet Hi-Z culling · <a href="/blog/spike-source?spike=44-meshlet-clusters">source</a><br>
<a href="/spikes/45-avatar-network-sync/" target="_blank">Spike 45</a> batched avatar skinning और network sync · <a href="/blog/spike-source?spike=45-avatar-network-sync">source</a><br>
<a href="/spikes/46-proximity-voice/" target="_blank">Spike 46</a> proximity voice chat · <a href="/blog/spike-source?spike=46-proximity-voice">source</a><br>
<a href="/spikes/47-world-persistence/" target="_blank">Spike 47</a> server-authoritative world persistence · <a href="/blog/spike-source?spike=47-world-persistence">source</a><br>
Spike 48 avatar rig integration, बाद के spikes ने shared code के रूप में दोबारा इस्तेमाल किया (कोई स्टैंडअलोन पेज नहीं)<br>
<a href="/spikes/49-gpu-wind-props/" target="_blank">Spike 49</a> props और foliage पर GPU wind · <a href="/blog/spike-source?spike=49-gpu-wind-props">source</a><br>
<a href="/spikes/50-universal-characters/" target="_blank">Spike 50</a> universal characters और wearables · <a href="/blog/spike-source?spike=50-universal-characters">source</a><br>
<a href="/spikes/51-water-ssr-caustics/" target="_blank">Spike 51</a> screen-space reflection water · <a href="/blog/spike-source?spike=51-water-ssr-caustics">source</a><br>
<a href="/spikes/52-water-planar/" target="_blank">Spike 52</a> planar mirror water · <a href="/blog/spike-source?spike=52-water-planar">source</a><br>
<a href="/spikes/53-water-pro/" target="_blank">Spike 53</a> production water library · <a href="/blog/spike-source?spike=53-water-pro">source</a><br>
<a href="/spikes/54-procgen-island/" target="_blank">Spike 54</a> procedural island generation · <a href="/blog/spike-source?spike=54-procgen-island">source</a><br>
<a href="/spikes/55-terrain-shading/" target="_blank">Spike 55</a> terrain shading और tiling breakup · <a href="/blog/spike-source?spike=55-terrain-shading">source</a><br>
<a href="/spikes/56-grass/" target="_blank">Spike 56</a> GPU cross-quad grass · <a href="/blog/spike-source?spike=56-grass">source</a><br>
<a href="/spikes/57-terrain-occlusion/" target="_blank">Spike 57</a> terrain occlusion culling · <a href="/blog/spike-source?spike=57-terrain-occlusion">source</a><br>
<a href="/spikes/58-pluggable-character/" target="_blank">Spike 58</a> pluggable character controller · <a href="/blog/spike-source?spike=58-pluggable-character">source</a><br>
<a href="/spikes/59-pluggable-with-avatar/" target="_blank">Spike 59</a> एक असली avatar के साथ controller · <a href="/blog/spike-source?spike=59-pluggable-with-avatar">source</a><br>
<a href="/spikes/60-polygon-animations/" target="_blank">Spike 60</a> Synty polygon animations · <a href="/blog/spike-source?spike=60-polygon-animations">source</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[A Breaker Belt: Snake और Arkanoid का मेल, तीन दिन में vibe coded]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-02-18-a-breaker-belt</link>
            <guid>https://app.cinevva.com/hi/blog/2026-02-18-a-breaker-belt</guid>
            <pubDate>Wed, 18 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[एक cosmic serpent 50 waves में bricks तोड़ता है, reactive music, AI narration और 23 brick types के साथ। दो लोग। तीन दिन। Web, mobile और PC।]]></description>
            <content:encoded><![CDATA[<h1 id="a-breaker-belt-snake-और-arkanoid-का-मेल-तीन-दिन-में-vibe-coded" tabindex="-1">A Breaker Belt: Snake और Arkanoid का मेल, तीन दिन में vibe coded <a class="header-anchor" href="#a-breaker-belt-snake-और-arkanoid-का-मेल-तीन-दिन-में-vibe-coded" aria-label="Permalink to &quot;A Breaker Belt: Snake और Arkanoid का मेल, तीन दिन में vibe coded&quot;"></a></h1>
<p><em><a href="/hi/about.html">Mariana Muntean</a> द्वारा, Cinevva की CEO</em></p>
<img src="https://cdn.cinevva.com/blog/breaker-belt-cover.webp" alt="A Breaker Belt gameplay: a neon cosmic serpent breaking bricks in space" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>हमने एक ऐसा game बनाया जहाँ आपका snake ही paddle है और bricks पलटवार करती हैं। यह web, mobile और PC पर ship हुआ। हम दो लोगों को इसमें लगभग तीन दिन लगे। बीच-बीच में काम किया, कोई crunch नहीं। और इसे खेलना सच में मज़ेदार है।</p>
<p>ध्यान देने लायक बात आखिरी वाली है।</p>
<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;border-radius:8px;margin:1.5rem 0">
<iframe src="https://www.youtube.com/embed/VaFkfCT3OuU" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0" allow="accelerometer;autoplay;clipboard-write;encrypted-media;gyroscope;picture-in-picture" allowfullscreen></iframe>
</div>
<h2 id="वह-मेल-जो-किसी-ने-माँगा-नहीं-था" tabindex="-1">वह मेल जो किसी ने माँगा नहीं था <a class="header-anchor" href="#वह-मेल-जो-किसी-ने-माँगा-नहीं-था" aria-label="Permalink to &quot;वह मेल जो किसी ने माँगा नहीं था&quot;"></a></h2>
<p>Snake बढ़त और spatial awareness के बारे में है। Arkanoid reflexes और angle अंदाज़े के बारे में है। ये दोनों बिल्कुल अलग design सोच से आते हैं, और इन्हें आपस में मिलाने का ख्याल ऐसा pitch लगता है जिसे शिष्टता से ठुकरा दिया जाए।</p>
<p>लेकिन <a href="https://app.cinevva.com/engine" target="_blank" rel="noreferrer">A Breaker Belt</a> इसे चला देता है। आप एक cosmic serpent हैं, neon current का एक जीवित चाप, जो drift-metal कशेरुकाओं और comet silk से बुना है, और टूटने वाले blocks के एक asteroid field से गुज़रता है। आपका सिर paddle है। आपकी बढ़ती पूँछ ही आपका सबसे बड़ा हथियार है और सबसे लगातार बना रहने वाला ख़तरा भी। Orbs आपके शरीर से टकराकर bricks चकनाचूर करते हैं, पर अपनी ही पूँछ में एक गलत मोड़ और आपका खेल खत्म।</p>
<p>यह उस तरह का अजीब cross-genre प्रयोग है जो आमतौर पर किसी के खेलने से पहले ही दम तोड़ देता है, क्योंकि किसी अजीब idea के चलने की जाँच करने की development लागत परंपरागत रूप से महीनों में नापी जाती रही है। यहाँ यह दोपहरों में नापी गई।</p>
<h2 id="असल-में-जो-ship-हुआ" tabindex="-1">असल में जो ship हुआ <a class="header-anchor" href="#असल-में-जो-ship-हुआ" aria-label="Permalink to &quot;असल में जो ship हुआ&quot;"></a></h2>
<p>scope ही इसे दिलचस्प बनाता है। यह placeholder rectangles और बिना sound वाला कोई game jam prototype नहीं है।</p>
<p>Game 50 waves गहरा चलता है। यह एक ही brick wall की 50 variations नहीं हैं। Formations हल्के onboarding arcs से बदलकर ऐसे fortress rings बन जाती हैं जो side gaps से angled shots माँगती हैं, फिर एक-tile चौड़े खुलाव वाली परतदार diagonal भूलभुलैयाँ बन जाती हैं जिनमें सटीक steering चाहिए। Explosive bricks अपने पड़ोसियों को उड़ा देती हैं। Phantom bricks आती-जाती झिलमिलाती हैं। Regenerating bricks तोड़ने के बाद फिर ठीक हो जाती हैं, जिससे आपको बाएँ से दाएँ साफ़ करने के बजाय targets को प्राथमिकता देनी पड़ती है। Portal bricks आपके orbs को arena के पार teleport कर देती हैं। Gravity wells आपके shots को धीमे, मुड़ते भजनों में मोड़ देते हैं। Laser emitters शून्य के पार लाल रेखाएँ खींचते हैं। Mimic bricks तब तक हानिरहित दिखती हैं जब तक वे तय न कर लें कि वे नहीं हैं। Wave 15 तक, आप किसी ऐसी चीज़ में चल रहे होते हैं जो किसी puzzle से कम और आपकी आदतें सीख रहे एक जीवित system से ज़्यादा लगती है।</p>
<p>Music कोई loop नहीं है। यह एक reactive soundtrack है जो आपके gameplay के साथ बनती जाती है। नीचे का system E minor में 140 BPM पर एक bass line, lead synth, pad, kick, snare और hi-hat चलाता है, और जैसे-जैसे action तेज़ होता है, अतिरिक्त percussion और synth layers fade in होती जाती हैं। Waves के बीच जब चीज़ें शांत होती हैं, ambient pads संभाल लेते हैं। Music आपके साथ साँस लेती है। एक समर्पित composer उस तरह की responsiveness को tune करने में हफ़्ते लगा देता। यहाँ यह creative flow का हिस्सा थी।</p>
<p>Sound effects किसी free pack से खींचे गए samples नहीं हैं। हर brick का चकनाचूर होना, power-up उठाना, orb का उछाल और टक्कर real time में synthesize होती है। सिर की टक्कर बनाम पूँछ की टक्कर के लिए अलग pitch। अंतरिक्षी एहसास के लिए गर्म reverb। चीज़ों को कठोर हुए बिना संतोषजनक रखने के लिए lowpass filtering। जब आप एक combo जोड़ते हैं, audio आपको screen से पहले बता देती है।</p>
<p>और फिर है storytelling। हर wave AI-generated आवाज़ में दिए गए एक narrative beat से खुलती है। लेखन में सच्चा व्यक्तित्व है। Wave one: &quot;They call it the Breaker Belt: a ribbon of engineered debris that circles the old star like a warning.&quot; Wave 38 तक: &quot;The Belt stops feeling like a wall and starts feeling like a mind. It tests not your reflexes, but your habits. You break the habit. The Belt notices.&quot; यह cosmic पुराणकथा के 50 अध्याय हैं जो आपको इस बात की परवाह करवाते हैं कि आप अंतरिक्ष में bricks तोड़ता एक snake क्यों हैं।</p>
<p>Backgrounds भी बदलते हैं। शुरुआती waves शांत indigo starfields हैं जिन पर हल्की meteor बारिश होती है। Mid-game तक, aurora bands और nebula बादल दिखने लगते हैं। Late game पूरा Ion Storm बन जाता है, लगभग काले अंतरिक्ष के सामने तीखी cyan धारियाँ। Wave 15 और उसके आगे, आप Event Horizon वाले इलाके में हैं: धीमे चलते nebula तंतुओं और मद्धम black hole lensing से बिंधा गहरा शून्य। Game अपनी प्रगति को difficulty जितना ही माहौल के ज़रिए भी बताता है।</p>
<p>यह सब keyboard, gamepad या touchscreen पर चलता है। एक ही codebase से web, mobile और PC पर publish किया गया। कोई अलग builds नहीं। कोई porting नहीं।</p>
<h2 id="वह-team-जिसकी-ज़रूरत-नहीं-पड़ी" tabindex="-1">वह team जिसकी ज़रूरत नहीं पड़ी <a class="header-anchor" href="#वह-team-जिसकी-ज़रूरत-नहीं-पड़ी" aria-label="Permalink to &quot;वह team जिसकी ज़रूरत नहीं पड़ी&quot;"></a></h2>
<p>यह वह हिस्सा है जिस पर किसी भी game developer को रुककर सोचना चाहिए।</p>
<p>इतनी content गहराई वाले game को आमतौर पर एक game designer, दो प्रोग्रामर, एक 2D artist, एक sound designer, एक music composer, एक level designer, एक narrative writer और QA चाहिए होता है। यह आठ या नौ लोग हुए। एक मध्यम indie रफ़्तार पर, आप तीन से छह महीने के समन्वित काम की बात कर रहे हैं। Standups, Jira tickets, asset pipelines, platform-specific debugging।</p>
<p>हम दो लोगों ने यह एक लंबे weekend में <a href="https://app.cinevva.com/engine" target="_blank" rel="noreferrer">Cinevva Engine</a> पर बनाया।</p>
<p>ज़रूरी प्रतिभा नहीं बदली। creative इरादे और implementation के बोझ के बीच का अनुपात बदला। समय इस बात पर तय करने में लगा कि game कैसा महसूस होना चाहिए, न कि उसे बनाने के लिए tools से जूझने में।</p>
<h2 id="अगर-आप-चीज़ें-बनाते-हैं-तो-यह-क्यों-मायने-रखता-है" tabindex="-1">अगर आप चीज़ें बनाते हैं तो यह क्यों मायने रखता है <a class="header-anchor" href="#अगर-आप-चीज़ें-बनाते-हैं-तो-यह-क्यों-मायने-रखता-है" aria-label="Permalink to &quot;अगर आप चीज़ें बनाते हैं तो यह क्यों मायने रखता है&quot;"></a></h2>
<p>दिलचस्प सवाल यह नहीं है कि AI tools games को तेज़ी से बनाने में मदद कर सकते हैं या नहीं। इसका जवाब मिल चुका है। दिलचस्प सवाल यह है कि उन ideas का क्या होता है जिन्हें आज़माना पहले बहुत जोखिम भरा था।</p>
<p>&quot;Snake पर आप ही Arkanoid arena में paddle हैं&quot; ऐसी कोई चीज़ नहीं जिसे कोई producer हरी झंडी दे। कुछ indie devs ने itch.io पर इस मेल की variations आज़माई हैं (<a href="https://newdron.itch.io/breaksnake" target="_blank" rel="noreferrer">BreakSnake</a>, <a href="https://neop87.itch.io/snakeout" target="_blank" rel="noreferrer">SnakeOut</a>, <a href="https://merrak.itch.io/snake-break" target="_blank" rel="noreferrer">Snake Break</a>), पर वे सब छोटे game jam प्रयोग हैं। इस genre fusion को reactive music, AI narration, दर्जनों brick types और बढ़ते level design की 50 waves के साथ कभी असली production में नहीं उतारा गया। परंपरागत development में, किसी जोखिम भरे concept पर उस तरह की चमक किसी के एक line कोड लिखने से पहले ही एक meeting में मार दी जाती है।</p>
<p>जब कुछ अजीब आज़माने में एक तिमाही के बजट के बजाय एक दोपहर लगती है, तब अजीब ideas बनते हैं। उनमें से कुछ सच में अच्छे निकलते हैं। A Breaker Belt उन्हीं में से एक है।</p>
<h2 id="इसे-खेलें।-या-अपना-बनाएँ।" tabindex="-1">इसे खेलें। या अपना बनाएँ। <a class="header-anchor" href="#इसे-खेलें।-या-अपना-बनाएँ।" aria-label="Permalink to &quot;इसे खेलें। या अपना बनाएँ।&quot;"></a></h2>
<p><a href="https://app.cinevva.com/engine" target="_blank" rel="noreferrer">A Breaker Belt</a> अभी web, mobile और PC पर खेलने योग्य है। अगर यह आपको कुछ बनाने का मन कराता है, तो <a href="https://app.cinevva.com/engine" target="_blank" rel="noreferrer">Cinevva Engine</a> मुफ़्त है। बताएँ कि आप क्या चाहते हैं, जो वापस आए उस पर iterate करें, तैयार होने पर ship करें। <a href="https://app.cinevva.com/tools/music" target="_blank" rel="noreferrer">music</a>, <a href="https://app.cinevva.com/tools/sfx" target="_blank" rel="noreferrer">sound effects</a>, <a href="https://app.cinevva.com/tools/flux" target="_blank" rel="noreferrer">art</a> और <a href="https://app.cinevva.com/tools/hunyuan3d" target="_blank" rel="noreferrer">3D models</a> सब built in हैं।</p>
<p>आपका अजीब game idea शायद बनने से सिर्फ़ तीन दिन दूर है।</p>
<hr>
<p><em><a href="https://app.cinevva.com/engine" target="_blank" rel="noreferrer">A Breaker Belt खेलें</a> | <a href="https://app.cinevva.com/engine" target="_blank" rel="noreferrer">अपना game बनाएँ</a> | <a href="https://cinevva.com/charts" target="_blank" rel="noreferrer">community games देखें</a></em></p>
<p><strong>संबंधित:</strong></p>
<ul>
<li><a href="/hi/signals/2026-03-13-vibe-coding-new-game-jam.html">Vibe coding नया game jam है</a> — AI tools idea और prototype के बीच की दूरी कैसे मिटा देते हैं</li>
<li><a href="/hi/guides/game-jams-hackathons.html">Game Jams और Hackathons</a> — वह jam format जो अजीब मेल को मुमकिन बनाता है</li>
<li><a href="/hi/guides/web-game-engines-comparison.html">Web Game Engines की तुलना</a> — web, mobile और PC पर ship करने के engines</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[हमने रेडियो स्टेशन बनाने की उम्मीद नहीं की थी]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-02-17-we-didnt-expect-a-radio-station</link>
            <guid>https://app.cinevva.com/hi/blog/2026-02-17-we-didnt-expect-a-radio-station</guid>
            <pubDate>Tue, 17 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Cinevva पर हमारे पास एक म्यूजिक जनरेटर है ताकि game creators साउंडट्रैक बना सकें। लोग सिर्फ इसलिए म्यूजिक बनाने लगे क्योंकि वे बना सकते थे। 362 ट्रैक के बाद, Cinevva Radio लाइव है।]]></description>
            <content:encoded><![CDATA[<h1 id="हमने-रेडियो-स्टेशन-बनाने-की-उम्मीद-नहीं-की-थी" tabindex="-1">हमने रेडियो स्टेशन बनाने की उम्मीद नहीं की थी <a class="header-anchor" href="#हमने-रेडियो-स्टेशन-बनाने-की-उम्मीद-नहीं-की-थी" aria-label="Permalink to &quot;हमने रेडियो स्टेशन बनाने की उम्मीद नहीं की थी&quot;"></a></h1>
<p><em><a href="/hi/about.html">Mariana Muntean</a> द्वारा, Cinevva की CEO</em></p>
<img src="https://cdn.cinevva.com/blog/cinevva-radio-lofi-cafe.png" alt="Cinevva Community Radio with 8 stations including Soundstage, Voltage, Lo-Fi Cafe, Main Stage, Ivory Tower, and Electric Dreams, currently playing Quiet Flute Drone" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<p>Cinevva प्लेटफ़ॉर्म पर हमारे पास एक <a href="https://app.cinevva.com/tools/music" target="_blank" rel="noreferrer">म्यूजिक जनरेटर</a> है ताकि game creators लाइसेंसिंग की झंझट के बिना गेम साउंडट्रैक और SFX बना सकें। इसके बाद जो हुआ, उसकी हमने योजना नहीं बनाई थी। लोग म्यूजिक बनाने लगे क्योंकि वे म्यूजिक बनाना चाहते थे। गेम या प्रोजेक्ट के लिए नहीं। सिर्फ म्यूजिक प्रोडक्शन के लिए।</p>
<h2 id="bella-bay-ने-दो-हफ़्तों-में-100-से-ज़्यादा-ट्रैक-बनाए" tabindex="-1">Bella Bay ने दो हफ़्तों में 100 से ज़्यादा ट्रैक बनाए <a class="header-anchor" href="#bella-bay-ने-दो-हफ़्तों-में-100-से-ज़्यादा-ट्रैक-बनाए" aria-label="Permalink to &quot;Bella Bay ने दो हफ़्तों में 100 से ज़्यादा ट्रैक बनाए&quot;"></a></h2>
<p>मैं बढ़ा-चढ़ाकर नहीं कह रही। हमारी एक creator, Bella Bay, ने करीब दो हफ़्तों में 100 से ज़्यादा ट्रैक बनाए। जब आप उन्हें <a href="https://cinevva.com/radio" target="_blank" rel="noreferrer">Cinevva Radio</a> पर सुनते हैं, तो आपको प्रगति सुनाई देती है। शुरुआती ट्रैक प्रयोग हैं। बाद वाले ऐसे लगते हैं जैसे किसी ने अपना अंदाज़ पा लिया हो। ऐसी रचनात्मक तेज़ी तब नहीं आती जब आप अपने टूल्स से जूझ रहे होते हैं। यह तब आती है जब टूल्स रास्ते से हट जाते हैं।</p>
<p>Bella Bay भावना के मामले में कोई अपवाद नहीं है, बस मात्रा के मामले में है। पूरे प्लेटफ़ॉर्म पर लोग म्यूजिक जनरेटर को गेम असेट्स के लिए एक उपयोगिता की तरह नहीं, बल्कि एक रचनात्मक वाद्य की तरह बरतने लगे। प्रोड्यूसर ऐसी विधाओं के साथ प्रयोग कर रहे हैं जो उन्होंने पहले कभी नहीं आज़माईं। लोग किसी आवाज़ पर तब तक काम करते रहे जब तक वह सही नहीं बैठ गई। ऐसे बेडरूम आर्टिस्ट जिनके पास कभी पूरा प्रोडक्शन टूलकिट नहीं था, उनके पास अचानक एक आ गया और वे पूरी तरह डूब गए।</p>
<h2 id="तो-हमने-एक-रेडियो-बनाया" tabindex="-1">तो हमने एक रेडियो बनाया <a class="header-anchor" href="#तो-हमने-एक-रेडियो-बनाया" aria-label="Permalink to &quot;तो हमने एक रेडियो बनाया&quot;"></a></h2>
<p>यह करना ही था।</p>
<p>हमारे पास ये सारे ट्रैक लोगों के अकाउंट में पड़े थे, बिना किसी साझा जगह के। दूसरे क्या बना रहे हैं, यह जानने का कोई तरीका नहीं था। किसी ऐसे ट्रैक से टकराने का कोई तरीका नहीं था जो आपकी दोपहर बदल दे।</p>
<p><a href="https://cinevva.com/radio" target="_blank" rel="noreferrer">Cinevva Radio</a> अब लाइव है। आठ स्टेशन। 362 community-created ट्रैक और हर दिन बढ़ते जा रहे हैं। हर एक गाना प्लेटफ़ॉर्म पर किसी न किसी ने बनाया है। आप इसे खोलते हैं और कुछ बज रहा होता है। आपको खोजना नहीं पड़ता। आपको तय नहीं करना पड़ता। आप बस सुनते हैं।</p>
<p><strong><a href="https://cinevva.com/radio#cinematic" target="_blank" rel="noreferrer">Soundstage</a></strong> हमारा सबसे बड़ा स्टेशन है। सिनेमैटिक और एपिक स्कोर के 111 ट्रैक। सच कहूं तो मुझे इसका अंदाज़ा नहीं था। लोगों को नाटकीय, फिल्मी अंदाज़ का म्यूजिक बनाना बहुत पसंद है।</p>
<p><strong><a href="https://cinevva.com/radio#mixed" target="_blank" rel="noreferrer">Discovery</a></strong> ने वह सब समेट लिया जो किसी एक विधा में ठीक से फिट नहीं बैठता। 78 ट्रैक। लैटिन बीट्स के बगल में Afrobeats, उसके बगल में country, और उसके बगल में कुछ ऐसा जिसे बयान करना मुश्किल है। यह स्टेशन बेहद रंगीन है।</p>
<p><strong><a href="https://cinevva.com/radio#pop" target="_blank" rel="noreferrer">Main Stage</a></strong> पॉप और वोकल ट्रैक हैं। पूरे बोल और वोकल्स के साथ 56 ट्रैक। लोग प्रेम गीत, ब्रेकअप गीत, भक्ति संगीत, और ग़ज़लनुमा गीत लिख रहे हैं। इनमें से कुछ वाकई कानों में बस जाने वाले हैं।</p>
<p><strong><a href="https://cinevva.com/radio#rock" target="_blank" rel="noreferrer">Voltage</a></strong> रॉक और मेटल है। 53 ट्रैक। गिटार रिफ़, पंक एनर्जी, grunge, हार्ड रॉक। काम करते वक़्त मैं इसे चलाए रखती हूं।</p>
<p><strong><a href="https://cinevva.com/radio#lofi" target="_blank" rel="noreferrer">Lo-Fi Cafe</a></strong> बिल्कुल वैसा ही है जैसा नाम से लगता है। पढ़ाई, काम, या यूं ही माहौल बनाने के लिए 25 शांत ambient ट्रैक।</p>
<p><strong><a href="https://cinevva.com/radio#electronic" target="_blank" rel="noreferrer">Electric Dreams</a></strong> में 22 इलेक्ट्रॉनिक और synth ट्रैक हैं। Synthwave, techno, EDM, drum and bass।</p>
<p><strong><a href="https://cinevva.com/radio#classical" target="_blank" rel="noreferrer">Ivory Tower</a></strong> क्लासिकल और ऑर्केस्ट्रल है। 10 ट्रैक। पियानो की रचनाएं, string अरेंजमेंट, सिम्फनी जैसा संगीत। छोटा है पर बढ़ रहा है।</p>
<p><strong><a href="https://cinevva.com/radio#hiphop" target="_blank" rel="noreferrer">The Cipher</a></strong> हिप-हॉप और रैप है। अब तक 7 ट्रैक। सबसे नया स्टेशन, अभी अपनी आवाज़ तलाश रहा है।</p>
<h2 id="जब-आप-सुनते-हैं-तो-आपको-क्या-दिखता-है" tabindex="-1">जब आप सुनते हैं तो आपको क्या दिखता है <a class="header-anchor" href="#जब-आप-सुनते-हैं-तो-आपको-क्या-दिखता-है" aria-label="Permalink to &quot;जब आप सुनते हैं तो आपको क्या दिखता है&quot;"></a></h2>
<p>जब आप <a href="https://cinevva.com/radio" target="_blank" rel="noreferrer">Cinevva Radio</a> खोलते हैं, तो यह एक लाइव स्ट्रीम है। इसे प्लेलिस्ट ऐप से कम और असल रेडियो स्टेशन से ज़्यादा मिलता-जुलता समझिए। ट्रैक लगातार बजते रहते हैं। आप रियल टाइम में प्रतिक्रिया दे सकते हैं, दूसरे श्रोताओं से चैट कर सकते हैं, और देख सकते हैं कि हर ट्रैक किसने बनाया।</p>
<p>ट्रैक बजते वक़्त creators को स्क्रीन पर श्रेय मिलता है। उनका नाम, उनका prompt, विधा। अगर आपको कुछ पसंद आता है, तो आपको पता होता है कि उसे किसने बनाया। यह community-created कंटेंट है जिसके ऊपर एक discovery परत है। कोई एल्गोरिदम तय नहीं करता कि क्या लायक है। कोई द्वारपाल नहीं। आपने एक ट्रैक बनाया, वह उस स्टेशन पर जाता है जो उसकी विधा से मेल खाता है, और लोग उसे सुनते हैं।</p>
<h2 id="यह-एक-फीचर-से-कहीं-बड़ी-बात-है" tabindex="-1">यह एक फीचर से कहीं बड़ी बात है <a class="header-anchor" href="#यह-एक-फीचर-से-कहीं-बड़ी-बात-है" aria-label="Permalink to &quot;यह एक फीचर से कहीं बड़ी बात है&quot;"></a></h2>
<p>दशकों तक, म्यूजिक प्रोडक्शन के लिए महंगा सॉफ़्टवेयर, सालों की ट्रेनिंग, और ऐसे उपकरण चाहिए होते थे जिन्हें ज़्यादातर लोग खरीद नहीं सकते थे। हम जो देख रहे हैं वह एक अलग किस्म का creator है। ऐसे लोग जो नोट्स और टाइम सिग्नेचर के बजाय वर्णनों और भावनाओं में सोचते हैं।</p>
<p>&quot;टूटे हुए पियानो के साथ बरसाती रात का jazz&quot; एक रचनात्मक दिशा है। जिसने वह prompt लिखा, उसने एक कलात्मक चुनाव किया। उसने मूड, वाद्य-संयोजन, और भावनात्मक स्तर को दिशा दी। बस इतना है कि वह पियानो नहीं बजाता।</p>
<p>मुझे नहीं लगता कि इससे उनकी रचना कम मान्य हो जाती है। मुझे लगता है इसका मतलब है कि &quot;संगीतकार&quot; की परिभाषा फैल रही है। और Bella Bay जैसे किसी को दो हफ़्तों में शून्य से सौ ट्रैक तक पहुंचते देखना मुझे बताता है कि रचनात्मक प्रेरणा हमेशा से थी। बस टूल्स नहीं थे।</p>
<h2 id="आगे-क्या" tabindex="-1">आगे क्या <a class="header-anchor" href="#आगे-क्या" aria-label="Permalink to &quot;आगे क्या&quot;"></a></h2>
<p>हम community profiles पर काम कर रहे हैं जहां प्रोड्यूसर अपना कैटलॉग दिखा सकेंगे और एक फॉलोइंग बना सकेंगे। <a href="https://cinevva.com/charts" target="_blank" rel="noreferrer">charts पेज</a> पहले से ही सभी टूल्स में community की रचनाएं दिखाता है, और हम वही जोश ख़ास तौर पर म्यूजिक के लिए लाना चाहते हैं।</p>
<p>लेकिन अभी, रेडियो लाइव है। <a href="https://cinevva.com/radio" target="_blank" rel="noreferrer">जाकर सुनिए</a>। और अगर आप अपने ट्रैक बनाना चाहते हैं, तो <a href="https://app.cinevva.com/tools/music" target="_blank" rel="noreferrer">म्यूजिक जनरेटर</a> मुफ़्त इस्तेमाल के लिए है। हो सकता है आपका ट्रैक भी हवा में बजने लगे।</p>
<hr>
<p><em><a href="https://cinevva.com/radio" target="_blank" rel="noreferrer">Cinevva Radio सुनें</a> | <a href="https://app.cinevva.com/tools/music" target="_blank" rel="noreferrer">म्यूजिक बनाएं</a> | <a href="https://cinevva.com/charts" target="_blank" rel="noreferrer">community की रचनाएं देखें</a></em></p>
<p><strong>संबंधित:</strong></p>
<ul>
<li><a href="/hi/guides/frontier-gen-ai-models.html">Frontier Open-Source Gen AI Models</a> — पर्दे के पीछे काम करने वाले AI म्यूजिक और ऑडियो मॉडल</li>
<li><a href="/hi/tutorials/web-audio-api-games.html">गेम्स के लिए Web Audio API</a> — browser में इंटरैक्टिव ऑडियो बनाना</li>
<li><a href="/hi/signals/2026-03-13-vibe-coding-new-game-jam.html">Vibe coding नया game jam है</a> — कैसे इरादे का वर्णन करना प्राथमिक रचनात्मक इनपुट बन जाता है</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AI के दौर में सहज समझ वाला दिमाग]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-02-10-the-intuitive-mind</link>
            <guid>https://app.cinevva.com/hi/blog/2026-02-10-the-intuitive-mind</guid>
            <pubDate>Tue, 10 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Jensen Huang कहते हैं कि अब सिर्फ़ गणित की कच्ची कुशलता एक commodity बन चुकी है। यहाँ बता रही हूँ कि यह बात उस इंसान को क्यों इतनी सटीक लगी जिसने SAT में फ़ेल होकर, नियमों को नज़रअंदाज़ करके वह चीज़ बनाई जो लोग सचमुच चाहते थे।]]></description>
            <content:encoded><![CDATA[<h1 id="ai-के-दौर-में-सहज-समझ-वाला-दिमाग" tabindex="-1">AI के दौर में सहज समझ वाला दिमाग <a class="header-anchor" href="#ai-के-दौर-में-सहज-समझ-वाला-दिमाग" aria-label="Permalink to &quot;AI के दौर में सहज समझ वाला दिमाग&quot;"></a></h1>
<p><em>लिखा है <a href="/hi/about.html">Mariana Muntean</a> ने, Cinevva की CEO</em></p>
<img src="https://cdn.cinevva.com/blog/game-jam-houston-2018.png" alt="Mariana Muntean with classmates during a 48 hours game jam in Houston 2018" style="width:100%;border-radius:8px;margin:1.5rem 0" />
<small>ह्यूस्टन में 2018 के एक 48 घंटे के game jam के दौरान सहपाठियों के साथ</small>
<p>AI ने मूल रूप से कच्चे logic और गणना करने की क्षमता को एक commodity बना दिया है। जिन हुनरों की हम पहले पूजा करते थे, mental math, pattern को पहचानना, जटिल algorithms को घिसते हुए हल करना, अब वह सब AI करता है। तेज़। बेहतर। बिना थके। क्या हमें अब भी यह जानना ज़रूरी है? बिलकुल, पर नज़रिया बदल जाता है। अब हर किसी को एक नए दौर के हिसाब से ढलना होगा - सहज interaction और नतीजों का दौर।</p>
<p>NVIDIA के CEO <a href="https://business.columbia.edu/insights/digital-future/nvidia-ceo-jensen-huang-reveals-keys-ai-and-leadership" target="_blank" rel="noreferrer">Jensen Huang</a> के मुताबिक, अब जो चीज़ मायने रखती है वह है एक &quot;vibe&quot; को भाँप लेने की और data सामने आने से पहले ही मोड़ के पार देख लेने की क्षमता। technical समझ और गहरी empathy का मेल। वह सहज समझ जिसे silicon छू भी नहीं सकता।</p>
<p>उसकी जैसी साख रखने वाले किसी इंसान को मैंने पहले कभी ऐसी बात कहते नहीं सुना जो मेरी पूरी ज़िंदगी की राह को इतने सीधे तौर पर सही ठहरा दे।</p>
<h2 id="sat-और-वह-सिस्टम-जो-मेरे-लिए-बना-ही-नहीं-था" tabindex="-1">SAT और वह सिस्टम जो मेरे लिए बना ही नहीं था <a class="header-anchor" href="#sat-और-वह-सिस्टम-जो-मेरे-लिए-बना-ही-नहीं-था" aria-label="Permalink to &quot;SAT और वह सिस्टम जो मेरे लिए बना ही नहीं था&quot;"></a></h2>
<p>कुछ साल पहले मैंने SAT दी और फ़ेल हो गई। मुझे इस पर गर्व नहीं है, पर मैंने दोबारा कोशिश भी नहीं की। पूरी बात में कुछ बुनियादी तौर पर गलत लग रहा था, और लोग चाहे जितना कहें कि बस और मेहनत करो और दोबारा दे दो, मैं उस एहसास से पीछा नहीं छुड़ा पाई।</p>
<p>पीछे मुड़कर देखती हूँ तो लगता है मैं सही थी।</p>
<p>SAT अमेरिकी शिक्षा व्यवस्था के लिए बनाई गई है। यह बात ज़ाहिर सी लगती है, पर इसके असर बहुत गहरे हैं। अमेरिकी हाई स्कूल खास तरह के pattern, सवालों के प्रकार, और समस्याओं को रखने के तरीकों के हिसाब से पढ़ाते हैं। बच्चे प्राथमिक स्कूल से ही उसी अंदाज़ की standardized testing में पगे हुए बड़े होते हैं। जब तक वे SAT तक पहुँचते हैं, उन्होंने उस लय को अपने भीतर उतार लिया होता है।</p>
<p>International students के पास यह फ़ायदा नहीं होता। हम अलग शैक्षिक सोच वाली व्यवस्थाओं से आते हैं। यूरोपीय स्कूल अक्सर चौड़ाई से ज़्यादा गहराई पर, multiple choice से ज़्यादा निबंध-आधारित परीक्षा पर, bubble sheets से ज़्यादा मौखिक परीक्षा पर ज़ोर देते हैं। एशियाई व्यवस्थाओं की अपनी standardized tests हैं, पर वे अलग चीज़ों को अलग तरीकों से मापती हैं। दक्षिण अमेरिकी, अफ़्रीकी, मध्य पूर्वी शैक्षिक परंपराओं की हर एक की अपनी समझ है।</p>
<p>जब आप एक international student को SAT में डालते हैं, तो आप सिर्फ़ उसका ज्ञान नहीं जाँच रहे होते। आप यह जाँच रहे होते हैं कि वह एक पराई testing संस्कृति के साथ कितनी तेज़ी से ढल सकता है, और साथ-साथ विषय पर अपनी पकड़ भी दिखा सकता है। आप शैक्षिक क्षमता जितनी ही सांस्कृतिक रवानगी भी जाँच रहे होते हैं।</p>
<p>मुझसे उम्मीद की गई कि मैं एक गर्मी की छुट्टियों में इसकी तैयारी करूँ और इसमें छा जाऊँ। एक पूरी testing संस्कृति सीखूँ, अपनी ही शैक्षिक सहज समझ को भुला दूँ, और उस स्तर पर performance दूँ जो अमेरिकी admissions अधिकारियों को प्रभावित कर दे। और यह सब बस कुछ महीनों में।</p>
<p>मैंने ऐसा न करना चुना।</p>
<p>जब आप जवान होते हैं, तो आप अलग तरीकों से होशियार होते हैं। सहज तरीकों से। मैं अपने लिए एक राह बना रही थी, भले उस समय मैं ठीक-ठीक यह न बता पाती कि क्यों। मेरे भीतर कुछ जानता था कि यह सिस्टम मेरा नहीं है।</p>
<h2 id="इसके-बजाय-रचनात्मक-धागे-का-पीछा-करना" tabindex="-1">इसके बजाय रचनात्मक धागे का पीछा करना <a class="header-anchor" href="#इसके-बजाय-रचनात्मक-धागे-का-पीछा-करना" aria-label="Permalink to &quot;इसके बजाय रचनात्मक धागे का पीछा करना&quot;"></a></h2>
<p>मैंने game development और design पढ़ा क्योंकि मुझे यह विचार पसंद था कि creativity और visual effects का इस्तेमाल करके ऐसी virtual दुनियाएँ बनाई जाएँ जिनमें लोग खेल सकें और घुलमिल सकें। मुझे art और technology का, कहानी कहने और interactivity का मेल बहुत भाता था।</p>
<p>जो मैंने पाया उसने मुझे चौंका दिया।</p>
<p>Games के लिए गंभीर technical गहराई चाहिए। Physics simulations, collision detection, vector math, lighting calculations, optimization। यह मैं पहले से जानती थी। math और engineering game development में रुकावट नहीं हैं। वे उसी का हिस्सा हैं जो games को चलाती है।</p>
<p>समस्या रचनात्मक vision और उसे असल में बनाने के बीच की खाई थी। industry पर हावी engines और tools engineers ने engineers के लिए डिज़ाइन किए थे। सब कुछ &quot;ifs&quot; और &quot;thens&quot; और node-based blueprints पर चलता था। आपको एक vortex effect चाहिए? shader programming सीखो। कोई खास lighting वाला माहौल? material graphs में घुसो। ऐसी character movement जो सही महसूस हो? character controller या physics parameters को घंटों debug करो।</p>
<p>अगर आप एक visual इंसान हैं, अगर आप चटख रंगों और चलती तस्वीरों में सोचते हैं, अगर विचार आपके पास आवाज़, बनावट और भावनात्मक वज़न के साथ पूरे-पूरे दृश्यों की तरह आते हैं, तो उनमें से कुछ भी बनाने से पहले आपको यह सब technical भाषा में अनुवाद करना पड़ता था। आप अपने दिमाग में एक दुनिया देखते हैं, lighting और माहौल और किरदारों के अंतरिक्ष में चलने के तरीके समेत मुकम्मल। फिर आप अपने computer पर बैठते हैं और अगले छह घंटे यह debug करने में बिताते हैं कि आपका किरदार फ़र्श के पार नीचे क्यों गिर जाता है।</p>
<p>technical बुनियाद मायने रखती है। पर tools ने creators को उस जटिलता को अलग करने के बजाय implementation की बारीकियों में जीने पर मजबूर कर दिया। game बनाना एक कहानी कहने या ऐसी फ़िल्म डायरेक्ट करने जैसा लगना चाहिए जिसमें लोग हिस्सा ले सकें। यही इस माध्यम का जादू है। इसके बजाय यह ऐसा लगता था जैसे शुरुआत करने से पहले ही आपको एक engineering परीक्षा देनी हो।</p>
<p>फ़िल्म डायरेक्टर अपना vision व्यक्त करने से पहले बरसों physics engines सीखने में नहीं बिताते। उन्हें एक budget और एक टीम मिलती है जो technical अमल को संभालती है। पर indie game development में आपके पास शायद ही कभी budget होता है। आपके पास होता है वक़्त और tools तक पहुँच। और अगर आप technical इंसान हैं, तो आप एक ज़बरदस्त game बना सकते हैं। पर तभी अगर।</p>
<p>इसी तरह हमें Limbo जैसे titles मिले, जो एक छोटी टीम ने एक अकेले कलात्मक vision और उसे अमल में लाने की technical काबिलियत के साथ बनाया। या Undertale, जो काफ़ी हद तक एक ही इंसान ने बनाया जिसके पास संयोग से रचनात्मक सहज समझ और programming क्षमता का सही मेल था। या Stardew Valley, जहाँ Eric Barone ने pixel art से लेकर music composition और C# programming तक सब कुछ खुद को सिखाने में बरसों लगाए।</p>
<p>ये games भारी मुश्किलों के बावजूद कामयाब हुए। पर हर एक Limbo के बदले ऐसे लाखों रचनात्मक vision मरे जिन्हें इसलिए दम तोड़ना पड़ा क्योंकि tools ने ऐसी technical रवानगी माँगी जो उनके creators दे नहीं सकते थे। 3% से भी कम indie game developers कभी सार्थक कामयाबी हासिल कर पाते हैं। न जाने कितने शानदार games कभी बने ही नहीं क्योंकि उनके creators &quot;ifs&quot; और &quot;thens&quot; की दीवार से टकराए और हार मान गए।</p>
<p>प्रवेश की रुकावट creativity नहीं थी। वह tools के भीतर ही बना हुआ technical gatekeeping था।</p>
<h2 id="जो-होना-चाहिए-था-उसे-बनाना" tabindex="-1">जो होना चाहिए था, उसे बनाना <a class="header-anchor" href="#जो-होना-चाहिए-था-उसे-बनाना" aria-label="Permalink to &quot;जो होना चाहिए था, उसे बनाना&quot;"></a></h2>
<p>तो 5 साल पहले मैंने कुछ अलग बनाना शुरू किया।</p>
<p>बात सीधी सी थी: game development किसी भी रचनात्मक vision रखने वाले इंसान के लिए सुलभ होना चाहिए। interactive media के ज़रिए खुद को व्यक्त करने के लिए आपको computer science की डिग्री की ज़रूरत नहीं होनी चाहिए। tools को इस हिसाब से ढलना चाहिए कि रचनात्मक लोग असल में कैसे सोचते हैं, न कि इसका उल्टा।</p>
<p>Sequoia, Pear, Draper और दर्जनों दूसरी firms के VCs ने मुझसे कहा कि यह काम नहीं करेगा। यह B2C है। बाज़ार है ही नहीं। Indies किसी चीज़ के पैसे नहीं देते। आप काबिलियत की कुर्बानी दिए बिना game development को आसान नहीं बना सकते। Gamers जटिल games चाहते हैं, और जटिल games के लिए जटिल tools चाहिए। बाज़ार के विश्लेषण के लिबास में लिपटे लाखों बहाने।</p>
<p>लोगों ने मुझसे कहा कि मैं पागल हूँ। शायद थी भी। पर मैं बार-बार उसी सवाल पर लौट आती: रचनात्मक अभिव्यक्ति के लिए करोड़ों डॉलर के budget एक ज़रूरी शर्त क्यों हों? फ़िल्म डायरेक्टर और मशहूर game producer के पास टीमें और संसाधन होते हैं। बाक़ी सबको एक code editor और एक दुआ मिलती है। मैं वह चीज़ बनाना चाहती थी जो उस खाई को पाट दे। आप बताते हैं कि आप क्या चाहते हैं, और वह आपकी आँखों के सामने हो जाता है। मेरा कण-कण जानता था कि यह सही है। मैं इसे अपने शरीर की हर कोशिका में महसूस कर सकती थी।</p>
<p>आज हज़ारों लोग रोज़ Cinevva का इस्तेमाल 3D game assets, games, music, levels और experiences के लिए करते हैं। अब तक बने projects पर लाखों views। हर एक दिन के साथ बढ़ता हुआ। Sand Hill Road को दी जाने वाली दो मिनट की pitch ठीक &quot;मैं SAT में फ़ेल हो गई पर मेरी सहज समझ पर भरोसा करो&quot; का format तो नहीं है।</p>
<h2 id="सहज-समझ-का-असल-में-क्या-मतलब-है" tabindex="-1">सहज समझ का असल में क्या मतलब है <a class="header-anchor" href="#सहज-समझ-का-असल-में-क्या-मतलब-है" aria-label="Permalink to &quot;सहज समझ का असल में क्या मतलब है&quot;"></a></h2>
<p><a href="https://singjupost.com/transcript-jensen-huangs-interview-cisco-ai-summit-2026/" target="_blank" rel="noreferrer">Huang</a> सिर्फ़ कोई दार्शनिक बात नहीं कह रहे थे। वे एक असली बदलाव की बात कर रहे थे कि किसे कीमती intelligence माना जाए।</p>
<p>दशकों तक हमने गलत चीज़ों के लिए optimize किया। हमने ऐसी शिक्षा व्यवस्थाएँ बनाईं जो रटने और गणना करने को इनाम देती थीं। हमने ऐसी standardized tests डिज़ाइन कीं जो पहले देखी हुई समस्याओं से pattern-matching को मापती थीं। हमने लोगों को ऐसी credentials के आधार पर भर्ती किया जो साबित करती थीं कि वे चार साल के शैक्षिक gatekeeping में टिक सकते हैं। AI ने बस यह सब कम खास बना दिया।</p>
<p>AI जो नहीं कर सकता, कम से कम अभी तक, वह है यह भाँपना कि क्या कमी है। यह महसूस करना कि कुछ गड़बड़ है। यह सहज समझ लेना कि लोगों को क्या चाहिए, इससे पहले कि वे खुद उसे बता पाएँ। माहौल को पढ़ लेना। ऐसे संदर्भ को समझना जो किसी dataset में दर्ज नहीं है।</p>
<p>मैंने अपना वक़्त, अपना international जीवन का अनुभव, पैसा, और सहज समझ Cinevva बनाने में उँडेल दी। यह ऐसा मेल है जो college में पाना मुश्किल है। SAT में जिसे जाँचना मुश्किल है। किसी भी ऐसे credential सिस्टम में जिसे पकड़ना मुश्किल है जो AI के कच्ची cognitive ताकत को आम बनाने से पहले डिज़ाइन हुआ था।</p>
<p>सोलह या बीस साल पहले, computer scientists ने तय किया कि tools कैसे दिखने और कैसे काम करने चाहिए। उन्होंने अपने लिए बनाया, उन लोगों के लिए जो उनकी तरह सोचते थे। हम बाक़ी सबसे उम्मीद की गई कि हम ढल जाएँ। वह दौर खत्म हो रहा है। आगे जो आने वाला है उसे वही लोग गढ़ेंगे जो समझते हैं कि इंसान असल में क्या चाहते हैं। जो महसूस कर सकते हैं कि कब कुछ गलत है और कब कुछ सही। जो technical सुंदरता के बजाय लोगों के लिए बनाते हैं।</p>
<p>मैंने अपने भीतर की एक चीज़ पर भरोसा किया जिसे सिस्टम ने बेकार बताया था। और मैं सही थी।</p>
<hr>
<p><strong>इससे जुड़ा हुआ:</strong></p>
<ul>
<li><a href="/hi/blog/2026-01-18-skills-over-degrees.html">नौकरी का बाज़ार बदल रहा है — डिग्री से स्किल्स की ओर</a></li>
<li><a href="/hi/guides/game-dev-courses.html">Online Game Development Courses</a> — skills-first राहें जो परंपरागत gatekeeping को दरकिनार कर देती हैं</li>
<li><a href="/hi/signals/2026-03-04-everyone-wants-ai-game-engine.html">अब हर कोई AI game engine बनना चाहता है</a> — उन tools की ओर industry का झुकाव जो लोगों की सोच के हिसाब से ढलते हैं</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[AI विवाद, भरोसा, और games के लिए post‑AI economy]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-01-18-ai-controversy-and-post-ai-economy</link>
            <guid>https://app.cinevva.com/hi/blog/2026-01-18-ai-controversy-and-post-ai-economy</guid>
            <pubDate>Sun, 18 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[एक व्यावहारिक नज़रिया: असली मुद्दा AI नहीं है, भरोसा है। 'pro' बनाम 'anti' AI की बहसों से ज़्यादा labeling, filters, और निष्पक्ष distribution क्यों मायने रखते हैं।]]></description>
            <content:encoded><![CDATA[<h1 id="ai-विवाद-भरोसा-और-games-के-लिए-post‐ai-economy" tabindex="-1">AI विवाद, भरोसा, और games के लिए post‑AI economy <a class="header-anchor" href="#ai-विवाद-भरोसा-और-games-के-लिए-post‐ai-economy" aria-label="Permalink to &quot;AI विवाद, भरोसा, और games के लिए post‑AI economy&quot;"></a></h1>
<p><em><a href="/hi/about.html">Oleg Sidorkin</a> द्वारा, Cinevva के CTO</em></p>
<p>games में AI 2024 के मध्य के आसपास एक सच्चा बारूदी मैदान बन गया। नौकरियाँ गायब हो रही हैं। लोग यकीन कर बैठे हैं कि अगला नंबर उन्हीं का है। Copyright के सवाल जिन्हें वकील तक नहीं सुलझा पाते। अंतहीन सौंदर्य-संबंधी बहसें जो घूम-फिरकर वहीं लौट आती हैं। Steam ऐसी चीज़ों से भरा पड़ा है जो किसी ने माँगी ही नहीं थीं। और इन सबके नीचे, हर creator को अब यह चिंता खाए जा रही है: &quot;क्या मैं सच में यहाँ कुछ बना रहा हूँ, या बस... prompts टाइप कर रहा हूँ?&quot;</p>
<p>हम एक platform चलाते हैं। यह करते-करते एक बात जल्दी समझ आ जाती है।</p>
<p><strong>किसी को भी ठगा हुआ महसूस करना अच्छा नहीं लगता।</strong></p>
<h2 id="इन-आँकड़ों-ने-हमें-चौंका-दिया" tabindex="-1">इन आँकड़ों ने हमें चौंका दिया <a class="header-anchor" href="#इन-आँकड़ों-ने-हमें-चौंका-दिया" aria-label="Permalink to &quot;इन आँकड़ों ने हमें चौंका दिया&quot;"></a></h2>
<p>हमें लगा था कि AI को अपनाना बढ़ेगा। पर ऐसे नहीं। 2025 के अंत तक हालात यहाँ पहुँचे:</p>
<table tabindex="0">
<thead>
<tr>
<th>हमने क्या ट्रैक किया</th>
<th>2024</th>
<th>2025</th>
<th>बदलाव</th>
</tr>
</thead>
<tbody>
<tr>
<td>AI का खुलासा करने वाले Steam games</td>
<td>~1,000</td>
<td>7,818</td>
<td>7 गुना उछाल</td>
</tr>
<tr>
<td>AI इस्तेमाल करने वाले नए Steam releases</td>
<td>~3%</td>
<td>~20%</td>
<td>हर पाँच में से एक</td>
</tr>
<tr>
<td>जो devs मानते हैं AI से quality घटती है</td>
<td>34%</td>
<td>47%</td>
<td>तेरह अंक ज़्यादा</td>
</tr>
<tr>
<td>जो devs मानते हैं AI से quality बढ़ती है</td>
<td>—</td>
<td>11%</td>
<td>ज़्यादा नहीं</td>
</tr>
<tr>
<td>AI का खुलासा करने वाले games से revenue</td>
<td>—</td>
<td>$660M</td>
<td>बारह games ने 8 अंकों का आँकड़ा पार किया</td>
</tr>
</tbody>
</table>
<p>स्रोत: Tom's Hardware / Totally Human Media विश्लेषण, GDC 2025 Developer Survey, Unity 2025 Gaming Report</p>
<h2 id="आख़िर-हुआ-क्या-जिसने-players-को-इतना-शक्की-बना-दिया" tabindex="-1">आख़िर हुआ क्या जिसने players को इतना शक्की बना दिया <a class="header-anchor" href="#आख़िर-हुआ-क्या-जिसने-players-को-इतना-शक्की-बना-दिया" aria-label="Permalink to &quot;आख़िर हुआ क्या जिसने players को इतना शक्की बना दिया&quot;"></a></h2>
<p>यह कहीं से अचानक नहीं आया। सच में चीज़ें गलत हुईं। और लोगों को याद है।</p>
<h3 id="voice-actors-को-पता-चला-कि-उनकी-आवाज़-की-नकल-बना-दी-गई-थी-वो-भी-launch-day-पर" tabindex="-1">Voice actors को पता चला कि उनकी आवाज़ की नकल बना दी गई थी, वो भी launch day पर <a class="header-anchor" href="#voice-actors-को-पता-चला-कि-उनकी-आवाज़-की-नकल-बना-दी-गई-थी-वो-भी-launch-day-पर" aria-label="Permalink to &quot;Voice actors को पता चला कि उनकी आवाज़ की नकल बना दी गई थी, वो भी launch day पर&quot;"></a></h3>
<p><em>Tomb Raider 4-6 Remastered</em> मूल voice performances के AI से बनाए गए संस्करणों के साथ रिलीज़ हुआ। actors को इसकी खबर ठीक उसी पल मिली जब बाकी सबको मिली। launch day। कानूनी दबाव बढ़ने के बाद publisher ने आखिरकार patch देकर वो आवाज़ें हटा दीं। वो ग्यारह महीने की SAG-AFTRA हड़ताल? ठीक यही स्थिति उसकी वजह थी।</p>
<h3 id="ai-slop-अब-एक-ऐसा-शब्द-बन-गया-जो-लोग-बोलते-हैं" tabindex="-1">&quot;AI slop&quot; अब एक ऐसा शब्द बन गया जो लोग बोलते हैं <a class="header-anchor" href="#ai-slop-अब-एक-ऐसा-शब्द-बन-गया-जो-लोग-बोलते-हैं" aria-label="Permalink to &quot;&quot;AI slop&quot; अब एक ऐसा शब्द बन गया जो लोग बोलते हैं&quot;"></a></h3>
<p><em>Call of Duty: Black Ops 6</em> ने चुपचाप अपने Steam page पर AI का खुलासा जोड़ दिया। तब, जब वो पहले ही रिलीज़ हो चुका था। players ने अजीबपन भाँप लिया था, हर तरफ बिखरी हुई visual गड़बड़ियाँ। एक loading screen के किरदार की छह उंगलियाँ थीं। &quot;AI slop&quot; किसी भी ऐसी चीज़ के लिए शॉर्टहैंड बन गया जो... गड़बड़ दिखती हो। खोखली। जैसे किसी ने ठीक से जाँचने की परवाह ही न की हो।</p>
<h3 id="एक-award-nomination-गायब-हो-गया" tabindex="-1">एक award nomination गायब हो गया <a class="header-anchor" href="#एक-award-nomination-गायब-हो-गया" aria-label="Permalink to &quot;एक award nomination गायब हो गया&quot;"></a></h3>
<p><em>Clair Obscur: Expedition 33</em> का Indie Game Awards में Game of the Year nomination वापस ले लिया गया। हालाँकि रिलीज़ हुए game में AI का इस्तेमाल हुआ ही नहीं था। दिक्कत development के दौरान इस्तेमाल हुए AI placeholders की थी, अंदरूनी सामान जो कभी players तक पहुँचा ही नहीं। आखिरी assets पूरी तरह इंसानों के बनाए हुए थे। फर्क नहीं पड़ा। हफ्तों तक इस पर बहस होती रही कि लाइन ठीक कहाँ खींची जाए।</p>
<h3 id="जिन-teams-ने-ai-को-छुआ-तक-नहीं-था-उन्हें-यह-साबित-करना-पड़ा" tabindex="-1">जिन teams ने AI को छुआ तक नहीं था, उन्हें यह साबित करना पड़ा <a class="header-anchor" href="#जिन-teams-ने-ai-को-छुआ-तक-नहीं-था-उन्हें-यह-साबित-करना-पड़ा" aria-label="Permalink to &quot;जिन teams ने AI को छुआ तक नहीं था, उन्हें यह साबित करना पड़ा&quot;"></a></h3>
<p><em>Chessplus</em> और <em>Peak</em> दोनों पर AI के आरोप लगे। किसी ने भी AI इस्तेमाल नहीं किया था। दोनों award के लिए नामित थे। दोनों development teams को आखिरकार पुराने screenshots और layer files खंगालने पड़े बस यह दिखाने के लिए कि उनका काम हाथ से बना था। <em>Peak</em> की team ने इसे बखूबी कहा: &quot;हम शायद slop हों, पर हम इंसानों के बनाए, स्थानीय रूप से तैयार, हस्तनिर्मित slop हैं।&quot;</p>
<h3 id="studios-बिल्कुल-विपरीत-दिशाओं-में-चले-गए" tabindex="-1">Studios बिल्कुल विपरीत दिशाओं में चले गए <a class="header-anchor" href="#studios-बिल्कुल-विपरीत-दिशाओं-में-चले-गए" aria-label="Permalink to &quot;Studios बिल्कुल विपरीत दिशाओं में चले गए&quot;"></a></h3>
<p><strong>SNK</strong> — एक <em>Fatal Fury: City of the Wolves</em> trailer में AI जैसे दिखने वाले visuals आने के बाद Discord moderators काम छोड़कर चले गए। <strong>Games Workshop</strong> — सभी Warhammer properties में AI पर पूरी तरह रोक लगा दी। <strong>Larian Studios</strong> — कहा कि उन्होंने Baldur's Gate 3 में AI का इस्तेमाल सिर्फ बहुत शुरुआती concept रेखाचित्रों के लिए किया, आखिरी game में कुछ नहीं। <strong>Tim Sweeney</strong> — Steam के AI labels को बेकार बताया और कहा कि इन्हें हटा देना चाहिए। <strong>Valve</strong> — पलटकर जवाब दिया कि AI labels की शिकायत करने वाले devs अक्सर इस बात से परेशान रहते हैं कि उनका काम &quot;low effort&quot; दिखता है।</p>
<h2 id="games-ढूँढना-एक-भरोसे-की-समस्या-बन-गया" tabindex="-1">games ढूँढना एक भरोसे की समस्या बन गया <a class="header-anchor" href="#games-ढूँढना-एक-भरोसे-की-समस्या-बन-गया" aria-label="Permalink to &quot;games ढूँढना एक भरोसे की समस्या बन गया&quot;"></a></h2>
<p>अब चीज़ें इतनी तेज़ी से बनती हैं कि कोई उन्हें ठीक से परख ही नहीं पाता। सवाल बदल गए:</p>
<p>मैं आख़िर यहाँ देख क्या रहा हूँ?
इसे बनाया किसने?
क्या इस पर बिताए वक्त का मुझे पछतावा होगा?
क्या इसमें से कुछ भी उस trailer के वादे से मेल खाता है?</p>
<p>शायद कोई बड़ा समाधान आने वाला नहीं है। AI बनाम इंसान के बनाए पर कोई आखिरी फैसला नहीं।</p>
<p>ज़्यादा संभावना इसकी है: <strong>filters, असली पारदर्शिता, और ऐसे incentive ढाँचे जो ईमानदारी की ओर धकेलें</strong>।</p>
<h2 id="छोटे-studios-इस-सब-के-बीच-फँसे-हुए" tabindex="-1">छोटे studios इस सब के बीच फँसे हुए <a class="header-anchor" href="#छोटे-studios-इस-सब-के-बीच-फँसे-हुए" aria-label="Permalink to &quot;छोटे studios इस सब के बीच फँसे हुए&quot;"></a></h2>
<p>Indie developers एक अजीब जगह आ खड़े हुए।</p>
<p><strong>फायदा वाकई नज़रअंदाज़ करना मुश्किल है:</strong>
आप तेज़ी से iterate करते हैं। जब चार लोग सब कुछ बना रहे हों तो लागत घटती है। Solo devs अब सच में चीज़ें पूरी कर सकते हैं। Localization आपके पूरे budget को निगलना बंद कर देता है।</p>
<p><strong>नुकसान भी उतना ही असली है:</strong>
ऐसा output जो generic लगता है। Training data और IP की चिंताएँ जिन्हें वकील अभी छूना नहीं चाहते। ऐसे systems रिलीज़ करना जिन्हें आप पूरी तरह समझते नहीं, कुछ लोग इसे comprehension debt कहते हैं। low-effort releases की बाढ़ के साथ एक ही खाने में गिने जाना। सर्वे किए गए लगभग आधे developers मानते हैं कि AI से games कुल मिलाकर बदतर बनते हैं।</p>
<p>Unity की 2025 रिपोर्ट कहती है कि 79% developers AI tools को लेकर सकारात्मक महसूस करते हैं। सुनने में काफी पक्का लगता है। हकीकत ज़्यादा उलझी हुई है। जो teams इसे अच्छे से करती हैं, वे AI को उबाऊ हिस्सों के लिए इस्तेमाल करती हैं, मेहनती काम, खुरदुरे draft, QA की झंझट। Creative direction? वो इंसान के हाथ में ही रहती है।</p>
<h2 id="cinevva-कहाँ-खड़ा-है-ai-पर-तटस्थ-ईमानदारी-पर-सख्त" tabindex="-1">Cinevva कहाँ खड़ा है: AI पर तटस्थ, ईमानदारी पर सख्त <a class="header-anchor" href="#cinevva-कहाँ-खड़ा-है-ai-पर-तटस्थ-ईमानदारी-पर-सख्त" aria-label="Permalink to &quot;Cinevva कहाँ खड़ा है: AI पर तटस्थ, ईमानदारी पर सख्त&quot;"></a></h2>
<p>हम AI इस्तेमाल करने पर games को ठुकराते नहीं। हम उन्हें कोई खास रियायत भी नहीं देते।</p>
<p>नियम सीधा है: <strong>अगर AI शामिल था, तो बता दो।</strong> players तय करते हैं कि उन्हें किस बात की परवाह है। तब filters सच में काम करते हैं।</p>
<ul>
<li><a href="/hi/ai-content.html">AI-generated content policy</a></li>
</ul>
<h2 id="filters-बहसों-से-बेहतर-काम-करते-हैं" tabindex="-1">filters बहसों से बेहतर काम करते हैं <a class="header-anchor" href="#filters-बहसों-से-बेहतर-काम-करते-हैं" aria-label="Permalink to &quot;filters बहसों से बेहतर काम करते हैं&quot;"></a></h2>
<p>games में AI की बहस जल्दी किसी सहमति तक नहीं पहुँचने वाली। शायद कभी नहीं पहुँचेगी। पर हर किसी की अपनी पसंद? वो काफी साफ है।</p>
<p>कुछ players खासतौर पर इंसान-निर्देशित art चाहते हैं। ऐसा लेखन जो किसी इंसान से आया हो। दिखती हुई मेहनत।</p>
<p>कुछ को सच में परवाह नहीं। मज़ा तो मज़ा है।</p>
<p>filters दोनों समूहों को वो ढूँढने देते हैं जो वे चाहते हैं। किसी को जीतना नहीं पड़ता।</p>
<h2 id="payment-models-किसी-की-राय-से-ज़्यादा-मायने-रखते-हैं" tabindex="-1">payment models किसी की राय से ज़्यादा मायने रखते हैं <a class="header-anchor" href="#payment-models-किसी-की-राय-से-ज़्यादा-मायने-रखते-हैं" aria-label="Permalink to &quot;payment models किसी की राय से ज़्यादा मायने रखते हैं&quot;"></a></h2>
<p>जब revenue <strong>playtime</strong> से जुड़ता है, यूनिट sales से नहीं, तब आप पैसा ऐसे कमाते हैं:</p>
<p>players को जल्दी बाँध लेना। उनका ध्यान बनाए रखना। वही देना जो आपकी marketing ने कहा था।</p>
<p>quality अपने आप ज़ाहिर रास्ता बन जाती है। आपने इसे कैसे बनाया, यह कम मायने रखता है।</p>
<p>अपने trailer में हद से ज़्यादा वादे किए? players फौरन निकल जाते हैं। Retention गिर जाता है। उन्हें ठीक वही दिखाओ जो वे पा रहे हैं? वे टिके रहते हैं। playtime बढ़ता है। revenue आता है। अर्थशास्त्र अपने आप संभल जाता है।</p>
<h2 id="_2026-शायद-क्या-लेकर-आएगा" tabindex="-1">2026 शायद क्या लेकर आएगा <a class="header-anchor" href="#_2026-शायद-क्या-लेकर-आएगा" aria-label="Permalink to &quot;2026 शायद क्या लेकर आएगा&quot;"></a></h2>
<p><strong>ज़्यादा नियम</strong> — EU AI Act फैलता ही जा रहा है। आवाज़ और छवि के लिए अमेरिकी सुरक्षाएँ बढ़ रही हैं, खासकर SAG-AFTRA के बाद।</p>
<p><strong>खास tools</strong> — छोटी teams के लिए खासतौर पर बना AI। इस तरह डिज़ाइन किया गया कि इंसान ही स्टीयरिंग पर रहें।</p>
<p><strong>ज़्यादा समझदार labels</strong> — &quot;Made with AI&quot; बहुत मोटा है। AI-सहायता वाले workflows और AI से बने आखिरी assets के बीच फर्क की उम्मीद रखिए।</p>
<p><strong>दर्शकों का बँटना</strong> — कुछ players जानबूझकर पारंपरिक तरीके से बने games ढूँढेंगे। कुछ इस पर सोचेंगे तक नहीं। दोनों समूह इतने बड़े हैं कि उनके लिए बनाया जा सके।</p>
<p><strong>Platform की प्रतिस्पर्धा</strong> — storefronts पारदर्शिता और discovery को कैसे संभालते हैं, यह एक असली फर्क पैदा करने वाली बात बन जाती है।</p>
<h2 id="असल-में-चीज़ें-आगे-क्या-बढ़ाता-है" tabindex="-1">असल में चीज़ें आगे क्या बढ़ाता है <a class="header-anchor" href="#असल-में-चीज़ें-आगे-क्या-बढ़ाता-है" aria-label="Permalink to &quot;असल में चीज़ें आगे क्या बढ़ाता है&quot;"></a></h2>
<p>बहस से AI का सवाल नहीं सुलझेगा। जो सुलझाता है, वो है:</p>
<ol>
<li><strong>players</strong> उस आधार पर चुनें जो उनके लिए सच में मायने रखता है</li>
<li><strong>creators</strong> इस बारे में ईमानदार रहें कि वे कैसे काम करते हैं</li>
<li><strong>platforms</strong> ऐसे tools बनाएँ जो दोनों समूहों को एक-दूसरे तक पहुँचने में मदद करें</li>
</ol>
<p>यही है post-AI economy। लड़ते हुए खेमे नहीं। भरोसा जो पूरी चीज़ को बाँधे रखता है।</p>
<hr>
<p><strong>संबंधित:</strong></p>
<ul>
<li><a href="/hi/ai-content.html">AI-generated content policy</a></li>
<li><a href="/hi/creators.html">For game creators</a></li>
<li><a href="/hi/faq.html">FAQ</a></li>
<li><a href="/hi/guides/frontier-gen-ai-models.html">Frontier Open-Source Gen AI Models</a> — वे खास models और वे कैसे काम करते हैं</li>
<li><a href="/hi/signals/2026-03-06-open-source-ai-pollution.html">Open source has an AI pollution problem</a> — जब AI का output open-source projects में बाढ़ की तरह भर जाता है, तब क्या होता है</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[नौकरी का बाज़ार बदल रहा है — डिग्री से स्किल्स की ओर]]></title>
            <link>https://app.cinevva.com/hi/blog/2026-01-18-skills-over-degrees</link>
            <guid>https://app.cinevva.com/hi/blog/2026-01-18-skills-over-degrees</guid>
            <pubDate>Sun, 18 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[अब 90% कंपनियाँ डिग्री से ज़्यादा स्किल्स को अहमियत देती हैं। टेक और game development में कदम रखने वाले नए ग्रेजुएट्स के लिए इसका क्या मतलब है, यहाँ समझिए।]]></description>
            <content:encoded><![CDATA[<h1 id="नौकरी-का-बाज़ार-बदल-रहा-है-—-डिग्री-से-स्किल्स-की-ओर" tabindex="-1">नौकरी का बाज़ार बदल रहा है — डिग्री से स्किल्स की ओर <a class="header-anchor" href="#नौकरी-का-बाज़ार-बदल-रहा-है-—-डिग्री-से-स्किल्स-की-ओर" aria-label="Permalink to &quot;नौकरी का बाज़ार बदल रहा है — डिग्री से स्किल्स की ओर&quot;"></a></h1>
<p><em>लिखा है <a href="/hi/about.html">Oleg Sidorkin</a> ने, Cinevva के CTO</em></p>
<p>2023 में मैंने अपने चचेरे भाई को honours के साथ ग्रेजुएट होते देखा। एक अच्छे state school से computer science की डिग्री। ठीक-ठाक GPA। नौकरी पाने में उसे चौदह महीने लग गए, और तब जाकर एक मिली। उधर मेरा एक दोस्त, जो दूसरे साल में पढ़ाई छोड़कर indie games बनाने लगा था, उसे ढूँढना शुरू करने के एक महीने के अंदर तीन offers मिल गए।</p>
<p>यह अब कोई अपवाद नहीं है। यही अब आम बात है।</p>
<h2 id="आख़िरकार-आँकड़े-उस-बात-से-जा-मिले-जो-हम-महसूस-करते-आ-रहे-थे" tabindex="-1">आख़िरकार आँकड़े उस बात से जा मिले जो हम महसूस करते आ रहे थे <a class="header-anchor" href="#आख़िरकार-आँकड़े-उस-बात-से-जा-मिले-जो-हम-महसूस-करते-आ-रहे-थे" aria-label="Permalink to &quot;आख़िरकार आँकड़े उस बात से जा मिले जो हम महसूस करते आ रहे थे&quot;"></a></h2>
<p>2025 तक <strong>90% HR leaders</strong> ने बताया कि वे पारंपरिक चार साल की डिग्री के बाहर से लोगों को हायर कर रहे हैं (<a href="https://fortune.com/2025/07/01/90-percent-hr-leaders-looking-to-hire-outside-of-traditional-college-degrees-as-they-prioritize-skills/" target="_blank" rel="noreferrer">Fortune</a>)। अमेरिका की एक चौथाई कंपनियों ने bachelor's की शर्त पूरी तरह हटा दी (<a href="https://www.hrdive.com/news/employer-eliminate-degree-requirements-2025/748998/" target="_blank" rel="noreferrer">HR Dive</a>)। और जो बात अभी-अभी loan चुकाने वालों को चुभेगी वो ये है: <strong>94% नियोक्ता कहते हैं कि स्किल्स के आधार पर हायर किए गए लोग डिग्री के आधार पर हायर किए गए लोगों से बेहतर परफॉर्म करते हैं</strong> (<a href="https://www.forbes.com/sites/cynthiapong/2024/12/26/90-of-companies-make-better-hires-based-on-skills-over-degrees/" target="_blank" rel="noreferrer">Forbes</a>)।</p>
<p>Verizon अब कहती है कि उसकी 99% भूमिकाओं के लिए डिग्री ज़रूरी नहीं है। Sergey Brin ने माना कि Google &quot;बहुत सारे&quot; ऐसे लोगों को हायर करती है जिनके पास bachelor's डिग्री नहीं है। IBM ने अपने &quot;New Collar&quot; प्रोग्राम के ज़रिए अमेरिका की आधी openings को डिग्री-वैकल्पिक बना दिया।</p>
<p>ऐसा नहीं है कि कंपनियाँ दरियादिली दिखा रही हैं। उन्हें समझ आ गया कि डिग्री इस बात का अंदाज़ा नहीं देती थी कि कौन सचमुच काम में अच्छा निकलेगा।</p>
<h2 id="पुराना-सिस्टम-क्यों-टूटा" tabindex="-1">पुराना सिस्टम क्यों टूटा <a class="header-anchor" href="#पुराना-सिस्टम-क्यों-टूटा" aria-label="Permalink to &quot;पुराना सिस्टम क्यों टूटा&quot;"></a></h2>
<p>सच क्या है? डिग्री एक आलसी filter बन गई थी।</p>
<p>जब आप हायर कर रहे हों और आपके पास 400 application हों, तो bachelor's डिग्री माँगने भर से ढेर आधा हो जाता है। इससे ये पता नहीं चलता कि काम कौन कर सकता है। इससे बस ये पता चलता है कि किसके पास चार साल classrooms में बैठने के लिए पैसा, समय और घर की स्थिरता थी। काबिलियत के साथ इसका रिश्ता हमेशा से उतना मज़बूत नहीं था जितना हम मान बैठे थे।</p>
<p>और अब तीन चीज़ें एक साथ हो गईं:</p>
<p><strong>स्किल्स बहुत तेज़ी से बदलने लगीं।</strong> Game engines, AI tools, web frameworks। जब तक कोई curriculum committee किसी चीज़ पर कोर्स मंज़ूर करती है, तब तक वो चीज़ पुरानी पड़ चुकी होती है। चार साल की डिग्री आपको चार साल पुरानी theory सिखाती है। टेक में यह बीते ज़माने की बात है।</p>
<p><strong>Portfolios को नकारा नहीं जा सकता।</strong> जब किसी का GitHub देखा जा सकता है तो अंदाज़ा क्यों लगाएँ कि वो code कर सकता है या नहीं? जब किसी के itch.io page पर player reviews के साथ पाँच पूरे हो चुके projects हों, तो ये सोचना क्यों कि वो कोई game ship कर सकता है या नहीं?</p>
<p><strong>कंपनियाँ बेबस हो गईं।</strong> टैलेंट की कमी सच में है। डिग्री न रखने वाले हर इंसान को बाहर कर देने का मतलब है ऐसे लोगों को बाहर करना जो शायद ठीक वही हों जिनकी आपको ज़रूरत है। कुछ hiring managers को यह कड़वे तरीके से समझ आया, जब उन्होंने खुद से सीखे डेवलपर्स को अपने डिग्री वाले हायर्स से कहीं आगे निकलते देखा।</p>
<h2 id="game-industry-ने-इसे-पहले-ही-भाँप-लिया-था" tabindex="-1">game industry ने इसे पहले ही भाँप लिया था <a class="header-anchor" href="#game-industry-ने-इसे-पहले-ही-भाँप-लिया-था" aria-label="Permalink to &quot;game industry ने इसे पहले ही भाँप लिया था&quot;"></a></h2>
<p>मुझे लगता है कि games इस मामले में बाकियों से आगे रहे हैं, और यह समझना ज़रूरी है कि क्यों।</p>
<p>Studios को कभी इस बात की परवाह नहीं रही कि आप किस स्कूल से पढ़े। उन्हें इसकी परवाह थी कि आपने क्या ship किया। 48 घंटे के jam में बनाया गया एक निखरा हुआ game किसी hiring manager को चार साल की game design डिग्री से कहीं ज़्यादा बताता है। यह साबित करता है कि आप दबाव में चीज़ें पूरी कर सकते हैं। यह साबित करता है कि आपने scope को लेकर मुश्किल फ़ैसले लिए। यह साबित करता है कि game खेलने लायक है, सिर्फ़ कागज़ी नहीं।</p>
<p>अगर आप 2026 में games में घुसने की कोशिश कर रहे हैं, तो असल में जो मायने रखता है वो ये है (<a href="https://www.dice.com/career-advice/aspiring-video-game-designers-in-2025-what-you-need-to-know" target="_blank" rel="noreferrer">Dice</a>, <a href="https://combinegr.com/2025-global-gaming-employment-outlook-trends-talent-strategy/" target="_blank" rel="noreferrer">CombineGR</a>): दो या तीन निखरे हुए, खेलने लायक demos। यह बताने वाले case studies कि आपने क्या किया और क्यों। इस बात का सबूत कि आप चीज़ें पूरी करते हैं। कम से कम एक बड़े engine में महारत, जो असल projects के ज़रिए दिखे।</p>
<p>Hiring managers संभावनाएँ नहीं ढूँढ रहे। वे सबूत ढूँढ रहे हैं।</p>
<h2 id="वो-असहज-बात-जिसके-बारे-में-कोई-बात-नहीं-करता" tabindex="-1">वो असहज बात जिसके बारे में कोई बात नहीं करता <a class="header-anchor" href="#वो-असहज-बात-जिसके-बारे-में-कोई-बात-नहीं-करता" aria-label="Permalink to &quot;वो असहज बात जिसके बारे में कोई बात नहीं करता&quot;"></a></h2>
<p>एक बात जिसने मुझे झुँझला दिया जब मैंने research में गहराई से देखा।</p>
<p>Harvard/Burning Glass की एक स्टडी में पाया गया कि डिग्री की शर्त हटाने वाली कंपनियों ने अक्सर असल में बिना-डिग्री वाले उम्मीदवारों को ज़्यादा हायर नहीं किया। बढ़ोतरी सिर्फ़ करीब 3.5 percentage point की रही (<a href="https://www.forbes.com/sites/jenamcgregor/2024/02/14/companies-are-dropping-diploma-requirements-for-more-jobs-but-hiring-few-non-degreed-workers-to-fill-them/" target="_blank" rel="noreferrer">Forbes</a>)। नीति बदल गई। हायरिंग की आदतें पीछे रह गईं।</p>
<p>इसका मतलब है कि अगर आप गैर-पारंपरिक रास्ता चुन रहे हैं, तो आपको अब भी ज़्यादा मेहनत करनी होगी। दरवाज़ा पहले से ज़्यादा खुला है, पर आप अभी बराबरी से अंदर नहीं चल रहे। आपका portfolio ऐसा होना चाहिए जिसे नकारा न जा सके। आपके projects को किसी और की डिग्री से ऊँची आवाज़ में बोलना चाहिए।</p>
<p>यह ठीक नहीं है। पर यह जानना आपको तैयारी में मदद करता है।</p>
<h2 id="अभी-शुरुआत-करने-वाले-किसी-इंसान-से-मैं-क्या-कहूँगा" tabindex="-1">अभी शुरुआत करने वाले किसी इंसान से मैं क्या कहूँगा <a class="header-anchor" href="#अभी-शुरुआत-करने-वाले-किसी-इंसान-से-मैं-क्या-कहूँगा" aria-label="Permalink to &quot;अभी शुरुआत करने वाले किसी इंसान से मैं क्या कहूँगा&quot;"></a></h2>
<p>अगर आप पढ़ाई कर रहे हैं, तो रुकिए मत। पर समझिए कि अकेली डिग्री अब काफ़ी नहीं है। साथ-साथ चीज़ें बनाइए। game jams कीजिए। कोई <a href="https://grow.google/certificates/" target="_blank" rel="noreferrer">Google Career Certificate</a> या Unity certification ले लीजिए। डिग्री को कई credentials में से एक समझिए, सबसे बड़ी credential नहीं।</p>
<p>अगर आप डिग्री नहीं कर रहे, तो आपका रास्ता अलग है पर ज़रूरी नहीं कि मुश्किल हो। जमकर बनाइए। चीज़ें ship कीजिए। सब कुछ document कीजिए। आपका <a href="https://github.com" target="_blank" rel="noreferrer">GitHub</a>, आपका <a href="https://itch.io" target="_blank" rel="noreferrer">itch.io</a> page, आपकी personal site। यही अब आपकी credential है।</p>
<p>चाहे जो भी हो, अपने काम को समझाने की प्रैक्टिस कीजिए। सिर्फ़ ये नहीं कि आपने क्या बनाया, बल्कि ये भी कि आपने जो फ़ैसले लिए वो क्यों लिए। आप क्या अलग करते। आपने क्या सीखा। Interviewers उन लोगों को याद रखते हैं जो अपनी सोच को साफ़ शब्दों में रख पाते हैं।</p>
<h2 id="यह-सिर्फ़-हायरिंग-से-बड़ी-बात-है" tabindex="-1">यह सिर्फ़ हायरिंग से बड़ी बात है <a class="header-anchor" href="#यह-सिर्फ़-हायरिंग-से-बड़ी-बात-है" aria-label="Permalink to &quot;यह सिर्फ़ हायरिंग से बड़ी बात है&quot;"></a></h2>
<p>यहाँ जो हो रहा है वो सिर्फ़ इस बदलाव तक सीमित नहीं कि कंपनियाँ भूमिकाएँ कैसे भरती हैं। यह इस बात का बदलाव है कि हम सब मिलकर किस चीज़ को अहमियत देते हैं।</p>
<p>दशकों तक credentials एक filter का काम करते रहे। महँगे, समय खाने वाले, पर समझ में आने वाले। अगर किसी के पास डिग्री होती, तो आप कुछ बातें मान लेते थे। यह एक संकेत था, सीधी नाप नहीं, पर इतना काफ़ी था।</p>
<p>अब वो संकेत टूट रहा है। तकनीक से अब यह देखना मुमकिन है कि कोई इंसान असल में क्या कर सकता है। Remote work ने साबित कर दिया कि नतीजे इस बात से ज़्यादा मायने रखते हैं कि आप कहाँ बैठे थे। AI theoretical knowledge को practical application के मुकाबले कम कीमती बना रहा है।</p>
<p>मुझे यह सचमुच उम्मीद से भरा लगता है, भले ही यह बदलाव अभी उलझा हुआ है। पहले सवाल होता था &quot;आपने कहाँ से पढ़ाई की?&quot; अब सवाल है &quot;आप क्या बना सकते हैं?&quot;</p>
<p>यह बेहतर सवाल है।</p>
<hr>
<h2 id="स्रोत" tabindex="-1">स्रोत <a class="header-anchor" href="#स्रोत" aria-label="Permalink to &quot;स्रोत&quot;"></a></h2>
<ul>
<li><a href="https://fortune.com/2025/07/01/90-percent-hr-leaders-looking-to-hire-outside-of-traditional-college-degrees-as-they-prioritize-skills/" target="_blank" rel="noreferrer">Fortune: 90% of HR leaders hiring outside traditional degrees</a></li>
<li><a href="https://www.forbes.com/sites/cynthiapong/2024/12/26/90-of-companies-make-better-hires-based-on-skills-over-degrees/" target="_blank" rel="noreferrer">Forbes: 90% of companies make better hires based on skills</a></li>
<li><a href="https://www.forbes.com/sites/jenamcgregor/2024/02/14/companies-are-dropping-diploma-requirements-for-more-jobs-but-hiring-few-non-degreed-workers-to-fill-them/" target="_blank" rel="noreferrer">Forbes: Companies dropping degree requirements but hiring few non-degreed workers</a></li>
<li><a href="https://www.hrdive.com/news/employer-eliminate-degree-requirements-2025/748998/" target="_blank" rel="noreferrer">HR Dive: Employers eliminating degree requirements</a></li>
<li><a href="https://www.computerworld.com/article/1623286/no-degree-no-problem-tech-firms-move-away-from-college-requirement-for-new-hires.html" target="_blank" rel="noreferrer">Computerworld: Tech firms move away from college requirement</a></li>
<li><a href="https://www.dice.com/career-advice/aspiring-video-game-designers-in-2025-what-you-need-to-know" target="_blank" rel="noreferrer">Dice: Aspiring video game designers in 2025</a></li>
<li><a href="https://combinegr.com/2025-global-gaming-employment-outlook-trends-talent-strategy/" target="_blank" rel="noreferrer">CombineGR: 2025 Global Gaming Employment Outlook</a></li>
</ul>
<hr>
<p><strong>संबंधित:</strong></p>
<ul>
<li><a href="/hi/guides/game-jams-hackathons.html">game jams में सफल कैसे हों</a></li>
<li><a href="/hi/guides/game-dev-courses.html">Online Game Development Courses</a> — हर बजट के लिए स्किल्स-फ़र्स्ट learning paths</li>
<li><a href="/hi/tutorials/agentic-code-tools.html">Agentic AI code tools</a> — वे tools जो बदल रहे हैं कि कौन सी स्किल्स मायने रखती हैं</li>
<li><a href="/hi/blog/2026-02-10-the-intuitive-mind.html">सहज मन</a> — क्यों credentials से ज़्यादा intuition मायने रखता है</li>
</ul>
]]></content:encoded>
        </item>
    </channel>
</rss>