مدل سازی مو و مشکلات آن در پردازش
فهرست مطالب
مدل سازی مو یکی از پیچیده ترین مباحث مدل سازی در انیمیشن و بازی می باشد.
شاید در نگاه اول مدل سازی مو یک امر ساده به نظر برسد ، اما زمانیکه صحبت از بهینه سازی و پردازش به میان می آید ، پیچیدگی های آن به شدت قابل رویت است.
ما در این مقاله در ابتدا به مدل سازی مو و مشکلات آن خواهیم پرداخت و سپس به سراغ اصول اولیه ی مدل سازی مو به صورت مقدماتی خواهیم رفت.
لازم به ذکر است مطالعه ی این مقاله به مدلسازان ، انیماتورها و بازی سازان به شدت پیشنهاد می شود.
توجه داشته باشید ، سطح این مقاله پیشرفته بوده و برای درک مفاهیم آن نیاز به دانش اولیه در رابطه با مدل سازی دارید.
مشکلات رندرینگ و پردازش مو
معمولاً دو مشکل در رندر مو وجود دارد که بسیاری از بازی ها و موتورهای بازی سازی با آن دست و پنجه نرم می کنند.
- Material shading
- Aliasing و lack of transparency
مشکل اول : shading و material
شما برای مدل سازی یک موی استاندارد و اصولی به برخی از مدلهای خاص مو و به شدت ناهمسان نیاز دارید.
برخی از موتورها سعی میکنند برخی از ویژگیهای مو را در G-Buffer هک کنند و از شناسههای branching / material برای مدیریت آن استفاده کنند.
تأثیر عملکرد در مقایسه با استفاده از پهنای باند در fat GBuffers و مدلهای نورپردازی پیچیده نمیتواند واقعاً قابل توجه باشد ، اما همچنان یک مشکل بهینه سازی به شمار می آید ؛ حتی اگر سگمنت های تشکیل دهنده ی مو در حداقل حالت خود باشند.
برای این مشکل یکی از ترفندهایی که به عنوان مثال در The Witcher 2 به کار گرفته شده است ، جعل کردن موها با استفاده از light direction + cube-maps هر کاراکتر و استفاده از آن بهعنوان بخش نورپردازی مش «emissive» بود.
اما متاسفاته استفاده از این راه حل برای بازی های نسل جدید چندان منطقی و درست نیست.
بنابراین راه حل چیست ؟
مشکل دوم : Aliasing
پردازش بسیاری از بازی ها می توانند به دلیل موها وحشتناک به نظر برسند (همین مورد برای گیاهانی مانند چمن صدق می کند زیراکه تقریبا مشابه مو است).
Epic پیشنهاد داد که با استفاده از MSAA آن را برطرف کنید ، اما این قطعاً هزینه رندر را افزایش می دهد و همه مشکلات را حل نمی کند.
Far Cry 3 و برخی بازیهای دیگر از screen-space blur روی تارهای مو در امتداد تانژانتای مو استفاده میکنند و میتواند کیفیت را بسیار بهبود بخشد ، اما معمولاً قسمتهایی از تارهای مو یا هنوز alias دارند به شیوه ای غیر واقعی.
راه حل بدیهی در اینجا استفاده ی دوباره از shading و transparency است ، اما پس از آن با دسته ی دیگری از مشکلات روبرو خواهیم شد : overdraw و composition با transparents و در نهایت مشکلات با transparency sorting. AMD Tress FX با استفاده از الگوریتمهای transparency روی موها آن را به طور کامل حل کرد ، اما هزینه و تلاش برای اجرای آن برای بسیاری از بازیها بسیار زیاد است.
راه حل های پیشنهادی برای پردازش مو
اصل رندر کردن موی multi pass و treating transparents و مات به طور جداگانه کاملاً مشابه است.
نکته قابل توجه این است که با استفاده از DX11 و تکنیکهای نورپردازی مدرن مبتنی بر GPU، انجام آن بسیار آسانتر شد.
راهحل پیشنهادی ترکیبی از تکنیکهای رندر deferred و forward برای حل برخی مشکلات با آن است.
این برای موتورهایی در نظر گرفته شده است که هنوز به hair alpha tested stripes متکی هستند.
همچنین دارای fluent alpha transition در متریال هستند ، اما هنوز هم اکثر رشته های موی solid ، شفاف و قطعا sub-pixel نیستند (پس آن را فراموش کنید و امیدواریم که شما توانایی انجام MSAA و حتی supersampling را داشته باشید…).
شما همچنین باید نوعی forward shading در موتور خود داشته باشید ، اما من معتقدم که این تنها راه برای نسل بعدی است… سایهزنی Forward+/Clustered برای تنوع متریال و شفافیت مناسب ؛ حتی در موتورهای رندر عمدتاً deferred ، ضروری است.
موها را با full specular occlusion / zero specularity رندر کنید.
تست آلفا را در شیدرهای خود با مقدار Aref نزدیک به 1.0 انجام دهید.
forward pass دوربینهای مو بدون alpha blending را رندر کنید ، z testing روی «equal» تنظیم کنید.
alpha testing را دقیقاً مانند مرحله ۱ انجام دهید.
Render forward pass of hair specular و albedo برای قسمت transparent مو با alpha blending (مقیاس شده از 0 تا Aref تا محدوده 0-1) ، inverse alpha test (1-Aref) و regular depth test .
این الگوریتم فرض میکند که از مدل معمولی پخش موی Lambertian استفاده میکنید.
متحرک سازی مو
در موتورهای رندرینگ سیستمی وجود دارد که هندسه مو را ایجاد می کند و دینامیک و برخورد (dynamics و collisions) را در هر فریم کنترل می کند.
این موضوع اساساً به دو بخش تقسیم می شود :
- تولید هندسه
- محاسبات دینامیک/برخورد
مو از 4095 تار مو تشکیل شده است که با استفاده از line primitives رندر می شوند.
ما فقط از ۱۲۳۰۰۰ راس برای رندر مو استفاده کردیم.
ارسال همه آن رئوس از طریق دینامیک و تشخیص برخورد بسیار آهسته خواهد بود ، بنابراین ما از موهای کنترلی استفاده میکنیم : مدل مو را میتوان با مجموعهای کوچکتر از صدها تار مو توصیف و کنترل کرد ، حتی اگر رندر به هزاران تار نیاز داشته باشد ؛ تمام محاسبات دینامیک سنگین فقط برای این موهای کنترل اعمال می شود.
ما زمان و ابزاری برای متحرک سازی ساختار موی کنترلی با دست نداریم.
حتی اگر ابزارهای لازم را داشتیم ، متحرک کردن تعداد زیادی موی کنترلی با دست بسیار دشوار است.
برای اینکه موها باورپذیر به نظر برسند ، به حرکات ثانویه ظریف زیادی نیاز است.
هندسه مو
۱- Layout و رشد
ساختار موی کنترلی برای توصیف تقریبی مدل مو استفاده می شود.
ما موهای کنترل را از یک هندسه اختصاصی ساخته شده در مایا که نمایانگر “scalp” (که در زمان رندر نامرئی است) “grows ” می کنیم.
همانطور که در شکل زیر نشان داده شده است ، یک موی کنترل از هر رأس پوست سر ، در امتداد حالت طبیعی رشد می کند.
۲- کنترل مو
هنگامی که مجموعهای از موهای کنترل را داریم ، آنها را تحت محاسبات فیزیک ، دینامیک و برخورد قرار میدهیم تا به صورت رویهای (procedurally) موها را متحرک کنیم.
وقتی میخواهیم انیمیشن را dramatize کنیم ، باید بتوانیم رفتارهای مو را «fake» یا «fix» کنیم.
علاوه بر این ، پویایی موهای ما به اندازه کافی واقع بینانه نیست که در برخی شرایط مانند موهای واقعی حرکت کند.
داشتن کنترل دستی بهتر به ما این امکان را می دهد که حرکت را قانع کننده تر کنیم.
۳- گردش داده ها
از آنجایی که مو کاملاً پویا است و هر فریم را تغییر می دهد ، ما باید رندر نهایی را در هر فریم بازسازی کنیم.
شکل زیر نحوه حرکت داده ها در فرآیند را نشان می دهد.
موهای کنترل متحرک به منحنیهای Bezier تبدیل میشوند و برای ایجاد خطوط صاف ، tessellated میشوند.
سپس خطوط صاف شده برای افزایش تراکم مو interpolated می شوند.
مجموعه موهای interpolated شده برای رندر نهایی فریم به فریم به موتور ارسال می شود.
ما از یک vertex buffer پویا برای نگهداری داده های vertex استفاده می کنیم.
۴- Tessellation
فرآیند tessellation مو شامل صاف کردن هر موی کنترلی با افزودن vertices است.
ما بیش از پنج برابر ، از ۷ به ۳۶ ورتکس افزایش می دهیم.
برای محاسبه موقعیت ورتکس های جدید ، ما موهای کنترل را با محاسبه tangents آنها (برای هر فریم) و استفاده از آنها برای محاسبه نقاط کنترل Bezier به منحنی های Bezier تبدیل می کنیم.
از روی منحنی های Bezier ، ما موقعیت رئوس اضافی معرفی شده برای صاف کردن موهای کنترل را محاسبه می کنیم.
موهای کنترل صاف شده توسط interpolation برای ایجاد مجموعه ای متراکم از مو ، آماده برای رندر نهایی تکرار می شوند.
۵- Interpolation
موهای Interpolation شده با استفاده از mesh topology پوست سر ایجاد می شوند.
شکل زیر را ببینید.
انتهای هر مثلث دارای سه تار موی کنترل صاف است (به رنگ سبز نشان داده شده است).
ما می خواهیم داخل سطح مثلث را با مو پر کنیم ، بنابراین مختصات سه گانه موی کنترل را برای ایجاد موهای صاف جدید (که با رنگ خاکستری نشان داده شده است) Interpolation می کنیم.
موهای کنترل صاف و موهای صاف Interpolation شده دارای تعداد رئوس یکسانی هستند.
دینامیک و برخورد
به عنوان مثال دینامیک بعضی از موتورها مانند nalu بر اساس یک سیستم ذرات است ، هر رأس موی کنترل نشده به عنوان یک ذره متحرک است.
ذرات به طور مساوی در امتداد یک مو قرار ندارند.
با دور شدن از جمجمه ، بخش های موی کنترل بزرگتر می شوند.
این اجازه می دهد موهای بلندتری داشته باشید ، بدون افزودن ورتکس زیاد.
محدودیت ها (Constraints)
در حالی که ذرات در حال حرکت هستند ، طول موهای کنترل باید ثابت بماند تا از کشش جلوگیری شود.
برای تحقق این امر ، از محدودیتهایی بین ذرات درون یک موی کنترل استفاده می کنیم.
محدودیت ها (Constraints) باعث می شوند که ذرات اگر خیلی نزدیک به هم باشند دفع شوند ، یا اگر ذرات خیلی از هم فاصله داشته باشند ، سگمنت را منقبض می کنند.
منبع :
مهرسا امینی
برنامه نویس ، انیماتور ، سئوکار
تصور کن و بهش برس