Sup Step in Dynamic Simulations در هودینی
Sup Step in Dynamic Simulations
در کل فکر میکنم همه دوستان با این پارامتر در بخش داینامیک نرم افزارها آشنایی داشته باشند و باهاش به خوبی کار کنند ، من فقط قصد دارم به صورت تقریبا خلاصه به صورت خیلی ساده و با کمک مثال نحوه عملکرد این پارامتر رو برای دوستانی که هنوز آشنایی کامل راجب اون ندارن توضیح بدم و البته اینکه وقتی اصول کارش رو یاد بگیریم دیگه فقط حفظی با اون کار نمیکنیم و فقط در جایی که لازمه از اون استفاده میکنیم.
کلا طبق تعریف عمومی ، پارامتر Substep برای نرم افزار مشخص میکنه که معادلات داینامیک در هر فریم چند بار محاسبه یا Solve بشه.
بنابراین اگر در هر فریم ما تعداد بیشتری محاسبات داینامیک رو انجام بدیم یکسری مزیت ها داره ، مثلا دقت محاسبات بالا میره و خطا کمتر میشه ، این مزیت رو در زمانهایی کاملا لمس میکنیم که با آبجکتهایی در داینامیک سرو کار داریم که سرعت بسیار بالایی دارن. مثل یک ماشین که با سرعت بسیار زیادی حرکت میکنه و قرار از درون یک آبشار که با پارتیکل ساختید رد بشه ، یا بالعکس به جای اینکه آبجکت شما حرکت سریع داشته باشه ، ممکنه Emitter شما حرکت سریع داشته باشه ، مثلا موشکی ساختید که قراره در دنباله خود دود یا پارتیکل جای بزاره ، و این موشک با سرعت بسیار زیادی در حرکته.تست
در هر دو مثلا به دلیل اینکه ممکنه آبجکت های ما در هر فریم فاصله خیلی زیادی رو طی کنند ، محاسبات داینامیکی به مشکل میخوره ، مثلا ممکنه ماشین در فریم قبل پشت آبشار باشه و در فریم بعدی به دلیل اختلاف زیاد موقعیت ماشین در هر فریم ، ماشین در جلوی آبشار قرار بگیره و اونو رد کنه !
حالا چون این وسط در بین فریم ها داینامیکی محاسبه نشده ، بنابراین حتی ممکنه پارتیکل ها متوجه نشوند که از داخلشون ماشین رد شده و هیچ تغییری نکنند !
اما اگر به فرض substep رو روی 2 یا بیشتر تنظیم کنیم ، اونوقت بین فریم قبلی و بعدی ، ما فریم های میانه هم داریم که در اون فریم ها ماشین در وسط آبشار میتونه قرار دلشته باشه و بنابراین محاسبات داینامیکی و Collision روی آنها انجام میشه .
در مثال Emitter هم بعضا در برخی شرایط میبینید که به دلیل سرعت زیاد موقعیت مکانی Emitter در محیط ، ممکنه پارتیکل ها به صورت پله پله تولید بشن یا دودی که از امیتر منتشر میشه ، به صورت خیلی مصنوعی حالت پله پله به خود بگیره ،چون امیتر در فریم قبلی در یکجا شروع به انتشار میکنه ولی ار فریم بعد در یک نقطه دیگر فضا با فاصله خیلی زیاد شروع به انتشار میکنه و پارتیکل های این دو فریم فاصله خالی زیادی بینشون ایجاد میشه.
در این حالات هم با بالا بردن Substep مشکل تا حدی بر طرف میشه ( البته یکسری راهکار دیگه هم برای رفع این مشکل به جز Substep وجود دارند که بعدأ در مقالات یا فیلم آموزشی توضیح میدم ).
بنابراین اگرچه با بالا بردن Substep میتونیم دقت شبیه سازی رو بالا ببریم ولی حدس زدنش نمیتونه سخت باشه که سرعت پردازش محاسبات هم به همون نسبت کند میشه !
چون ما در حقیقت داریم تعداد فریم های بیشتری رو پردازش میکنیم ، مثلا در یک پروژه 100 فریمی اگر substep رو روی 2 تنطیم کنیم به جای 100 فریم 200 فریم پردازش میشه ! و این هم زمان انجام محاسبات رو کند میکنه و هم رم بیشتری از سیستم گرفته میشه !
پس باید دقیقا یاد بگیرید که Substep رو کی و کجا باید زیاد کنید تا الکی سرعت پردازش کارتون پایین نیاد یا به مشکل کمبود سخت افزار برخورد نکنید !
بهترین راه برای دونستن اینکه کی و کجا باید از Substep استفاده کنید کار کردن زیاد و کسب تجربه در داینامیکه ، که با تمرین و انجام پروژه ها و تست های مختلف میتونید بهش برسید .
چرا تغییر Substep گاهی وقت ها در نتیجه محاسبات تاثیر میزاره ?
معمولا با تغییر Substep ما تفاوتهایی رو در خروجی کارمون میبینیم ،حالا این تفاوت بسته به اینکه چی چیزی رو داریم Solve میکنیم(مثلا پارتیکل یا دود یا آب )
میتونه خیلی کم باشه یا خیلی زیاد , و بیشتر بستگی به این داره در داخل اون Solver که داریم ازش استفاده میکنیم از چه معادلاتی استفاده شده یا ما از چه دستورات و چه نوع نیروهایی برای اون شبیه سازی استفاده کردیم.
برای کشف دلیل این اختلاف نتیجه اجازه بدید یک مثال ساده بزنم :
فرض کنید ما فقط یک عدد پارتیکل داریم و دستوری را براش نوشتیم که بر اساس تابع Rand در هر فریم یک عدد رندوم و تصادفی رو به شتاب یا velocity اون پارتیکل اضافه کنه.
مثلا دستور زیر رو نوشتیم :
velocity = velocity + rand(id
طبق این دستور یک عدد رندوم با توجه به فریم ، به شتاب پارتیکل اضافه میشه.
پس مثلا اگر در فریم یک خروجی عدد رندوم 0.2 باشه و در فریم دو خروجیش 0.43 باشه ، این اعداد در فریم اول و دوم به شتاب پارتیکل اضافه میشن. اما اگر Substep روی 2 در نظر بگیریم ، ما به جز این اعداد ، یک عدد رندوم دیگری برای فریم 1.5 هم داریم که به شتاب پارتیکل اضافه میشه.
پس عددی کاملا متفاوت که هیچ ربطی به عدد قبلی یا بعدی نداره (چون تابع رندوم استفاده کردیم ) به شتاب پارتیکل در میانه مسیر اضافه میشه و در نتیجه این پارتیکل مسیری کاملا متفاوت رو با حالت قبل طی می کنه !
این اختلافات در زمان استفاده از توابع دیگر مانند Noise ها هم کاملا به چشم میخوره ، مانند Noise که در بخش نیروها داریم یا حتی اونهایی که در سیستم Pyro solver داریم.
حالا اگر ما به جای یک عدد پارتیکل ، یک سیستم بزرگ تر مانند دود یا آتش یا یک آبشار داشته باشیم ، این اختلاف عددی کوچک میتونه سبب تفاوت های بزرگی در خروجی بشه.
اما این تفاوت فقط در زمان استفاده از توابع رندوم یا نویز و غیره نیست ، گاهی وقتها ممکن اون Solver از معادلاتی استفاده کنه که اون معادلات یا بخش های داخل Solver هم رو ی خروجی تاثیر بزارن.
مثلا میدونید که ما در ند Flip Solver برای محاسبه مایعات ، امکاناتی داریم به اسم Particle Reseed , بر اساس این امکان اگر بنا به دلایلی تعدادی از پارتیکل های آب در زمان پردازش شبیه سازی از بین برن ، سیستم Flip برای تقریبا ثابت نگاه داشتن تعداد کل پارتیکل ها ، خودش به صورت اتوماتیک یکسری پارتیکل جدید در جاهایی که پارتیکل ها از بین رفتن ایجاد میکنه.
حالا اگر Substep یک باشه ، ممکنه این اتفاق بین فریم 39 و 40 بیوفته ، اما اگر Substep روی 2 باشه ، ممکنه این اتفاق در فریم های 39.5 اتفاق بیوفته و چون در این فریم یا اصطلاحا در این استپ پارتیکل های جدید ساخته شده اند ، ما در فریم 40 یا استپ بعدی پارتیکل های جدید رو داریم و همچنین نیروها هم به اندازه یک استپ روی موقعیت و شتاب اون پارتیکل های جدید تاثیر گذاشتن ، اما در حالتی که Substep روی یک بود ، پارتیکل های جدید تازه در فریم 40 ساخته شده بودند و هنوز هیچ نیرویی رو آن ها اعمال نشده بود و بنابراین موقعیت مکانی متفاوتی داشتند.
خوب اگر چه این تفاوت ها فقط برای این بخش ها نیست و مثال های زیاد دیگری هم وجود داره ، اما من احساس کردم این دو مثال به تنهایی میتونه کمکتون کنه تا درک کنید دقیقا چرا Substep روی نتیجه خروجی تاثیر میزاره.
البته این موضوع هم بگم که اگر تجربه زیادی در کار با داینامیک داشته باشید و دقیقا بدونید که هر Solver در هودینی از چه ابزارها ، ندها و micro solver هایی برای پردازش استفاده میکنه ، تقریبا میتونید پیش بینی کنید که با تغییر Substep بیشتر کدوم بخش سیمولیشن شما تغییر زیادی میکنه .
اما در برخی شرایط ، تغییر عدد Substep هرگز قابل پیش بینی نیست و شما فقط و فقط با انجام سیمولیشن های مختلف با Substep های مختلف میتونید به نتیجه دلخواه خود برسید و حتی بعضا ممکنه پیش بیاد که شما با Substep های کمتر نتیجه بهتری بگیرید !!!
این قضیه بیشتر در زمان استفاده از موتور فیزیک Bullet در هودینی براتون پیش میاد ، مثلا زمانی که میخواهید دیواری رو تخریب کنید.
با تغییر حتی یک عدد در Substep کل نتیجه خروجی شما نسبت به Substep های دیگر تغییر میکنه و باید اینقدر این عدد Substep رو کم و زیاد کنید تا به بهترین نتیجه برسید.
حتی برخی افراد سازنده Houdini خودشون اعلام میکنند که نتیجه تغییر Substep در موتور Bullet هیچ ربطی به هم نداره و هرگز قابل پیش بینی نیست.
نکته آخر راجب Substep اینه که ممکنه در یک سیستم داینامیک فقط نیاز باشه یک بخش خاص از سیمولیشن رو با Substep بیشتری محاسبه کنیم ، مثلا حالتی که در پروژه هم دود داریم و هم پارتیکل و فقط احساس میکنیم پارتیکل ها نیاز به Substep بیشتری دارن ، برای همینم به جز اون Substep کلی که در پارامتر های خود ند AutoDopNetwork وجود داره ، هر ند Solver هم برای خودش یک Substep مجزا داره که ما با کمک اون میتونیم فقط Substep اون ند رو زیاد یا کم کنیم.
معمولا بهتره اگر از این روش جواب میگیرم ، به جای بالا بردن Substep کلی داینامیک که روی همه محسبات و همه ندها تاثیر میزاره ، از این Substep های محلی استفاده کنیم تا سرعت محسبات خیلی کند نشه.
فقط برای آشنایی خدمتتون باید عرض کنم که ما در داخل محیط داینامیک یک Micro solver داریم به اسم Gas Repeat Solver که دقیقا کارش اینه که محاسبات داینانیکی رو فقط برای اون بخش خاصی که تعریف کردیم در هر فریم تکرار میکنه و این ندیه که دوستانی که خودشون دستی میخواهند یک Solver جدید و کاستوم بسازند ، از اون برای تغییر Substep فقط در بخش های خاص استفاده میکنند.
امیدوارم توانسته باشم برخی از اصول و مفاهیم این پارامتر رو توضیح داده باشم و کمکی شده باشه تا شما بتوانید انها را واقعا درک کنید.
تمامی مطالب توسط تیم سافت ساز ترجمه و جمع آوری می شود . منبع سافت ساز
جمع امتیاز
امتیاز
لطفا به این مطلب امتیاز بدهید