بهینهسازی سیستمهای مپینگ در TouchDesigner
آیا تا به حال در پروژههای مپینگ (Projection Mapping) با مشکل افت فریم یا حجم بسیار زیاد فایل پروژه روبرو شدهاید؟ استفاده از کامپوننت Stoner در پالت TouchDesigner راهکاری استاندارد برای کالیبراسیون تصویر است (Keystone و Warping).
اما روش معمول، یعنی استفاده از یک Stoner مجزا برای هر پروژکتور، میتواند قاتل عملکرد سیستم شما باشد.
در این مقاله، تکنیکهایی را بررسی میکنیم که چگونه با استفاده از UV Remap و اسکریپتنویسی پایتون، یک سیستم کالیبراسیون حرفهای، سبک و ماژولار بسازید.
مشکل: روش سنتی و پرهزینه
در حالت عادی، اگر شما ۴ خروجی (مثلاً ۴ پروژکتور) داشته باشید، ممکن است برای هر کانال یک Stoner قرار دهید. مشکلات این روش عبارتند از:
- زمان پردازش (Cook Time): هر Stoner به تنهایی حدود ۰.۶ میلیثانیه یا بیشتر زمان پردازش مصرف میکند.
- حجم فایل: Stoner دادههای تکسچر را درون فایل پروژه ذخیره میکند. با ۴ کانال Stoner، حجم فایل پروژه (.toe) میتواند از چند کیلوبایت به دهها مگابایت افزایش یابد.
تصویر ۱: نمایش مصرف بالای CPU و افت فریم در Performance Monitor به دلیل استفاده موازی از Stonerها
راهحل اول: جادوی UV Remap
راز بهینهسازی Stoner در خروجی دوم آن نهفته است. Stoner علاوه بر تصویر اصلاح شده، یک خروجی دوم دارد که یک UV Map است.
به جای استفاده از خودِ Stoner برای پردازش تصویر نهایی، ما میتوانیم:
- از خروجی دوم Stoner (مپ UV) استفاده کنیم.
- آن را به ورودی دوم یک Remap TOP متصل کنیم.
- تصویر اصلی را به ورودی اول Remap TOP بدهیم.
(Content)
(Output)
From Stoner Output 2
نتیجه همان اصلاح تصویر است، اما با هزینه پردازشی تقریباً صفر (اگر مپ UV ثابت باشد).
تصویر ۲: شماتیک اتصال نودها در روش بهینه
راهحل دوم: معماری سیستم و جداسازی کالیبراسیون
برای مدیریت بهتر، نباید Stoner را مستقیماً در زنجیره خروجی قرار داد. در عوض، باید یک معماری ماژولار بسازیم:
- بخش کالیبراسیون (Calibration Base): یک Base جداگانه که Stoner در آن قرار دارد. این بخش وظیفه تولید دادههای UV را بر عهده دارد اما در مسیر رندر نهایی نیست.
- بخش خروجیها (Output Containers): کانتینرهایی برای هر پروژکتور (مثلاً Channel 1 تا 4) که فقط شامل یک Remap TOP هستند.
- انتخابگر (Select): با استفاده از یک Select TOP، دادههای UV مورد نیاز هر کانال را از بخش کالیبراسیون فراخوانی میکنیم.
با این روش، شما فقط یک عدد Stoner در کل پروژه دارید که به نوبت کانالهای مختلف را تنظیم میکند، اما خروجیها مستقل عمل میکنند.
(UI & Logic)
Remap
Remap
Remap
Remap
نمودار ۳: معماری درختی جدا کردن رابط کاربری از خروجیها
راهحل سوم: مدیریت حجم فایل با TOXهای اکسترنال
حتی با روش بالا، اطلاعات کالیبراسیون حجم فایل پروژه را بالا میبرد. راهکار حرفهای، ذخیره کردن بخش کالیبراسیون به عنوان یک فایل .tox جداگانه است. با کلیک راست روی کامپوننت کالیبراسیون و انتخاب Save Component .tox، آن را ذخیره کنید.
سپس در پارامترهای Common، گزینه “External .tox” را آدرسدهی کنید و تیک “Save Backups” را بردارید. این کار حجم فایل اصلی .toe شما را به شدت کاهش میدهد و مدیریت ورژنها در گیت (Git) را آسان میکند.
تصویر ۴: مقایسه دراماتیک حجم فایل پروژه
سطح پیشرفته: اتوماسیون با پایتون (Python)
برای اینکه رابط کاربری (UI) شما هوشمند باشد و نیازی نباشد دستی مسیرها را تغییر دهید، از پایتون استفاده میکنیم:
- منوی داینامیک: با نوشتن یک ماژول پایتون و استفاده از دکوریتورها (
@property) و متدfindChildren، میتوانیم لیستی از تمام کانالهای موجود را پیدا کرده و به صورت خودکار در منوی Custom Parameter قرار دهیم. - تغییر مسیر خودکار: با استفاده از یک Parameter Execute DAT، وقتی شما در منو “Channel 2” را انتخاب میکنید، پایتون به طور خودکار مسیر Stoner را تغییر میدهد تا دقیقاً همان کانال را ویرایش کند.
if par.name == “Selectedchannel”:
target_op = op(par.val)
# Update Stoner target dynamically
op(‘stoner’).par.Targettop = target_op.path
return
تصویر ۵: نمونه منطق پایتون برای تغییر داینامیک کانالها
