یکی از بهترین امکانات نرم افزار های کامپوزیت نظیر Nuke و Fusion ، تکنیک Deep Compositing می باشد.در این مقاله سجاد ربیعی گرامی ما را به دنیای Deep Compositing می برد .
آشنایی با Deep Compositing
امروزه بخش کامپوزیت عضو جدا نشدنی از پروسه تولید پروژه های انیمیشن و جلوه های ویژه میباشد و این بخش هم همانند سایر بخش ها از پیشرفت تکنولوژی بی بهره نبوده و امکانات بسیار متنوع و گسترده ای به برنامه های کامپوزیت اضافه شده اند. به طوریکه شاید از نرم افزارهای کامپوزیت نه فقط به عنوان کامپوزیت بلکه به عنوان یک برنامه کاملا سه بعدی میتوان نام برد. یکی از بزرگترین امکاناتی که برخی از برنامه های کامپوزیت نظیر Nuke و Fusion اضافه شده است تکنیک Deep Compositing می باشد. اما قبل از اینکه بخواهم به آن بپردازم باید بدانیم که منظور از کلمه Deep چیست.
اطلاعات Deep چیست ؟
همانطور که از اسم آن میتوانید حدس بزنید ، اطلاعات Deep وظیفه ذخیره اطلاعات عمق تصاویر رندر شده را بر عهده دارد ، اما سوالی که به وجود می آید این است که ما میتوانیم همین کار را با کمک Z Depth انجام بدهیم ، پس تفاوت آن با کانال Z Depth چیست ؟ در ZDepth میدانیم که مختصات تک تک پیکسل های رندر شده از دید دوربین در راستای عمق یا محور Z ذخیره میشوند و به صورت یک تصویر طیف خاکستری در می آید . با توجه به نوع استاندارد استفاده شده در موتور رندر ، هر چه آبجکت ها در تصویر رندر شده به دوربین نزدیکتر باشند رنگ آنها سیاهتر و هرچه دورتر باشند رنگ آنها سفید تر میباشد (یا بالعکس). سپس با کمک این اطلاعات ما میتونیم در نرم افزارهای کامپوزیت کارهای متفاوتی انجام بدهیم ، مثلا میتوانیم در مرحله کامپوزیت به تصویر رندر شده عمق میدان یا Depth of Field اعمال کنیم یا حتی به کمک آن کامپوزیت سه بعدی انجام بدایم و مدلی را در وسط یک مدل دیگر که هر دو عکس هستند قرار بدهیم. با این وجود Depth یک مشکل بزرگ دارد که باعث محدودیت های چشمگیری در مرحله کامپوزیت میشود. در تصاویر Depth اطلاعات عمق به ازای هر پیکسل از تصویر محاسبه و رندر میشود و از طرف دیگر آبجکتهای نیمه شفاف یا Semi Transparent از جمله عناصر Volumetric نظیر دود ، آتش ، مه ، غبار ، ابر و غیره در تصاویر Depth به درستی رندر نمیشوند ، عامل اول باعث میشود در صورت استفاده از Depth of Filed یا به اختصار DOF در کامپوزیت ، آبجکتهایی که خیلی نازک یا ریز هستند (مثلا پارتیکلها ) یا آبجکت هایی که از دوربین خیلی دور هستند به درستی DOF روی آنها اعمال نشود و لبه های آنها ممکن است مات و غیر طبیعی شود. اما اگرDOF را مستقیما در مرحله رندر در برنامه سه بعدی استفاده بکنید به دلیل دسترسی کامل موتور رندر به اطلاعات سه بعدی مدلها ، شاهد هستید که کیفیت DOP و جزییات آن نسبت به کامپوزیت بسیار بهتر و دقیق تر است . در مورد عامل دوم هم اگر بخواهیم از DOF روی عناصر Volumetric مثل دود استفاده کنیم با با مشکل مواجه میشویم و نمیتوانیم نقطه فوکوس دقیقی را در وسط دود پیدا کنیم. همچنین نمیتوانیم به کمک کامپوزیت سه بعدی مدلی را دقیقا در وسط دود قرار دهیم ، چون اطلاعات Depth قادر نیستند به درستی عمق دود را ذخیره کند و از طرف دیگر نرم افزار کامپوزیت نمیتواند حدس بزند که دود یا آتش چه میزان Density دارد. در حقیقت اینطور میتوانیم بگوییم که Depth روی مدلهای کاملا مات میتواند درست عمل کند. همانطور که در تصویر زیر میبینید ، اطلاعات عمق مربوط به دود تنها با کمک اطلاعات Deep به درستی محاسبه میشود.
به همین دلیل کمپانی بزرگ Weta Digital اطلاعات Deep را برای از بین بردن این محدودیت ها ابداع کرد. در Deep هم مانند ZDepth اطلاعات عمق پیکسل ها ذخیره میشود ، اما نه یک پیکسل به ازای هر پیکسل ، بلکه چند پیکسل به ازای هر پیکسل (Multi Pixel) و به همین دلیل اگر DOF را با کمک Deep روی آبجکتهای خیلی نازک و ریز (مثل پارتیکل ها ) و همچنین مدل های پر جزییات دورتر از دوربین اعمال کنیم (مثل شاخ و برگ درختان )، تقریبا هیچ گونه مشکلی در لبه های آنها به وجود نمی آید . حتی اگر اندازه پارتیکل ها خیلی ریز باشد (در حد یک نقطه) ، باز DOF به درستی روی آنها اعمال میشوند ، دقیقا مثل اینکه از اول DOF را در خود برنامه سه بعدی رندر کردید ! در تصویری که برای شما آماده کرده ام تاثیر استفاده از Deep برای اعمال افکت DOF در کامپوزیت را روی پارتیکل های خیلی ریز مشاهده می فرمایید. در زمان استفاده از ZDepth به دلیل کم بودن تعداد پیکسل ها افکت DOF به خوبی روی آنها اعمال نمیشود ، در حالی که DOF به کمک اطلاعات Deep قادر است نقطه فوکوس بسیار خوبی را روی این پارتیکل ها به ما بدهد.
اما کاربرد اصلی Deep در زمان استفاده از عناصر Volumetric مثل دود است . Deep به جز اینکه اطلاعات عمق را به صورت Multi Pixel برای تک تک پیکسل ها ذخیره میکند ، در مورد عناصر نیمه شفاف و Volumetric قادر است اطلاعات عمق را به همراه میزان Density آن پیکسل نه تنها برای پیکسل های جلویی ، بلکه برای پیکسل های پشتی هم ذخیره کند. مثلا فرض کنید یک دود را رندر میکنید که کمی غلظت دارد ، مسلما غلظت یا Density آن در همه جای دود یکسان نیست ، Deep از دید دوربین اطلاعات عمق و شفافیت این پیکسل و تک تک پیکسل هایی که در پشت این پیکسل قرار دارند را ذخیره میکند و به همین دلیل ما در مرحله کامپوزیت اطلاعات کاملی را در مورد عمق و همچنین غلظت (Density) دود از دید دوربین را در اختیار داریم. این موارد سبب میشوند که اولا با استفاده از DOF بتوانیم نقطه فوکوس درستی روی دود یا آتش اعمال کنیم و از طرف دیگر میتوانیم دقیقا در وسط دود یا آتش مدل های سه بعدی را که جداگانه رندر کرده ایم را تلفیق کنیم. البته این مورد آخر نیاز به توضیحات بیشتری دارد. در تصویر زیر حالت Multi Pixel بودن اطلاعات Deep برای ذخیره عمق و همچنین قابلیت ذخیره کردن Density برای تمامی پیکسل های جلویی و پشتی را به صورت سمبلیک نمایش دادم.
استفاده از Deep به عنوان Hold Out :
هر نرم افزار سه بعدی ممکن است در بخشی از موارد قدرتمندتر از سایر نرم افزارها باشد یا انجام برخی از کارها در آنها راحتتر و سریعتر باشد . بنابراین در پروژه های انیمیشن و جلوه های ویژه با توجه به توانمندیهای مختلف نرم افزارها ممکن است همزمان از چند نرم افزار سه بعدی در پروسه تولید آنها استفاده شوند. مثلا فرض کنیم یک پلان انفجار داریم که قرار است یک ماشین در وسط شهر منفجر شود. تیم جلوه های ویژه تصمیم میگیرد شبیه سازی انفجار را در هودینی انجام بدهند و با موتور رندر Mantra آن را رندر کنند ، سپس خودرو و کل شهر را در نرم افزار Maya با موتور رندر Arnold رندر کنند و در نهایت دو تصویر انفجار و شهر را در کامپوزیت با هم تلفیق کنند. مساله مهمی که در کامپوزیت باید در نظر داشت این است که از تلفیق این دو تصویر رندر شده مجزا ، ماشین باید دقیقا در وسط انفجار قرار گیرد ، نه در پشت یا جلوی آن ! با روش های معمول وقتی میخواهیم همچین کاری بکنیم چاره ای نداریم جز اینکه مدل منفجر شده ماشین را به برنامه هودینی وارد کنیم و آن را درست در وسط انفجار قرار دهیم ، سپس در مرحله رندر مدل ماشین را به صورت Matte تعریف کنیم تا بدنه ماشین را در وسط انفجار خالی و سیاه نگاه دارد (چه در کانال رنگ و چه در کانال آلفا ) . این چیزی است که متریال Use Background در مایا نیز انجام میدهد. سپس در مرحله کامپوزیت اگر تصویر رندر شده ماشین و شهر را در روی تصویر رندر شده انفجار قرار دهیم ، چون قسمت های بدنه ماشین قبلا با کمک Matte در وسط انفجار مشخص شده اند ، بنابراین این حس به وجود می آید که ماشین درست در وسط انفجار قرار دارد.
این روشی بود که تا قبل از ابداع Deep استفاده میشد اما محدودیتهایی زیادی در این روش وجود داشت. اول اینکه اگر کوچکترین تغییری در مدل ماشین یا نحوه انیمیت آن بعد از مرحله رندر میدادند ، مجبور بودند هم پروژه ماشین در مایا و هم پروژه انفجار در هودینی را دوباره رندر کنند . با توجه به سنگین بودن عناصر Volumetric در رندر اینکار زمان زیادی را به هدر میداد. همچنین به دلیل استفاده از موتور رندر های متفاوت ، ممکن بود ماشین رندر شده در Arnold با ماشین Matte شده توسط Mantra دقیقا همخوانی نداشته باشد ، مثلا هر دو دقیقا یک میزان Displacement را نداشته باشند یا حتی از Motion Blur های متفاوتی برخوردار باشند. ولی اگر هر دو پروژه را با Deep رندر کرده باشید ، به راحتی میتوانید آنها را در کامپوزیت تلفیق کنید ، حتی اگر مدل ماشین یا سایر مدلهای پروژه را تغییر دهید یا حتی مکان آنها را تغییر دهید ، باز به کمک Deep نیازی نیست که پروژه انفجار را مجددا رندر کنید و این ویژگی باعث از بین رفتن خیلی از دوباره کاری هایی که در پروژه ها پیش می آید میشود. البته هر دو پروژه باید از لحاظ دوربین یکسان باشد. جالب است بدانید که در تکنیک Deep حتی شما میتوانید مدل ماشین را وارد هودینی نکنید! ، چون ماشین بعدا به صورت سه بعدی در کامپوزیت در وسط انفجار قرار میگیرد. از طرف دیگر با توجه به ویژگی هایی که در مورد Deep گفتم ، شما میتوانید به راحتی پارتیکل های خود را در یک برنامه رندر کنید و بقیه پروژه را در برنامه دیگر و در کامپوزیت آنها را با هم تلفیق کنید بدون اینکه مشکلی پیش بیاید و یا نیاز باشد که مدلها را در وسط پارتیکل ها به صورت Matte رندر کنید. بنابرایت در تکنیک Hold Out شما با خیال راحت دو پروژه را در دو نرم افزار مختلف رندر میکنید ، سپس در مرحله کامپوزیت با توجه به دسترسی به اطلاعات دقیق عمق و همچنین غلظت دود یا انفجار ، میتوانید تصاویر رندر شده مدلها را دقیقا در وسط دود یا آتش قرار دهید ، سپس نرم افزار کامپوزیت با استفاده از Deep میتواند مدلهای شما را در وسط دود یا انفجار Matte کند. این حالت را میتوانید در تصاویر زیر مشاهده فرمایید. همانطور که در تصاویر زیر مشاهده میفرمایید ، دو تصویر ابر و شهر را به صورت جداگانه و بدون استفاده از Matte در برنامه سه بعدی رندر کرده ام. سپس در مرحله کامپوزیت با کمک Deep Compositing و تکنیک Hold Out توانستم ابر را دقیقا در وسط شهر قرار دهم و نهایتا آن را روی شهر کامپوزیت کنم.
چگونه پروژه را با Deep رندر کنیم ؟
قبل از هر چیز باید مطمئن شوید که نرم افزار و موتور رندری که استفاده میکنید اطلاعات Deep را برای رندر ساپورت میکند. اولین بار این قابلیت در نرم افزار Houdini و موتور رندر بومی آن یعنی Mantra و همچنین Renderman اضافه شد. بعد با به وجود آمدن فرمت OpenEXR 2 برنامه Nuke به عنوان اولین برنامه کامپوزیت امکان استفاده از Deep Compositing را فراهم کرد. در نسخه اخیر برنامه Fusion هم به تازگی این قابلیت اضافه شده است. از طرف دیگر امکان رندر اطلاعات Deep بعدا به موتور رندر های Arnold ، و 2015 V-Ray اضافه شد. بعد از اطمینان از ساپورت Deep در موتور رندری که استفاده میکنید ، فقط کافیست به تنظیمات موتور رندر خود بروید و بخش Deep را پیدا کنید و آنرا فعال کنید. مثلا در Arnold در قسمتی که فرمت های خروجی را مشخص میکنیم ، باید آنرا روی Deep EXR تنظیم کنیم یا درRenderMan باید آن را روی Deep Image dTex تنظیم کنید.در نظر داشته باشید تنها برخی از فرمتهای تصویری نظیر Exr2 و dTex و RAT و تعدادی دیگر میتوانند Deep را ساپورت کنند.
محدودیت های Deep :
با تمامی محاسنی که Deep دارد محدودیت ها و معایبی هم دارد که باید در پروسه تولید آنها را مدنظر داشت.
- حجم بسیار بالای فایل های رندر شده خروجی
- سرعت بسیار پایین محاسبات کامپوزیت
- عدم ساپورت همه نرم افزارها از Deep
- استفاده از Deep یعنی پردازش و ذخیره اطلاعات بسیار زیاد به ازای هر پیکسل (Multi Pixel) و همچنین ذخیره اطلاعات Density برای آنها که باعث سنگین شدن حجم فایل های رندر شده میشود. ممکن است حتی حجم فایل های exr معمولی که بدون Deep رندر شده است حدود 50 مگابایت باشد ولی همین فایلها با اطلاعات Deep بیشتر از 500 مگابایت به ازای هر فریم حجم داشته باشد. رندر عناصر Volumetric مثل دود و آتش و همچنین پارتیکل ها نسبت به سایر موارد مثل مدل ها بیشترین حجم اطلاعات Deep را دارند که ممکن است حجم آنها به 1 گیگابایت هم برسد ! همچنین بالا رفتن حجم فایل های رندر شده باعث کم شدن پهنای باند شبکه در زمان استفاده از رندرفارم میشود و به همین دلیل نیاز است از سریعترین سخت افزارهای شبکه استفاده شود.
- به دلیل اینکه نرم افزار کامپوزیت قرار است اطلاعات بسیار سنگین Deep را که شامل عمق و Density هستند را بخواند و روی آنها پردازش انجام دهد ، بنابراین زمان انجام محاسبات کامپوزیتی به شدت کم میشود به طوریکه در یکی از پروژه هایی که شخصا ساختم ، سرعت محاسبه هر فریم از کار در برنامه Nuke به حدود 30 دقیقه رسید !
- اگرچه امروزه تعداد بیشتری از نرم افزارهای کامپوزیت و موتورهای رندر Deep را ساپورت میکنند ، ولی هنوز برخی از آنها از این قابلیت بی بهره هستند و شما باید با توجه به Pipeline پروژه خود این مورد را قبل از تولید مدنظر داشته باشید.
بنابراین با توجه به موارد بالا به خصوص مورد دوم منطقی این است که تنها در صورت لزوم از اطلاعات Deep استفاده کنیم در غیر این صورت همین Deep میتواند باعث به هدر رفتن زمان و منابع سخت افزاری در پروژه شود.
آشنایی با منطق Deep Compositing :
بعد از اینکه پروژه های خود را با اطلاعات Deep رندر کردید ، نوبت به کامپوزیت آنها میرسد.توضیحاتی که ارائه میدهم مربوط به برنامه Nuke میباشد ولی اصول در همه جا تقریبا یکسان است. اول اینکه برای استفاده از Deep دیگر نمیتوانیم با همان ندها و ابزارهای معمولی کامپوزیت کار کنیم و باید از ابزارهای مخصوص Deep استفاده کنیم. مثلا برای وارد کردن تصاویر به همراه اطلاعات Deep به برنامه Nuke باید از ند DeepRead استفاده کنیم . دقت کنید که اطلاعات Deep به صورت تصویری نیستند که بتوانید مستقیما آنرا ببینید ، برای اطمینان از صحت اطلاعات Deep میتوانید از ند های Deep to Points و Camera در برنامه Nuke استفاده کنید. با استفاده از این ابزارها ، اطلاعات Deep از دید دوربین مشخص شده به صورت Point Cloud در محیط سه بعدی این برنامه نمایش داده میشود. در تصویر زیر نمای همان شهر را مشاهده میکنید که با کمک اطلاعات Deep و ابزار Deep to Points در برنامه Nuke میتوانیم این شهر را به صورت Point Cloud در فضای 3D مشاهده کنیم.
حال که اطلاعات به برنامه وارد شده با یکی از دو روش زیر باید لایه های Deep را با هم تلفیق کنید. Hold Out : در این روش که با ند Hold Out یا Deep Merge انجام میپذیرد یکی از دو لایه Deep به عنوان لایه اول و دیگری به عنوان لایه دوم مشخص شده و بعد از تلفیق این دو لایه ، لایه دوم به صورت Matte روی لایه اول یا وسط آن قرار میگرد که نتیجه این دو لایه را میتوانید روی تصویر اصلی خود تلفیق کنید. Combine : در این روش که با ند Deep Merge انجام میپذیرد ، هر دو لایه Deep باهم مستقیما تلفیق میشوند . نکته : برای دسترسی بیشتر به تک تک لایه ها و همچنین انجام اصلاح رنگ و نور بهتر و راحتتر پیشنهاد میکنم از روش اول استفاده کنید و نهایتا تصاویر را با ند Merge معمولی با هم تلفیق کنید. در تصویر زیر یک Network ساده از طریقه وارد کردن تصاویر Deep و تلفیق آنها با هم در برنامه Nuke را مشاهده می فرمایید.
استفاده از نتیجه Deep Compositing :
بعد از تلفیق لایه های Deep با یکی از روش های گفته شده باید آن را به تصویر معمولی تبدیل کنید تا بتوانید روی پروژه اصلی خود کامپوزیت کنید ، برای اینکار کافیست از ابزار Deep to Image استفاده کنید . خروجی این ابزار یک تصویر معمولی است که میتوانید به راحتی روی پروژه اصلی تلفیق کنید و یا از ابزارهای استاندارد Nuke برای اصلاح رنگ و نور استفاده کنید. در نظر داشته باشید که کامپوزیت اطلاعات Deep در Nuke موارد جزئی بسیاری دارد و همچنین ابزارهای زیاد دیگری هم برای Deep در برنامه Nuke وجود دارد ، به دلیل اینکه این مقاله صرفا برای آموزش Deep Compositing در Nuke نیست از توضیح کامل آنها پرهیز میکنم ، لذا لازمه که با کمک منابع آموزشی زیادی که در اینترنت وجود دارند با بخش Deep Compositing در Nuke کاملا آشنا بشوید.
خلاصه :
Deep به اطلاعاتی گفته میشود که قادر هستند عمق تصویر را به صورت Multi Pixel برای تک تک پیکسل ها ذخیره کنند و از طرف دیگر میتوانند اطلاعات Density را برای تمامی پیکسل های پشت و جلوی تصویر برای عناصر Volumetric ذخیره کنند. با کمک Deep Compositing میتوانیم مدلهای معمولی و همچنین دود ، آتش ، انفجار و غیره را به صورت جداگانه رندر کنیم و بدون نیاز به استفاده از Matte آنها را به صورت کاملا سه بعدی در برنامه های کامپوزیت روی هم تلفیق کنیم. به دلیل ویژگی هایی که اطلاعات Deep دارند ، میتوانیم افکت Depth of Field را خیلی بهتر و بدون هیچ مشکلی روی عناصر Volumetric و همچنین آبجکت های خیلی کوچک ، باریک و ریز نظیر پارتیکل ها اعمال کنیم. به دلیل محاسبه اطلاعات اضافی Deep در مرحله رندر ، فایل های رندر شده با Deep بسیار سنگین تر از فایل های معمولی هستند. به دلیل سنگین بودن اطلاعات Deep در مرحله کامپوزیت ، نرم افزار زمان بسیار بیشتری برای پردازش تصاویر نیاز دارد. فرمت های Exr2 و dTex از رایج ترین فرمت های تصویری هستند که قادرند اطلاعات Deep را در خود ذخیره کنند. برنامه های Nuke و Fusion و همچنین موتورهای رندر Arnold ، Mantra ، RenderMan و V-Ray از جمله برنامه های معروفی هستند که Deep را ساپورت میکنند.
سخن پایانی
با توجه به سوالات متداولی که دوستان راجب مبحث Deep Compositing میپرسیدند و همچنین کمبود منابع آموزشی فارسی مناسب در این رابطه ، تلاش کردم مقاله ای را به صورت خلاصه در این رابطه نگارش کنم ، امیدوارم که توانسته باشم به سوالات اصلی و کلی دوستان در این رابطه پاسخ بدهم.
10 دیدگاه
hero
فوق العاده بود اقای ربیعی
نیما
بسیار عالی و مفید بود.
فقط سوالی در مورد نوشته ی دودی شکل DEEP داشتم: توی هودینی بعد از اینکه ما هر جسمی رو به Cloud تبدیل میکنیم میتونیم از گره Cloud Noise برای ایجاد Noise در شکل ابرمون استفاده کنیم.
خیلی وقت ها با بالاتر بردن میزان شدت Noise تیکه های کوچکی از ابرمون جدا میشن و در اطراف ابر اصلیمون (که در اینجا نوشته ی DEEP باشه) پراکنده میشن.
حالا سوالم اینکه چه طوری این تیکه های کوچیکو حذف کنیم، به طوریکه به خود ابر اصلیمون لطمه ای وارد نشه(قسمتی از ابر اصلیمون پاک نشه)!!!!
راهی که مد نظر خودم هست استفاده از Volume Wrangle به منظور دسترسی به Voxel های همسایه هستش. یعنی مثلا به مرکزیت Voxel ی که کد در حال اجراست بیاد یک کره ایجاد کنه و تعداد Voxel هایی که دارای Density هستند رو بشمره اگر کمتر از مثلا 10 تا بود Density اون Voxel رو صفر کنه. (مشابه تابع pcfind_radius در حوزه ی نقاط در VEX)
ولی این کار هزینه ی بسیار بالایی رو از لحاظ زمانی داره!!
به نظر شما راه بهتری تو هودینی هست؟
سپاس گزارم.
hossein-moravej
سلام
من یه درخواست دارم استاد
من یک صحنه داخلی با vray گرفتم می خوام لایه المنت deep ازش بگیرم بفرستمم nuke بعد تو nuke نود point cloud بدم و با نورهای nuke دوباره relight کنم و همچنین مثل اموزش شما با دوربین nuke تو point cloud بچرخم که دوربین رو animate کنم و حس 3D به عکسم بدم
اما ترتیب نودها رو نمی دونم تو nuke !
میشه این کار شما با نودها انجام بدین و یه عکس از محیط nuke بگیرین که من متوجه بشم به چه ترتیبی هستش ؟!! ممنون میشم و یا چند سایت یا ویدیو مرتبط با موضوع به eng معرفی کنید یا چه جمله ای در google سرچ کنم ؟!!
ممنون میشم راهنماییم کنید و پیشاپیش ممنون
مرتضی
واقعا ممونم که چنین مطلب مفیدی رو رایگان در اختیارمون قرار دادید، خدا خیرتون بده.
PARSAsxw
سلام
خسته نباشین
بسیار مفید و کارگشا…
کوردستان
خیلی مطلب عالی بود .من کلی لذت بردم .واقعن چند وقتی هست کمبود مطالب شما رو در سایت احساس می کنم .خواهشن اگه وقت داری بیشتر از این گونه مطالب مفهومی بزارید
دستتون درد نکنه و یه. نیا تشکر
vcxvvx
salam
pas aftr effect chi mishe ?
وحيد ولايتى
با درود فراوان و عرض خسته نباشيد
مانند هميشه مقاله بسيار عالى و هوشمندانه بود. از زحمتى كه براى ارايه كار مى كشيد بسيار سپاسگذارم. اميدوارم هميشه و در همه مراحل كار و زندگى موفق باشيد. خدا پشت و پناه تان
Sharif Taghizadeh
سلام
بهترین و کامل تری مقاله ای بود که در این مورد خوندم، عالی بود
تشکر فراوان از آقای ربیعی و آقای براتی
سجاد شهبازی
خیلی خوب بود. ممنون