مرة أخرى حول المخططات فورونوي

كما هو مكتوب في منشورات المدونة الحديثة ، كافحت للحصول على تفاصيل الخط الساحلي الصحيح في لعبة Dragons Abound . نشأت خيبة أملي أثناء تنفيذ الجزر الحاجزة . لإنشاء أضيق جزيرة ممكنة ، جعلتها موقعًا واحدًا واسعًا - في الشكل أدناه ، كل موقع مثلث Delaunay:


كان هذا غير سارة إلى حد ما - سواء لأن الجزيرة كانت مكسورة للغاية ولأن حجم الأجزاء كان كبيرًا جدًا. يبدو أنه مع زيادة كبيرة في عدد مثلثات Delaunay (أي ، مع انخفاض قوي في حجمها) ، سيتم حل هذه المشكلة - لكن كثافة المثلثات التي أحتاجها أدت إلى تعطل المتصفح.

لقد قمت بحل هذه المشكلة عن طريق فصل معالم الأرض عن التمثيل الداخلي للمواقع. هذا سمح لي برسم جزر من أي حجم أو شكل ، بغض النظر عن شبكة الموقع الأساسية:


لذلك تم حل المشكلة! سمح لي ذلك برسم الجزر الحاجزة ، وبما أن الخط الساحلي لم يعد مطلوبًا لمتابعة الشبكة الأساسية ، إذا لزم الأمر ، يمكن إنشاء خط ساحلي أكثر تفصيلًا بالطريقة المعتادة ، ثم إضافة تفاصيل.

لكن ... كيف نضيف التفاصيل إلى الساحل؟ الأمر ليس سهلاً كما تعتقد. نظرًا لأنني أردت إنشاء خط ساحلي كسري ، فكرت في استخدام كسورية لإضافة تفاصيل إلى الخط الساحلي:


بعد تجربة الإعدادات ، تمكنت من إضافة الكثير من التفاصيل والأشياء المثيرة للاهتمام إلى الساحل. ومع ذلك ، لا يمكن للنظام إنشاء شيء يشبه هذه الخريطة:


يمكن لضوضاء بيرلين أن تخلق هذا النوع من التضاريس إذا كانت هناك شبكة أساسية مفصلة بما فيه الكفاية ، ولكن هل يمكن القيام بذلك دون تخزين ارتفاعات الارتفاع في الشبكة الأساسية بالدقة المطلوبة (بعد كل شيء ، أعرف أن هذا سيؤدي إلى كسر الشفرة الخاصة بي)؟ حتى اكتشفت كيفية القيام بذلك. يعد الخط الساحلي أساسًا طريقًا عبر جميع النقاط التي يكون لقيمة ضوضاء Perlin فيها قيمة صفرية. على الرغم من أننا يمكن أن نتعلم مباشرة من دالة Perlin الضوضاء القيمة في موقع معين (X ، Y) ، لا يمكننا العثور على (قل) "جميع المواقع التي لها قيمة صفرية". بمعنى أنه من الصعب معرفة كيفية رسم محيط مرتفع بدون شبكة أساسية.

والأسوأ من ذلك ، سألت أميت عن كيفية القيام بذلك ، كما أنه لم يكن يعرف الإجابة. إنه شيء واحد عندما لا أستطيع أن أقول هذا ، لكن حتى عندما لا يستطيع هذا الشخص الذكي الإجابة ، أبدأ في التفكير في أنه لا يمكن القيام بذلك. إنه لأمر محزن. يمكنني إعطاء الخط الساحلي أي شكل أحتاج إليه ، لكن لا يمكنني الحصول على الأشكال التي أحتاجها دون شبكة أساسية مفصلة للغاية.

فكيف أحصل على شبكة عالية الدقة دون كسر الشفرة؟

أحد الحلول التي تتبادر إلى ذهني يذكرني بما فعله أزجار في مولد بطاقاته - خلايا فورونوي المتغيرة الحجم. الفكرة الرئيسية هي زيادة كثافة (وتقليل حجم) الشبكة الأساسية على طول الخطوط الساحلية والحفاظ على كثافة أقل في المحيطات وغيرها من المناطق التي لا تتطلب تفاصيل. مع هذا الخيار ، سيكون لدي العديد من خلايا الشبكات فقط في المناطق التي تحتاج إلى تفاصيل. سيكون هذا التغيير صعب التنفيذ في Dragons Abound ، لكنني أريد التفكير فيه. من ناحية أخرى ، لم يكن Azgaar نفسه مسرورًا جدًا بهذا النهج ، لذلك يجب أيضًا مراعاة ذلك.

في موازاة ذلك ، أردت التحقق من أسباب تعطل المتصفح عند معالجة كومة من المثلثات. زودتني أدوات المطور في Chrome بمعلومات أداء مفصلة. أنا لست خبيراً بأي حال من الأحوال في استخدام هذه الأدوات ، ولكن العديد من الوظائف بسيطة بما يكفي لكي يفهمها أي شخص. في حالة الرغبة في معرفة إجمالي حجم الذاكرة المستخدمة في البرنامج ، تحتوي علامة التبويب "الذاكرة" على معلومات حول السعة المستخدمة الحالية:


في هذه الحالة ، فتحت صفحة الويب Azgaar ، وتستهلك ذاكرة متواضعة 20 ميغابايت. يمكنك استخدام هذه الأداة لمعرفة مقدار الذاكرة التي يشغلها Dragons Abound ولتحديد وقت تعطل علامة التبويب.

المعلمة الأساسية التي تتحكم في دقة الشبكة الأساسية في Dragons Abound تسمى بذكاء "npts" (عدد النقاط). لكل مساحة وحدة للخريطة (خرائط المناطق التي عادةً ما استخدمها كأمثلة لها مساحة وحدة واحدة) ينشئ Dragons Abound عددًا محددًا من مواقع الشبكة الأساسية. عادةً ما أستخدم 16 كيلو بايت (16384) ل npts ، مما يعني أن كل موقع شبكة يتوافق مع حوالي 70 بكسل مربع من الشاشة بمقياس تكبير قياسي.


بالطبع ، يعتمد مقدار الذاكرة المستخدم بالضبط على البطاقة ، لكن بالنسبة للبطاقة الموضحة أعلاه والتي تحتوي على 16 كيلو نقطة ، تحتاج إلى 92 ميغابايت تقريبًا:


هذا أقل مما كنت أتوقع ، ولكي أكون أمينًا ، شخصية متواضعة إلى حد ما.

إذا قمت بمضاعفة عدد النقاط في الشبكة الأساسية ، فستزيد سعة الذاكرة إلى 138 ميغابايت:


لم يتضاعف حجم الذاكرة المشغولة ، لأن جزءًا من هذه الذاكرة مشغولة بالموارد وبنية البيانات الأخرى التي لم يتغير حجمها. 16 كيلوبايت من النقاط الإضافية "تزن" حوالي 50 ميغابايت من الذاكرة ، أي ، تشغل كل نقطة كنتيجة تقريبًا 3 كيلوبايت من الذاكرة. هذا أكثر مما كنت أتوقع ، ولكن بصفة عامة لا يزال حجم التداول متواضعًا جدًا. على جهاز كمبيوتر يحتوي على ذاكرة 64 جيجابايت ، بالكاد يكون 150 ميجابايت ملحوظًا.

بعد القيام ببعض الزوجي ، وجدت أن علامة التبويب مع Dragons Abound تعطل عادة عند حوالي 128 ألف نقطة. إذا قبضنا عليها قبل أن تطير ونفحص الذاكرة ، فسنرى ما يلي:


افترضت أن علامة التبويب تعطل بسبب الذاكرة المحتلة ، ولكن عادة ما تكون المشكلة ليست في الذاكرة. لماذا تعطل علامة التبويب؟ الدليل الوحيد هو أن علامة التبويب لا تتعطل إلى أن تكتمل الخريطة ، وربما يكون هذا مؤشرا على أن التعطل يحدث أثناء العرض.

من المنطقي أن نفترض أن SVG I create overloader render render نظرًا لحجمه أو تعقيده. للبدء ، يمكنني معرفة عدد عناصر SVG التي أقوم بإنشائها. في D3 ، يمكنني الحصول على إجمالي عدد عناصر SVG التي تم إنشاؤها باستخدام svg.selectAll('*').size() .

ركض من 16 كيلو نقطة والتحقق من عدد عناصر SVG أظهر لي ما يلي:


تحتوي النقاط 32K على 65457 عنصرًا ، وتحتوي النقاط 128K على 258823. كل نقطة تضاف إلى الشبكة الأساسية تضيف عنصرين إلى الخريطة. أعتقد أنني وجدت مصدرًا للحزن.

تضيف كل نقطة شبكة عناصر SVG بسبب الطريقة التي تجعل بها Dragons Abound الأرض (والمياه). يتم تقديم الأرض عن طريق جعل كل موقع أساسي كمضلع ممتلئ ، متبوعًا بطمس كل منهم. يتيح هذا لـ Dragons Abound منح الأرض نموذجًا جميلًا أو استخدام ارتفاع الأرض لتقديم التظليل ثلاثي الأبعاد للأرض ، كما هو موضح هنا:


يمكنك إيقاف تشغيل تصور الأرض والمحيط للتحقق من عدد عناصر SVG التي تم إنشاؤها. عند 256 ألف نقطة:


واو ، انخفض عدد عناصر SVG بشكل ملحوظ. كما كنت آمل ، الآن يتم تقديم الخريطة دون تعطل! وهذا هو ، إذا كنت تتجنب استخدام شبكة لجعل الأرض والمياه ، يمكنك إنشاء شبكة أكثر كثافة من ذي قبل.

الآن لدي شبكة فورونوي الأكثر كثافة ، أريد أن أتحقق مما إذا كان ذلك يسمح لي بتوليد عناصر الإغاثة التي أحتاجها ، مثل الجزر الساحلية. تخلق شبكة فورونوي الكثيفة مشاكل أخرى (خاصة مع الأنهار) ، لذلك سأطفئ كل شيء باستثناء الخطوط الساحلية لتسريع الاختبار والتركيز عليها. في ما يلي العرض الأصلي لبعض الخط الساحلي عند 256 كيلو بكسل وبه ضوضاء قياسية:


اتضح أن الخريطة تظهر جيدًا ، وأنها تخلق بالفعل ساحلًا أكثر جمالا.

حتى بدون ضبط دقيق ، فإن النتيجة أفضل بكثير. يخلق الضجيج أنواع السواحل الكسورية والجزر الساحلية التي أشرت إليها على الخريطة أعلاه.

هنا الجزر مع زيادة قدرها 300 ٪:


مع هذه الزيادة ، يمكنك أن تلاحظ القطع الأثرية للمثلثات من الشبكة الأساسية ، ولكن رغم ذلك ، يمكن للجزر إنشاء أشكال مثيرة للاهتمام. يمكنك استخدام مكافحة التعرجات (كما أفعل في الإصدار الحالي من الخرائط) للتخلص من بعض التحف الأكثر شهرة في المثلثات. عند التكبير القياسي ، يوفر هذا خطًا ساحليًا أقل وعرة ، ولكنه يلغي أيضًا بعض التفاصيل الصغيرة:


ربما يتعين عليك الاستماع للحصول على حل وسط.

تستخدم معظم مولدات السوشي الإجرائية ضوضاء بيرلين لإنشاء خريطة ارتفاع. نحتاج إلى العثور على معلمات الضوضاء المناسبة ، وتحديد بذرة ، ثم استخدام قيمة الضوضاء في كل موقع (س ، ص) لضبط كتلة الأرض. يتمثل أحد الجوانب الملائمة لصنع الأرض في أنه إذا كنت بحاجة إلى مزيد من التفاصيل على الساحل ، فيمكنك ببساطة ضبط معلمات الضوضاء.

ومع ذلك ، لا تنشئ Dragons Abound الأرض بهذه الطريقة. (أو على الأقل يخلق أكثر من ذلك). يستخدم Dragons Abound العديد من الطرق المختلفة لإنشاء السوشي. على الرغم من أنهم جميعا يستخدمون الضوضاء بدرجة أو بأخرى ، إلا أن قلة قليلة منهم تخلق الأرض مباشرة من الضوضاء. على سبيل المثال ، تحتوي اللعبة على إجراء لإنشاء جزيرة ، والتي تنشئ قناعًا للجزيرة (عادة ما يكون القطع الناقص) ، وتستخدم الضوضاء لجعل القطع الناقص أكثر طبيعية ، ثم تطبق ضوضاء مختلفة لتقريب ملء القناع. عادة ما يتم إنشاء كل خريطة معينة من خلال مجموعة من الإجراءات المختلفة. لذلك ، لا تعد إضافة تفاصيل عن طريق ضبط معلمات الضوضاء لـ Dragons Abound مناسبة للغاية.

لأغراضي ، من الأفضل التعامل مع المشكلة من زاوية مختلفة قليلاً. إذا كان لدي خريطة ارتفاع محددة تحدد الكتل الأرضية ، فكيف يمكنني إضافة تفاصيل إلى حواف هذه الكتل الأرضية؟ قد يقودنا هذا إلى فكرة أننا بحاجة إلى التعرف على حواف الكتل الأرضية وإخفاء بقية الخريطة ، إلخ. لكن ، من ناحية أخرى ، لست ضد إطلاقًا إضافة تفاصيل إضافية إلى بقية الخريطة. إذا كانت الأرض غير مستوية قليلاً أو كان قاع المحيط أشد قليلاً ، فهذا طبيعي.

ماذا تعني إضافة تفاصيل إلى الخط الساحلي؟ الخط الساحلي هو ببساطة خط كفاف فيه خريطة ارتفاع لها قيمة صفرية. (القيمة تعسفية ، ولكن يتم استخدام مثل هذا المبدأ في كل مولد أرض إجرائي.) لجعل هذا الخط أكثر تفصيلاً ، تحتاج إلى تحريك الأرض قليلاً بجوار خط الكنتور هذا لأعلى ولأسفل قليلاً ، حتى تصبح الخطوط الساحلية البسيطة أكثر تعقيدًا ، وتبرز أجزاء من الأرض في المحيط وتصبح الجزر ، وهلم جرا. ولكن هذا لا ينبغي أن يحدث عن طريق الصدفة ، أريد أن تبدو التغييرات طبيعية. نلخص كل هذا ، ويبدو أنك تحتاج إلى إضافة مقدار صغير من الضوضاء إلى الخريطة بأكملها. وفي الحقيقة هذا بالضبط ما فعلته في المثال الأصلي الموضح أعلاه.

بالطبع ، يجب أن يتم ذلك بعناية حتى لا تمحو كتل الأرض التي تم إنشاؤها وخلق مشاكل أخرى. في الأساس ، أحتاج إلى تكوين ثلاثة معلمات.

الأول هو مقياس الضوضاء. المقياس هو مجرد فاصل من القيم لهذه الضوضاء. في حالتنا ، أريد خفض بعض المناطق لأسفل ، ورفع بعضها للأعلى ، لذلك يجب أن يكون نطاق القيم من سلبي إلى إيجابي. ومع ذلك ، لا أريد إضافة جبال جديدة أو إنشاء محيط بعيد عن الخط الساحلي الحالي ، لذا سأجعل القيمة القصوى (المطلقة) للضوضاء جزءًا صغيرًا من ارتفاع الأرض القياسي.

المعلمة الثانية هي التردد الرئيسي للضوضاء. يحدد التردد مدى سرعة تغير الضوضاء داخل الموقع. تتغير الضوضاء منخفضة التردد ببطء شديد ، لذلك (يمكن القول) أن المنطقة الإيجابية ذات الضوضاء المنخفضة يمكن أن تغطي الخريطة بأكملها. تتغير الضوضاء عالية التردد بسرعة ، لذلك (يمكن القول) أن المنطقة الإيجابية ذات الضوضاء العالية يمكن أن يكون لها حجم جزيرة صغيرة. في حالتنا ، يحدد تردد الضوضاء الرئيسي أكبر عناصر الإغاثة التي سنراها في الضوضاء. هذا هو ، إذا كنت تريد أن تضيف الضوضاء (لنقل) جزر صغيرة (ولكن لا شيء أكبر منها) إلى الخريطة ، فأنا بحاجة إلى تحديد التكرار الرئيسي بحجم جزيرة صغيرة.

قد تعتقد أن هذا أمر سهل (ما عليك سوى قياس جزيرة صغيرة وتعيين هذا الحجم للتردد الرئيسي). ومع ذلك ، يتم قياس التردد في إحداثيات وظيفة الضوضاء ، وليس إحداثيات الخريطة! يمكن أن تحتوي وظيفة الضوضاء النموذجية على فاصل زمني من 0 إلى 255 في كل إحداثي ، ويمكن أن تحتوي الخريطة على فاصل زمني من -1 إلى 1. في كل إحداثي ، والأسوأ من ذلك ، أنهارت إحداثيات الضوضاء ، ولا يدرك العديد من المستخدمين الذين يستخدمون الضوضاء ذلك. تعتبر الترجمة من وحدة إلى أخرى وتحديد الترددات المناسبة أمرًا مربكًا ، لذلك يكون من الأسهل عادة فقط تجربة الفواصل الزمنية للتردد واختيار الوحدة التي تنشئ عناصر البطاقة بالحجم الصحيح.

المعلمة الثالثة هي عدد أوكتافات الضوضاء. أوكتافيس هي طبقات إضافية من الضوضاء. كل طبقة تضاعف التردد وتقلل من نطاق الضوضاء إلى النصف. أي أن كل طبقة جديدة تضيف عناصر الإغاثة أقل مرتين من الطبقة السابقة ، ولكن أيضًا أضعف مرتين. وهذا يعني أنك تحتاج إلى تحديد عدد أوكتافات تعطي أصغر العناصر التي نحتاجها ، ولهذا قد تحتاج إلى ضبط مقياس الضوضاء ، لأنه لا يزال قوياً بما يكفي في أعلى أوكتاف لتظهر على الخريطة. بما أنني قمت بذلك عن قصد لجعل الخطوط الساحلية معقدة للغاية ، فسأستخدم عددًا لا بأس به من أوكتافات الضوضاء.

دعنا نبدأ مع الإعداد. للبدء ، سوف أقوم بإنشاء خريطة مثال دون ضجيج إضافي:


من الواضح أن هذا الخط الساحلي ممل مع خطوط ناعمة وعدة جزر كبيرة. هذا هو نفس الخط الساحلي مع عينة الضوضاء الأصلية:


غير الضجيج بشكل كبير شكل الخريطة ، حيث حول شظايا كبيرة من الأرض إلى محيط ، والعكس بالعكس. ظهرت العديد من الجزر ، بما في ذلك في البحر. كل هذا يشير إلى أن مقياس الضوضاء كبير جدًا. يجب أن تكون أكبر عناصر الإغاثة الفردية المضافة بواسطة الضوضاء هي حجم الجزر الصغيرة في الخريطة الأصلية. ربما يكون هذا هو الحجم الأقصى الجديد للعناصر ، مما يثبت أن التردد الرئيسي للضوضاء يتم اختياره تقريبًا بشكل صحيح. أخيرًا ، ظهرت الكثير من التفاصيل الصغيرة ، وصولًا إلى حدود حجم الشاشة ، وهذا يدل على وجود عدد كافٍ من الأوكتافات. (ومع ذلك ، قد يكون عدد أوكتافات أكثر من اللازم. هذا لا يؤثر على مظهر البطاقة ، لكنه غير فعال.) يبدو أنك بحاجة إلى ضبط مقياس الضوضاء بشكل أساسي.

يعد ضبط الضوضاء عملية معقدة إلى حد ما لأنني أريد أن تؤثر هذه الضوضاء بشكل أساسي على الأرض والمياه عند خط كفافي يبلغ ارتفاعه 0 درجة تقريبًا. وهذا يعني أنني بحاجة إلى نطاق صغير نسبيًا ، لكن ليس من الواضح كيفية اختيار الرقم الصحيح ، لأن في خرائط مختلفة ، يختلف توزيع المرتفعات. الحل هو العثور على المقياس الصحيح أثناء الطيران. يمكنك أخذ جميع القيم المطلقة للارتفاعات على الخريطة ، وفرزها ، والعثور على نقطة القطع التي تحدد (مثلا) 10 ٪ من المواقع حول الصفر. تقع جميع هذه المواقع في الفاصل الزمني (على سبيل المثال) [-0.05 ، 0.05] ، وبعد ذلك يمكنني استخدام القيمة 0.05 لتحديد مقياس الضوضاء المضافة.

(أكتب "تعريفات" لأنه لأسباب مختلفة لا يمكنك فقط استخدام 0.05. أولاً تحتاج إلى تحويل الأرض إلى ماء والعكس بالعكس. إضافة (قل) 0.002 إلى -0.05 لن تؤدي إلى أي تغييرات مرئية على الخريطة ، أي أن الفاصل الزمني يجب أن يكون أكثر من 0.05 إذا كنت أرغب في تحويل نسبة كبيرة من المواقع التي يبلغ ارتفاعها -0.05 من الماء إلى الأرض ، وثانيا ، لا يتم توزيع وظائف الضوضاء بشكل متساوٍ ، لذلك بمقياس 0.05 ، لن تعود وظيفة الضوضاء فعليًا إلى 0.05! يجب أن يكون الحجم أكبر بكثير من أكبر القيم التي نريد أن نرى في كثير من الأحيان بما فيه الكفاية.)

بعد أن جربت ذلك ، وجدت قيمة تضيف التعقيد إلى السواحل ، مع عدم تغييرها بشكل كبير ، وكذلك إنشاء عدد صغير من الجزر:


كالمعتاد ، يمكن أن تأخذ هذه المعلمات في اللعبة فاصلًا من القيم ، لذلك يمكنني الحصول على مجموعة واسعة من البطاقات: من البطاقات ذات السواحل الناعمة إلى حد ما إلى البطاقات ذات البنوك المكسورة والمعقدة. ترك البرنامج يختار القيم ، حصلت على النتيجة التالية:


تقع السواحل على الجانب الأكثر سلاسة ، لكن لا يزال هناك الكثير من التعقيد الإضافي في الحجم المتوسط ​​وعدد كافٍ من الجزر الجديدة.

عند تنفيذ السواحل الكسورية ، أدركت القدرة على التحكم في مستوى التكسير باستخدام وظيفة الضوضاء ، لذلك سيكون لبعض المناطق سواحل سلسة ، بينما سيكون لسواحل أخرى مناطق معقدة. اعتقدت أن هذا سيزيد من اهتمام الخريطة إلى حد كبير ، وسيبدو أقل "تم إنشاؤه" ، لذلك سأضيف هذه الميزة هنا. الفكرة بسيطة للغاية - قبل إضافة ضوضاء الخط الساحلي إلى الخريطة ، قمت بضربها بإخراج وظيفة الضوضاء الثانية ، والتي تتراوح من صفر إلى 1. عندما تكون هذه الوظيفة صغيرة ، ستضاف التفاصيل الصغيرة إلى الخطوط الساحلية. عند الاقتراب من 1 ، سيتم إضافة تفاصيل إضافية بالكامل. عند تحديد مقياس وظيفة الضوضاء الثانية ، والتي تتباين ببطء على الخريطة ، سأحصل على بعض المناطق ذات الخطوط الساحلية المعقدة ، وبعضها مع خطوط بسيطة ، والانتقالات المنطقية بينها:


أنا هنا جعلت المعلمات الساحلية كبيرة ، بحيث يكون الفرق أكثر وضوحا. نرى سواحل برية وعرة في الشمال الشرقي ، وشواطئ أكثر سلاسة في الغرب.

لذلك ، قمنا بتحسين توليد السواحل بشكل كبير ، لكن لا يزال يتعذر علي إنشاء خريطة بها الكثير من مثلثات Delaunay. لا أعرض سوى خرائط الخطوط العريضة لأن العديد من عناصر الخريطة الأخرى مقطوعة. يجب أن تكون ثابتة.

لا يعمل باقي البرنامج بشكل جيد مع العديد من مثلثات Delaunay (مع الإعدادات الحالية 256 كيلو بايت). المشكلة الرئيسية هي أن Dragons Abound يسحب الأرض والمياه من خلال رسم كل المثلثات الفردية ، ويتسبب الكثير من عناصر SVG في تعطل المتصفح. لذلك اضطررت إلى تعطيل تقديم السوشي بالكامل. ربما هناك طريقة للتغلب على هذه المشكلة ، ولكن وجود مثلثات كثيرة يخلق مشاكل أخرى. على سبيل المثال ، يجب أن تعالج بعض أجزاء البرنامج الخريطة بالكامل. كل واحد منهم يصبح أبطأ 16 مرة في مواقع 256K من في 16K المواقع. أيضا في الكود هناك أجزاء (على سبيل المثال ، نموذج هطول الأمطار جديد) التي تنقطع عند العمل مع العديد من المثلثات. ومن إنشاء مثل هذه الشبكة التفصيلية للمواقع ، لا نكتسب أي شيء - بعد إنشاء الخط الساحلي ، لا شيء يتحسن من التعقيد الإضافي. لذلك ، على الرغم من أنه يمكنني مراجعة البرنامج وإصلاح تلك المناطق التي يبطئ فيها عدد كبير من المواقع أو يكسر الكود أكثر من اللازم ، إلا أنه يبدو من الأسهل تقليل دقة شبكة الخريطة بعد إنشاء الخطوط الساحلية.

كما ذكر أعلاه ، نفذت Azgaar بالفعل العمل لتغيير دقة شبكة Voronoi التي تقوم عليها الخريطة. لقد أدرك إمكانية تغيير دقة الشبكة على الطاير في عملية التوليد ، أي أنه (على سبيل المثال) يمكنه زيادة كثافة المواقع على طول الساحل. ومع ذلك ، فإن التغيير المحلي في الكثافة له عيوبه - على وجه الخصوص ، فإنه يخلق مثلثات غريبة على طول الحدود. اقترح أزجار في وقت لاحق أن النظام معقد للغاية ولا يستحق الجهد المبذول. يعرف أزجار عادة ما يتحدث عنه ، لذلك سوف أتحمل كلمته ولن أحاول إعادة تغليف الشبكة النهائية.

بدلاً من ذلك ، قمت بإنشاء شبكة ثانية ذات الدقة المطلوبة (الأدنى) ، ثم قمت بنسخ خريطة الارتفاع إلى هذه الشبكة الجديدة. (لا تنس أن Dragons Abound تقوم الآن بتخزين الخطوط الساحلية بشكل منفصل عن الشبكة ، لذلك بعد إنشائها ، لم تعد تعتمد على الملاءمة الدقيقة للشبكة. للقيام بذلك معقدة بعض الشيء. نظرًا لأن الشبكة الأصلية لديها دقة أعلى بكثير من الشبكة الجديدة ، فإن العديد من المواقع في الأصل سيتم تثبيت الشبكة على موقع واحد في الشبكة الجديدة. لكل موقع من مواقع المصدر ارتفاع مختلف على خريطة الارتفاع ، كيف يمكنني نسخها؟ استخدام المتوسط؟ أو الحد الأقصى (الحد الأدنى) الارتفاع؟

للبدء ، ما عليك سوى تحديد موقع عشوائي واحد لمعرفة ما إذا كانت الشبكة الجديدة تعمل مع بقية البرنامج:


كل شيء تبين بشكل جيد بشكل مدهش. يحدث خطأ بسيط عندما لا يتم وضع علامة على المواقع الجديدة بشكل صحيح على أنها أرض أو ساحل أو ماء ، ولكن بعد حل هذه المشكلة ، كان إنشاء الخريطة جيدًا. تحتاج إلى تنظيف العيوب الطفيفة (على سبيل المثال ، علامة Palmanor التي خرجت على الماء) ، ولكن بشكل عام تبدو جيدة. حتى الجزر الصغيرة تحولت إلى جميلة.

في النهاية ، قررت أنه مع انخفاض دقة شبكة Voronoi ، سيكون كل موقع متوسط ​​المواقع الأساسية. هذا يبدو قرارًا حكيمًا ، وإذا لزم الأمر يمكن تغييره دائمًا. توضح هذه الصورة كيف تم فصل السواحل عن الشبكة النهائية:


لتلخيص: في Dragons Abound ، يتم استخدام شبكة مثلثات Delone عالية الدقة عند إنشاء خريطة الارتفاع. بعد اكتماله ، يقوم Dragons Abound بتعريف السواحل بتتبع التحولات من القيم السلبية إلى القيم الموجبة في خريطة الارتفاع. ثم تقوم اللعبة بنسخ الشبكة عالية الدقة إلى شبكة ذات دقة أقل بكثير ، حيث يبلغ متوسط ​​المواقع التي تقع في مكان واحد في الشبكة الجديدة. بعد ذلك ، يتم تجاهل الشبكة عالية الدقة ، ويستمر الجزء المتبقي من التوليد الإجرائي والتصور على الشبكة منخفضة الدقة. سؤال مثير للاهتمام هو ما إذا كان استخدام شبكة Delaunay له أي قيمة في هذه المرحلة ؛ قد يكون الأمر يستحق النسخ إلى شبكة من السداسي أو شيء مشابه.

Source: https://habr.com/ru/post/ar439224/


All Articles