تتميز المحاكاة الفيزيائية بميزة واحدة مذهلة - يمكن إيقافها وإعادة لفها وإعادة تشغيلها. هذه أداة قوية للغاية يمكن استخدامها لتوليد عوالم غير عادية. في هذا المنشور ، سأصف كيف استخدمت هذا لمزامنة صوت الكرات التي تضرب الموسيقى الشهيرة. أسأل المهتمين تحت الخفض!
المقدمة
أحب إنشاء جميع أنواع التصورات الرائعة ، والمحاكاة الفيزيائية وكل تلك الأنواع من الأشياء. وحتى قبل سنتين أو ثلاث سنوات، عندما كنت في تطوير وجهتي المقبلة الفكرة ، وكان لي فكرة، ولكن ماذا لو أننا توليد العالم المادي بحيث العمليات التي تجري في ذلك خلق اللحن؟ في الواقع ، في محاكاة الكمبيوتر ، يمكننا دائمًا التراجع ، وتصفح الخيارات ، واختيار الأفضل ، وفي نفس الوقت لدينا جميع المعلومات حول اللحن: الملاحظات ، ووقت تشغيل النوتة. لذلك خطرت لي فكرة أن أعيش في رأسي حتى أوقات أفضل ، حتى أتاح لي الوقت لكتابة شيء في الحجر الصحي ، وهكذا ظهر هذا المشروع مع هذا المقال.
نموذج
بادئ ذي بدء ، قررت اختيار نموذج بسيط إلى حد ما. في نموذجي ، يوجد نوعان فقط من الأشياء: الرخام والمنصات أو الألواح الخشبية. تحتوي المنصات على إحداثيات ثابتة بدقة ، ويتم تعيينها بنقطتي نهاية وعرض ثابت. تقع الكرات تحت تأثير الجاذبية ويمكن أن ترتد عن المنصات وفقًا لقوانين الفيزياء. أيضًا ، قررت استخدام التصادمات المرنة تمامًا فقط بحيث تظل طاقة النظام دائمًا دون تغيير. لكن الشيء الأكثر أهمية هو أنه عندما تصطدم الكرة بالمنصة ، يتم تشغيل صوت ، كل منصة لها صوتها الخاص ويمكن أن تتكون من عدة نغمات في وقت واحد.
وهكذا ، فإن عالمنا يتكون من العديد من المنصات ، لكل منها صوت خاص به. والكرات التي تسقط في هذا العالم يمكن أن تخلق سلسلة من الأصوات ، وفي حالتنا ، حتى اللحن.
الخوارزمية
لقد توصلنا إلى النموذج ، ولكن كيف نخلق مثل هذا العالم بحيث تصطف أصوات الكرات الضاربة في لحن معروف ؟
قررت أن استخدام معظم أخرق، مع ذلك، والتي ثبت أن تكون جيدة تماما، القوة الغاشمة متكررة، وعامة الناس القوة الغاشمة . ولكن لكي يعمل كل شيء كما ينبغي ، كان علي استخدام بعض الحيل. يتم تنفيذ جميع الخطوات اللاحقة داخل دالة تكرارية:
- نحن نحاكي العالم ، حتى اللحظة التالية عندما تحتاج إلى عزف نغمة.
- إذا حدث تصادم غير مرغوب فيه أثناء المحاكاة ، نعود إلى المستوى الأعلى.
- , , , . , .
. «» ( , , ).+ 70 ∘ - 4. .
- 5. ,
- 6. , ,
القراد ، لم تحدث تصادمات ، وإذا كان الأمر كذلك ، فأعد العالم الناتج نتيجة لذلك.م
في الصورة يمكنك رؤية تصور لخطوة واحدة من هذه الخوارزمية:
ملحوظة
, , , . , , . , . , .
توقف العودية
مثل أي خوارزمية bruteforce ، هذه الخوارزمية لها عيب في شكل "توقف العودية" ، يحدث هذا عندما لا تسمح بعض الأنظمة الأساسية "السيئة" بإنشاء الخريطة في المستقبل ، ولكنها في نفس الوقت تسمح لك بإنشاء جزء كبير بما يكفي منها ، ولكن ليس تمامًا ... في هذه الحالة ، سوف تتعطل العودية حتى تعدد جميع الخيارات الموجودة في الشجرة الفرعية العودية التي تولدها هذه المنصة "السيئة". لا توجد مشكلة عندما لا يتجاوز ارتفاع هذه الشجرة الفرعية 4-8 مستويات من التكرار ، ولكن في بعض الأحيان يمكن أن تصل إلى 20-30 مستوى ، مما يجعل من المستحيل التكرار عبر جميع متغيرات هذه الشجرة الفرعية.
لذلك ، في تطبيقي ، قررت استخدام الكشف عن مجريات الأمور للتغلب على المشكلة. الفكرة هي انهيار جزء من العودية عند اكتشاف مثل هذه الحالات. بدا لي الأمر الأكثر وضوحًا للعودة إليه
يمكنك مشاهدة نتيجة هذا الاستدلال في العرض التوضيحي ، عندما تتم إعادة تعيين تقدم إنشاء الخريطة في بعض الأحيان بنسبة 10٪. لكن في نفس الوقت ، يسمح لك بإكمال إنشاء البطاقة في وقت معقول.
الجيل التكراري
الآن دعنا نحل المشكلة التالية: بعد بدء إنشاء الخريطة ، تتجمد الصفحة لمدة 10-30 ثانية ومن المستحيل فهم ما يحدث على الإطلاق ، أو سقط كل شيء ، أو يستغرق إنشاء الخريطة وقتًا طويلاً. لذلك ، قررت أن أكتب أيضًا تنفيذًا تكراريًا لخوارزمية التوليد بحيث يمكنك إنشاء خريطة في أجزاء صغيرة باستمرار.
لم يكن عليّ ابتكار شيء جديد ، لقد أعدت كتابة الخوارزمية العودية على مكدس صريح. وبالتالي ، ظهر شريط تقدم على الصفحة سيساعدك على فهم أن الكود لم يسقط ، فالأمر يستغرق وقتًا طويلاً للعثور على موقع مناسب للمنصات لمسارك.
في بعض الحالات، يمكن للجيل تستغرق وقتا طويلا جدا، لهذا أنا واضاف تشغيل زر ، الذي توقف توليد ويبدأ محاكاة العالم.
تحميل نغمة
لتنزيل اللحن ، أستخدم ملفات midi ، لكن قبل ذلك قمت بتشغيله من خلال tonejs.github.io/Midi لتحويله إلى ملف json سهل الاستخدام للمتصفح (ولكن في الوقت الحالي ، لا يتوفر في العرض التوضيحي وظيفة تنزيل ملفي ، يتوفر فقط خيار من قائمة جاهزة).
من المهم أيضًا ملاحظة أنه غالبًا ما يكون هناك العديد من المسارات المتوازية داخل ملف midi ، ولكن نظرًا لأن الخوارزمية الخاصة بي تعمل حتى الآن مع كرة واحدة فقط ، فسيتم تحميل مسار واحد فقط بأكبر عدد من الملاحظات.
النتائج
بعد إضافة بعض التأثيرات ، قمت بتسجيل الفيديو الأول:
بعد الإطلاع عليها عدة
قد يُظهر الفيديو عدم التزامن ، لقد لاحظت ذلك لاحقًا. إذا ذهبت إلى الصفحة مع العرض التوضيحي ، فلن يكون هناك عدم تزامن (يتم تشغيل الصوت في الواقع فقط عند تسجيل الإيقاع).
ماذا بعد؟
لدي خطط لإضافة القدرة على إنشاء مثل هذه الخرائط لعدة كرات في وقت واحد. لدي أفكار حول كيفية القيام بذلك ، لقد اختبرت العديد من الخيارات ، ولكن حتى الآن تعمل جميعها ببطء شديد لإنشاء مسار كامل.
كانت فكرة أخرى لي هي إضافة أشياء جديدة: الأزرار ، ونقاط الانطلاق ، والمدافع (؟) ، والخواتم ... يمكن استكمال القائمة :) يمكنهم تنويع العالم بشكل كبير.
الرمز
جميع التعليمات البرمجية المصدر التي يمكنك العثور عليها في مستودعي
أي اقتراحات أو طلبات سحب أو اختبارات قصيرة مرحب بها!