الطبيعية 'المياه' تتدفق من خلال شبكة من العقد

StackOverflow https://stackoverflow.com/questions/1962150

  •  21-09-2019
  •  | 
  •  

سؤال

نأمل أن هذا سوف يكون واضحا بما فيه الكفاية.

لدي خريطة 2d مصنوعة من البلاط و أريد "المياه" إلى السفر من خلال هذه الخريطة.فإنه يخرج من الأنابيب على معين البلاط ، ومن ثم يجب أن تملأ ، مثل الماء كل البلاط إلى بعض البلاط الأخرى.لدي حاليا خريطة إدخالها في اللعبة مع كل البلاط كونه عقدة كل عقدة وجود اتصالات المناسبة البلاط من حوله.لقد العقد المخزنة في مجموعة مصنفة الأولى من x ثم y.بالإضافة إلى ذلك, بعض البلاط 'البوابة' البلاط التي يمكن أن توقف وتتدفق المياه من خلالها.هذه هي جزء من الشبكة نفسها من عقدة البلاط و هي مجرد علامة عندما نشط.

المشكلة هي كيف تفريق الماء.

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

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

وهكذا تختتم المعضلة.

يتم كتابة التعليمات البرمجية في بيثون.

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

هل كانت مفيدة؟

المحلول

يأتي هذا كثيرًا في تطوير اللعبة - كان هناك العديد من محادثات GDC ومجلة Gamasutra/Game Developer تتميز بمقالات حول هذا الموضوع بالذات. الأفضل لأغراضك على ما أعتقد جوس ستام'س "ديناميات السوائل في الوقت الحقيقي للألعاب"من 2003 GDC.

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

مقالة ميك ويست حول ديناميات السوائل بالنسبة إلى Gamasutra يمتد ورقة Stam في بعض النواحي التي قد تحسن الأداء ، لذلك قد ترغب في البدء هناك.

يوجد ايضا مقال جامديف الذي ترعاه Intel مؤخرًا يقدم حلاً أكثر اكتمالًا, ، لكنها معقدة إلى حد ما وتركز أكثر على جانب العرض الرسومي في 3D.

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

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

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

نصائح أخرى

بعض الاستدلال على افتراضات:

  • منفصلة "قطرات" التي تحتل بالضبط مربع واحد كل
  • الماء لا يبقى أكثر من واحدة عالية في البلاط ،
  • الماء يبقى دائما المستمر
  • عندما الحواجز حتى هم مثل الجدران
  • عندما الحواجز وصولا فهي مثل الساحات المفتوحة

على كل بركة الحفاظ على قائمة من حافة الساحات المفتوحة الساحات بجانب حواف.

عند حاجز يذهب إلى أسفل

amend the lists of edge and open squares for any puddles that were touching it

عند حاجز ترتفع

if (it was covered)
    pick a non-wall square next to it at random, and add the drop from the barrier there.
amend the lists of edge and open squares for any puddles next to the block

عند إضافة قطرة:

if (the square "under" the pipe is empty)
   fill it
else
   consult the list of edge square associated with the pool under the pipe, and select the one closest to the pipe (if more than one is closest, choose from the candidates at random), and fill it.  
amend the lists of edge and open squares for the puddle (be prepared to merge with neighboring puddles if necessary)

عند إزالة قطرة

 find the edge (not open!) square farthest from the sink (or randomly select from the equivalent candidates), and empty it
 amend the lists of edge and open squares for the puddle

(هدب المتاحة هنا هو جعل "أبعد" تحده مسافة متساوية إلى أخرى المصارف ، بحيث الساحات في وسط بركة يمكن أن تصبح فارغة إذا كانت بين المصارف)

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

هل يتضمن نموذجك مفهوم الفرق المحتمل أو الضغط؟

قل أن البلاط الفارغ له ضغط صفري ، وبلاط كامل ضغط 10. إذا كان هناك أنبوب بين بلاطين ، ثم يتدفق الماء لتحديد الضغط ، فإن البوابة تغلق أنبوبًا بحيث لا يتدفق أي شيء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top