مقدمه
آیا تا به حال در پروژه‌های مپینگ (Projection Mapping) با مشکل افت فریم یا حجم بسیار زیاد فایل پروژه روبرو شده‌اید؟ استفاده از کامپوننت Stoner در پالت TouchDesigner راهکاری استاندارد برای کالیبراسیون تصویر است (Keystone و Warping). اما روش معمول، یعنی استفاده از یک Stoner مجزا برای هر پروژکتور، می‌تواند قاتل عملکرد سیستم شما باشد.
در این مقاله، تکنیک‌هایی را بررسی می‌کنیم که چگونه با استفاده از UV Remap و اسکریپت‌نویسی پایتون، یک سیستم کالیبراسیون حرفه‌ای، سبک و ماژولار بسازید.

——————————————————————————–
مشکل: روش سنتی و پرهزینه
در حالت عادی، اگر شما ۴ خروجی (مثلاً ۴ پروژکتور) داشته باشید، ممکن است برای هر کانال یک Stoner قرار دهید. مشکلات این روش عبارتند از:
1. زمان پردازش (Cook Time): هر Stoner به تنهایی حدود ۰.۶ میلی‌ثانیه یا بیشتر زمان پردازش مصرف می‌کند.
2. حجم فایل: Stoner داده‌های تکسچر را درون فایل پروژه ذخیره می‌کند. با ۴ کانال Stoner، حجم فایل پروژه (.toe) می‌تواند از چند کیلوبایت به ده‌ها مگابایت افزایش یابد،.
[محل قرارگیری تصویر ۱]: شرح عکس: اسکرین‌شاتی از محیط TouchDesigner که نشان می‌دهد ۴ کامپوننت Stoner به صورت موازی به ۴ خروجی متصل شده‌اند و پنجره Probe یا Performance Monitor نشان‌دهنده مصرف بالای CPU است.

——————————————————————————–
راه‌حل اول: جادوی UV Remap
راز بهینه‌سازی Stoner در خروجی دوم آن نهفته است. Stoner علاوه بر تصویر اصلاح شده، یک خروجی دوم دارد که یک UV Map است.
به جای استفاده از خودِ Stoner برای پردازش تصویر نهایی، ما می‌توانیم:
1. از خروجی دوم Stoner (مپ UV) استفاده کنیم.
2. آن را به ورودی دوم یک Remap TOP متصل کنیم.
3. تصویر اصلی را به ورودی اول Remap TOP بدهیم.
نتیجه همان اصلاح تصویر است، اما با هزینه پردازشی تقریباً صفر (اگر مپ UV ثابت باشد)،.
[محل قرارگیری تصویر ۲]: شرح عکس: نمایش نود Remap TOP. ورودی بالا به یک Movie File In (تصویر اصلی) و ورودی دوم به یک Null که از خروجی دوم Stoner آمده متصل است. زیرنویس عکس: استفاده از Remap TOP برای کاهش بار پردازشی.

——————————————————————————–
راه‌حل دوم: معماری سیستم و جداسازی کالیبراسیون
برای مدیریت بهتر، نباید Stoner را مستقیماً در زنجیره خروجی قرار داد. در عوض، باید یک معماری ماژولار بسازیم:
1. بخش کالیبراسیون (Calibration Base): یک Base جداگانه که Stoner در آن قرار دارد. این بخش وظیفه تولید داده‌های UV را بر عهده دارد اما در مسیر رندر نهایی نیست.
2. بخش خروجی‌ها (Output Containers): کانتینرهایی برای هر پروژکتور (مثلاً Channel 1 تا 4) که فقط شامل یک Remap TOP هستند.
3. انتخاب‌گر (Select): با استفاده از یک Select TOP، داده‌های UV مورد نیاز هر کانال را از بخش کالیبراسیون فراخوانی می‌کنیم.
با این روش، شما فقط یک عدد Stoner در کل پروژه دارید که به نوبت کانال‌های مختلف را تنظیم می‌کند، اما خروجی‌ها مستقل عمل می‌کنند.
[محل قرارگیری نمودار/دیاگرام ۳]: شرح نمودار: یک دیاگرام درختی. در سمت چپ یک جعبه با نام “Stoner UI” که به یک جعبه مرکزی “Calibration Base” متصل است. از جعبه مرکزی، ۴ فلش به سمت ۴ جعبه خروجی (Channel 1, 2, 3, 4) می‌رود که داخل آن‌ها فقط Remap TOP وجود دارد.

——————————————————————————–
راه‌حل سوم: مدیریت حجم فایل با TOX‌های اکسترنال
حتی با روش بالا، اطلاعات کالیبراسیون حجم فایل پروژه را بالا می‌برد. راهکار حرفه‌ای، ذخیره کردن بخش کالیبراسیون به عنوان یک فایل .tox جداگانه است. با کلیک راست روی کامپوننت کالیبراسیون و انتخاب Save Component .tox، آن را ذخیره کنید. سپس در پارامترهای Common، گزینه “External .tox” را آدرس‌دهی کنید و تیک “Save Backups” را بردارید. این کار حجم فایل اصلی .toe شما را به شدت کاهش می‌دهد (مثلاً از ۷۰ مگابایت به ۵ کیلوبایت) و مدیریت ورژن‌ها در گیت (Git) را آسان می‌کند،.
[محل قرارگیری تصویر ۴]: شرح عکس: مقایسه دو فولدر در ویندوز. سمت چپ فایلی با حجم ۷۰ مگابایت. سمت راست همان فایل پس از اکسترنال کردن، با حجم ۴ کیلوبایت به همراه یک فایل .tox در کنارش.

——————————————————————————–
سطح پیشرفته: اتوماسیون با پایتون (Python)
برای اینکه رابط کاربری (UI) شما هوشمند باشد و نیازی نباشد دستی مسیرها را تغییر دهید، از پایتون استفاده می‌کنیم:
1. منوی داینامیک: با نوشتن یک ماژول پایتون و استفاده از دکوریتورها (@property) و متد findChildren، می‌توانیم لیستی از تمام کانال‌های موجود (Channel 1, 2, …) را پیدا کرده و به صورت خودکار در منوی Custom Parameter قرار دهیم،.
2. تغییر مسیر خودکار: با استفاده از یک Parameter Execute DAT، وقتی شما در منو “Channel 2” را انتخاب می‌کنید، پایتون به طور خودکار مسیر Stoner را تغییر می‌دهد تا دقیقاً همان کانال را ویرایش کند،.
این کار باعث می‌شود اگر کانالی اضافه یا کم کنید، سیستم خودکار آپدیت شود و نیازی به تغییر دستی پارامترها نباشد.
[محل قرارگیری تصویر ۵]: شرح عکس: نمایی از کد پایتون در Sublime Text یا ادیتور داخلی تاچ‌دیزاینر که کلاس menu items و متد get ops را نشان می‌دهد. در کنار آن، پنل پارامترهای کاستوم که لیست کانال‌ها به صورت Drop-down دیده می‌شود.

——————————————————————————–
جمع‌بندی
با پیاده‌سازی این تکنیک‌ها در سایت Nocturnix و پروژه‌های خود، شما به سه دستاورد بزرگ می‌رسید:
• Performance: کاهش شدید زمان پردازش با حذف Stonerهای اضافی.
• Storage: کاهش حجم فایل پروژه و تفکیک داده‌های کالیبراسیون.
• Workflow: ایجاد یک سیستم منعطف که با اسکریپت‌نویسی به راحتی قابل توسعه است.
همین حالا پروژه خود را باز کنید و Stonerهای اضافی را حذف کنید!