3D الجسيمات الحياة

تحية! قررت أن أشارك القراء في تجربتي الصغيرة مع أنظمة الجسيمات في الفضاء ثلاثي الأبعاد. أخذت كأساس للنشر على Habré حول تجارب الجسيمات في الفضاء ثنائي الأبعاد.



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


أخذت C ++ كأساس ، إضافة الدعم ل CUDA كمنصة للحوسبة ، وهناك الكثير من الجزيئات والمعالج المركزي من الواضح أنه لا يمكن التعامل مع مثل هذا الحمل في الوقت الحقيقي ، ومحرك رسومات Ogre3D لهم في الشركة. لقد صنعوا العصيدة ، وسأقوم بتوظيف رواية GIF مع الرسوم المتحركة ونقلت من المقال على نسخة 2D من المحاكاة.


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


نحن نثرثر بشكل عشوائي على الجزيئات في جميع أنحاء الميدان ونرى ما سيحدث ".



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


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


جربت العديد من الخيارات للقوى المثيرة للاشمئزاز ، التبعيات الخطية على المسافات بين الجسيمات ، متناسبة عكسياً مع المسافة ، إلخ. استقر على الاعتماد التربيعي العكسي ، ولكن مع وجود قيود على نصف قطر العمل ، مثل 45 نصف قطر جزيئي.



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


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



فيديو متقدم


أو كصورة



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



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



نسخة موسعة من الفيديو


كما يقول المثل ، إن لم يكن مكعب ، فليكن هناك كرة:



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


__device__ static int Links[3][3] = {{1,0,1},{1,0,0},{1,1,0}}; __device__ static int LinksField[3][3] = {{0,0,0},{0,0,1},{0,0,0}}; __device__ static int LinkTypeSize[3] = {3,8,2}; __device__ static int LinkTypePP[3][3] = {{0,1,1},{8,1,6},{0,1,1}}; 

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


نحصل على جزيئات في حركة براونية قوية:



نسخة موسعة من الفيديو


اضطررت لإدخال فقدان الطاقة في الاصطدامات.



نسخة موسعة من الفيديو


أصبح كل شيء ثابتًا جدًا ، فنحن نحد من قوى تفاعل الجسيمات.



نسخة موسعة من الفيديو


إذا شاهدت الفيديو ، يمكنك أن ترى كيف يتم بناء الإطار. ثم لا يزال ثابتا على أي حال.


نقوم بتغيير القواعد المتعلقة بمعاملات المصفوفة.



نسخة موسعة من الفيديو
نرى تشكيل تشبه الجزيئات العضوية. هناك حتى حلقات البنزين.



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



ولكن يجب أن نحاول تكرار الإصدار 2D للمؤلف ، الذي يقتبس في نص المقال. هناك نوع مختلف من هذه "الحياة":



او كذا



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


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



آمل أن يعجبك أحدهم وأن يتقدم إلى أبعد من ثلاثي الأبعاد لأن المؤلف قد ابتعد عن 2D. الشيء الرئيسي بالنسبة لي هو تكرار الدروس على CUDA و Ogre3D تحت Ubuntu.



وستكون هناك أفكار تكتب ، ربما سنتوصل إلى شيء مثير للاهتمام :)

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


All Articles