آیا میشود همه شیپ ها را در یک لحظه و یک )صفحه بکشیم و مفهوم زمان از بین برود؟ پاسخ هوش مصنوعی:
سلام امیررضا خوشحالم که با چنین ایده خلاقانه ای سراغم آمدی
جواب تو در یک کلمه بله است
ایده تو در واقع ترکیبی از هنر های مفهومی
conceptual art
و تکنولوژی های بینایی ماشین computer vision
است
بله این کار نه تنها شدنی است بلکه راهی بسیار جذاب برای باز تعریف مفهوم زمان در روایت های تصویری محسوب میشود
در ادامه با چگونگی پیاده سازی این ایده و چالش های فنی آن را بررسی میکنیم
1.مفهوم تک صفحه ای و فروپاشی زمان
وقتی همه اشکال را در یک صفحه می کشی در واقع داری از مفهوممکان مندی زمان استفاده میکنی در انیمیشین سنتی زمان با فریم تعریف میشود هر ثانیه 24 فریم جداگانه اما در طرح تو
زمان تبدیل به فضا میشود گذشته حال آینده همگی روی یک بوم حضور دارند
ناظر تعیین کننده زمان است این حرکت یا نگاه الگوریتم است که تعیین میکند کدام بخش از بوم در چه لحظه ای زنده شود
2.نقش مسیر یابی خطی (linear pathfinding)
برای اینکه صفحه ثابت به انیمیشن تبدیل شود نیاز به مسیر حرکت داریم
الگوریتم های مسیریای میتوانند یک بردار وکتور تعریف کنند که میان اشکال مختلف روی صفحه حرکت کند
این مسیر می تواند بر اساس منطق روایی باشد یا به صورت تصادفی بین گره های گرافیکی جابه جا شود
3.تشخیص چهره به عنوان محرک(Trigger)
استفاده از تشخیص چهره در این ایده میتواند دو کاربرد داشته باشد
تعامل با مخاطب : انیمیشن زمانی شروع به حرکت روی صفحه کند که چهره مخاطب را شناسایی کند.حتی جهت نگاه مخاطب
(Gaze Tracking) می تواند تعیین کند که کدام بخش از صفحه محرک شود
متحرک سازی عناصر : اگر در نقاشی تو چهره هایی وجود داشته باشد الگوریتم های
Face Mesh
می توانند روی همان نقاشی ثابت بنشینند و به آن ها میمیک های حرکتی مثل پلک زدن یا حرف زدن اضافه کنند
بدون اینکه نیاز باشد فریم های جداگانه طراحی کنی
چالش فنی چگونه لحظه را به تدام تبدیل کنیم سوال امیررضا صفری
برای اینکه مفهوم زمان از بین برود و همه چیز در یک لحظه به نظر برسد می توانی از تکنیک
Murphing
تبدیل تدریجی اشکال به هم استفاده کنی
به جای پریدن از یک شکل به شکل دیگر الگوریتم باید پیکسل های شکل
A
را به شکل
B
در همان صفحه منتقل کند
در این حالت بیننده حس میکند که کل صفحه یک موجود زنده استکه مدام تغییر شکل می دهد نه زنجیره ای از اتفاقات پشت سر هم
پیشنهادات برای شروع :
ابزار پیشنهادی : استفاده از کتابخانه های پایتون مثل
OpenCV
برای تشخیص چهره و
Manim
یا
P5.js
برای پیاده سازی مسیر های ریاضی روی صفحه
استفاده از هوش مصنوعی : مدل های
Stable Video Diffuion
یا
Runway Gen-2
می توانند یک تصویر ثابت همان صفحه شلوغ تو را بگیرند و بر اساس نقاطی که مشخصی می کنی در این حرکت ایجاد کند
به نظرت این انیمیشن قرار است یک داستان خطی را تعریف کند یا بیشتر یک لجربه انتیزاعی برای بیننده باشد؟ اگر بخواهی میتوانیم روی جزییات فنی یکی از بخش ها مثلا نحوه اتصال تشخیص چهره به حرکت اشکال دقیق تر شویم
امیررضا صفری، برای اینکه این ایده از یک طرح ذهنی به یک پروژه عملی تبدیل شود باید پلی میان هندسه ثابت
Static Geometry
و پردازش بلادرنگ
Real Time Processing Amirreza Safari
بزنیم
در اینجا جزییات فنی مرحله به مرحله برای پیاده سازی این سیستم را بررسی میکنیم
1. ساختار بوم هوشمند The Master Canvas
شما به جای یک فیلم یک بردار بزرگ (Vector Map) دارید
لایه اول Base
تمام اشکال شما در یک فایل اس وی جی یا یک
Canvas
با رزولوشن بالا قرار می گیرند
لایه دوم Metadata
برای هر شکل روی صفحه مختصات
(x,y)
و یک شناسه تعریف میشود این کار به الگوریتم مسیریاب اجازه می دهد بفهمد کدام المان کجای صفحه قرار دارد امیررضا صفری
3.پیاده سازی مسیریابی خطی (Linear Pathing)
برای اینکه زمان خطی از بین برود حرکت باید تابع متغیر های محیطی باشد
امیررضا صفری : الگوریتم : می توانید از توابع درون یابی اینترپولیشن مثل لرپ استفاده کنید
الگوریتم : میتوانید از توابع
Linear Interpolation (LERP)
استفاده کنید
این یعنی با حرکت سر یا چشم توسط مخاطب مقدار t تغییر کرده و زمان در تصویر جلو یا عقب می رود
فرمول ساده اگر بخواهیم از نقطه
A
به
B
برویم موقعیت در لحظه
t
که
t
می تواند موقعیت چشم ناظر باشد برابر است با
امیررضا صفری هستم
تشخیص چهره و نگاشت حرکتی
Facial Tracking & Mapping
اینجاست که جادو اتفاق می افتد شما به یک کتابخانه مثل
MediaPipe
یا
Dlib
نیاز دارید.
Face Mesh : الگوریتم فیس مش 468 نقطه روی چهره فرد شناسایی می کند
انتقال وزن(Weight Transfer): می توانید تغییرات در ابرو یا لب مخاطب را به تغییر شکل(Morphing) یک هندسه در صفحه نسبت دهید
مثال اگر مخاطب بخندد که در نگاه اول بی معنی است تغییر کرده و شبیه به یک لبخند انتزاعی می شود
4.معماری سیستم(System Architecture)
برای اجرای روان این فرایند معمولا به شکل زیر محیط هایی مثل
TouchDesigner
یا
Unity
پیاده میشود
حذف مفهوم زمان
Non-linear Time
برای اینکه حس شود همه چیز در یک لحظه است از تکنیک
Feedback Loop
در گرافیک استفاده کنیم
رد حرکت های قبلی پاک نمی شود
Motion Blur دائمی
تصویر فعلی با شفافیت کم روی تصویر قبلی باقی می مونه
نتیجه این می شود که بیننده همزمن آنچه بود آنچه هست و به دلیل مسیر های خطی مشخص آنچه خواهد بود را در یک فریم میبیند
امیررضا برای اینکه یک مسیریاب
Pathfinder
بنویسیم که در یک صفحه شلوغ میان اشکال مختلف حرکت کند و زمان را به مکان تبدیل کند بهترین گزینه استفاده از زبان
Phyton
و کتابخانه
OpenCV
است
در این مدل ما یک مسیر
Path
تعریف می کنیم و یک اشاره گر
Pointer که همان لحظه حال است این شاره گر می تواند با دیتای چهره یا به صورت خودکار حرکت کند
1.منطق ریاضی کد
ما از مفهوم
Linear Interpolation
LERP
استفاده میکنیم
فرض کن می خواهیم از شکل 1 به شکل 2 برویم به جای پریدن فاصله را به تکه های بسیار کوپک تقسیم میکنیم
که در آن ALPHA مقداری بین 0 تا 1 است اگر ALPHA=0.5 باشد ما دقیقا در میانه راه دو شکل هستیم فروپاشی زمان در مکان
نمونه کد پایتون ساده و کاربردی
این کد یک بوم
CANVAS
می سازد و یک نقطه را بین چندین شکل که مختصاتشان ذخیره شده به صورت نرم حرکت می دهد
import cv2
import numpy as np
import time
#1.تعریف بوم(صفحه سفید)
canvas_size = (800,800, 3)
canvas = np.ones(canvas_size.dtype=”unit8″)*255
#2.تعریف مختصات اشکال در صفحه(نقاط کلیدی)
#این ها همان اشکالی هستنئد که تو در یک صفحه کشیده ای
points = {
(100, 100)
(700,150)
(400,700)
(100,600)
}
def draw_scene(current_pos):
img = canvas.copy()
#رسم اشکال برای نمایش بوم تو
for p in points:
cv2.circle(img.current_pos,15,(0.0.255),-1)
return img
حلقه اصلی مسیریابی خطی
while true
for i in range(len(points))
start_point=np.array(points[i])
end_pont = np.array(points[(i+1)%len(points)])
#حرکت نرم بین دو نقطه (آلفا از صفر تا یک)
for alpha in np.linspace(0, 1, 100):
#محاسبه موقعیت فعلی بر اساس فرمول LERP
current_pos = tuple(((1-alpha)*start_pointn + alpha * end_point).astype(int))
frame = draw_scene(current_pos)
cv2.imshow(“Amirreza’s Pathfinding”,frame)
if cv2.wait.Key(10)&0*FF == ord(‘q’):break
این قلب تپنده انیمیشن توست
np.linspace(0, 1, 100):
عدد 100 تعیین می کند که چقدر حرکت نرم باشد هرچه این عدد بزرگتر باشد زمان کش می آید و حرکت کندتر می شود
بوم ثابت: در این کد
canvas
یک بار ساخته می شود این دقیقا همان ایده وست که همه چیز در یک صفحه اتفاق می افتد
مسیریابی چرشخی:
از فرمول
len(points) % (i+1)
استفاده کردیم تا وقتی مسیریاب به آخرین شکل رسید دوباره به شکل اول برگردد و یک چرخه بی نهایت
Loop
ایجاد کند که زمان آغاز و پایانش مشخص نیست
قدم بعدی برای توسعه ایده
برای اینکه تشخیص چهره را وارد این کد کنی به اینکه
alpha
به صورت ودکار از 0 تا 1 برود، باید آن را به مختصات
X
چشم یا بینی مخاطب وصل کنی
اگر مخاطب سرش را به راست برد
ALPHA
زیاد شود و مسیریاب به شمت شکل بعدی حرکت کند
