ریاضی در انیمیشن

کاربرد ریاضیات در صنعت انیمیشن

4,290

ریاضی در انیمیشن ، نقطه عطف صنعت انیمیشن سه بعدی

“این ریاضی چیه ما باید یاد بگیریم آخه” ؛ “هیچ جا این ریاضی بدردمون نمی خوره” جملاتی که بین دانش آموزان رایج شده و اکثر دانش آموزان فقط برای رفع تکلیف این درس را مطالعه می کنند؛ ولی آیا تا به حال فکر کرده اید که واقعا چه استفاده هایی می شود از ریاضیات کرد؟ شاید تعجب کنید ولی ریاضی در انیمیشن یکی از بهترین مثال ها برای کاربرد های ریاضی می باشد.

چندین سال پیش (سال 1997 میلادی) گرد کردن گوشه های شخصیت های سه بعدی طراحی شده در شرکت پیکسار به مشکلی عظیم تبدیل شده بود. در نمونه های واقعی شخصیت ها که ساخته می شد می توانستند به سادگی و با یک سمباده گوشه های یک مکعب را از حالت نوک تیز خارج کنند اما برای این کار در کامپیوتر و ساخت یک شخصیت کامل در نرم افزار ها و سپس انیمیت آن ها به مشکل بر خورده بودند. آقای ادوین کاتمول (Edwin Catmull) ریاضیدان و پرزیدنت شرکت پیکسار به روشی برای نقطه یابی و گرد کردن گوشه های یک مستطیل دست یافت و این الگوریتم را در حالت سه بعدی تعمیم دادند. برای این کار نیاز به ضرایبی برای نقطه یابی وجود داشت با بررسی ضرایب به اعداد مثلث خیام پاسکال نیوتون میرسیم. جالب است بدانیم اگر اعدادی خارج از این مثلث به این الگوریتم وارد شوند شکلی نا متوازن را می سازند.

امروزه در نرم افزار های سه بعدی این الگوریتم به نام همین شخص برای گرد کردن گوشه ها شناخته میشود..

افتر افکت، نرم افزار کاربردی در ساخت اینفوموشن ها

افتر افکت راه حلی برای اعمال ریاضی در انیمیشن- کاربرد ریاضیات در صنعت انیمیشن

یکی از نرم افزار هایی که امروزه ساخت اینفوموشن ها در آن انجام می شود نرم افزار افتر افکت می باشد. این نرم افزار به خاطر داشتن قابلیت اکسپرشن نویسی می تواند تجلی ریاضی در انیمیشن باشد. برای اعمال الگوریتم های ریاضی بر روی آبجکت ها شما به محیطی بیش از محیط کی فریم سازی برای ویژگی ها نیاز دارید. البته شما می توانید تمامی محاسبات ریاضی را به صورت دستی انجام دهید و سپس در زمان های محاسبه شده برای آن کی فریم بسازید ولی رایانه برای این طراحی شده که از بار محاسبات ما بکاهد و کار های ما دقیق تر انجام بشود.

کی فریم ها به فریم های خاصی در طول زمان گفته می شوند که ویژگی های مختلفی مانند موقعیت و یا زاویه در آن زمان ها مقادیر متفاوتی دارند. باقی فریم های میان دو کی فریم به صورت درون یابی خطی یا درون یابی نمایی توسط نرم افزار مقدار دهی می شوند.

برای اعمال الگوریتم های ریاضی در انیمیشن های تان شما نیاز به نوشتن آن ها به صورت کد دارید. اکسپرشن ها زبان مشترک میان ما به عنوان یک انیماتور و نرم افزار می باشد.

از لفظ کد نویسی و اکسپرشن نترسید. برخلاف اسم غلط انداز آن رابط کاربری ساده ای دارد و قابل فهم می باشد.

البته افزونه هایی برای اعمال برخی از این قواعد بر روی ویژگی های مختلف در نرم افزار افتر افکت وجود دارد (افزونه افتر افکت چیست؟) که قریب به اتفاق آن ها نیازمند صرف هزینه اند و حتی با صرف هزینه باز هم قابلیت شخصی سازی کمی دارند. این نکته هم قابل ذکر است که دانستن پشت پرده این الگوریتم ها به استفاده بهینه از آن ها کمک می کند.

کاربرد های ریاضی در انیمیشن

به چند مورد از کاربرد های روابط ساده ریاضی در انیمیشن که همه ما در دوران دبیرستان با این روابط آشنا شده ایم می پردازیم و در ادامه با نحوه اعمال آن ها به ویژگی های مرتبط، آشنا می شویم.

یکی از الگوریتم های پر استفاده در بخش ریگ بندی -که مرحله پیش انیمیت به شمار می رود- ریگ بندی IK یا همان کینماتیک معکوس می باشد. در رابطه با کاربرد این روش از ریگ بندی در مقاله ای جداگانه به تفصیل توضیح داده شده است.(ریگ بندی ik چیست؟) اما در اینجا می خواهیم نحوه اعمال و اجرای این الگوریتم را مو شکافی کنیم. در این الگوریتم می بینیم چطور یک رابطه ساده ریاضی در انیمیشن می تواند چه خدمت بزرگی انجام دهد.

روش ریگ بندی IK به مکان یابی مفاصل میانی مانند آرنج و زانو به وسیله موقعیت مکانی مفاصل مبدا و مقصد یعنی مفاصل شانه و لگن و مچ ها می پردازد. بدون این الگوریتم انیماتور مجبور است تا موقعیت هر مفصل را به صورت جدا گانه انیمیت کند و این امر انرژی مضاعفی را می طلبد. البته الگوریتم FK یا کینماتیک مستقیم نیز در موقعیت های متفاوتی از انیمیشن نیاز است.

قانون کسینوس رابطه ریاضی در انیمیشن - کاربرد ریاضیات در صنعت انیمیشن

این الگوریتم با استفاده از رابطه کسینوس ها اعمال می شود. با استفاده از این قانون زاویه میان هر مفصل با استفاده از طول بازو ها محاسبه می شود.

مبحث دیگر که که در اینفوموشن ها و انیمیشن ها کاربرد فراوان دارد و بر روی انیمیت بسیاری از ویژگی ها می تواند اعمال بشود حرکت اورشات (overshot) و حرکت باونس (bouns) می باشد.

این دو حرکت، حرکت های رفت و برگشتی یک مقدار می باشند که در نهایت به مقدار نهایی آن ویژگی منجر می شوند. حرکت اورشات را می توانید در حرکت پاندول یک ساعت مشاهده کنید و حرکت باونس در افتادن یک توپ و برخورد با سطح زمین و برگشت آن و در نهایت توقف بر روی زمین  مشاهده می شود.حرکت باونس کاربرد ریاضی در انیمیشن - کاربرد ریاضیات در صنعت انیمیشن

 

حرکت اورشات - کاربرد ریاضیات در صنعت انیمیشن

تفاوت این دو حرکت در این موضوع به چشم می خورد که در حرکت اورشات مقدار ویژگی از مقدار نهایی آن در برخی نقاط بیشتر میشود و برخی نقاط هم از مقدار نهایی پایین تر می آید. اما در حرکت باونس این مقدار از مقدار نهایی تجاوز نمی کند.

توابع نمایی به عنوان یک تابع پر کاربرد هنگامی که با توابع سینوسی ترکیب می شوند می توانند نمایش زیبایی از کاربرد ریاضی در انیمیشنِ این نوع حرکات باشند. با استفاده از این توابع، این حرکت را می توانید به صورت کاملا مطابق با شرایط طبیعی انیمیت کنید.

پیشنهاد مطالعه  رمز و راز موفقیت شرکت انیمیشن سازی پیکسار

برای انیمیت چرخ، یکی از روش ها استفاده از دستور time در ویژگی rotation چرخ می باشد. می توانید این چرخش را با ضرب کردن سرعت در time مدیریت کنید. (توضیحات بیشتر را از این جا بخوانید.)

این سرعت را می توانید به وسیله یک slider control تنظیم کنید. اسلایدر کنترل ها یک افکت پیش فرض در نرم افزار افتر افکت می باشند که قابلیت پذیرش کی فریم دارند.

به مثال زیر توجه کنید:

هنگام شروع حرکت چرخ این سرعت در مدت زمان یک ثانیه از مقدار صفر به مقدار 360 درجه در ثانیه می رسد و پس از مدت زمان دو ثانیه ثابت بودن سرعت، در طول زمان یک ثانیه این مقدار دوباره به صفر بر می گردد. ظاهرا تمام اجزا در کنار هم درست قرار گرفته ان.د اما پس از اجرا متوجه می شوید که زاویه چرخش ابتدا با شتاب معینی افزایش می یابد و سپس روند چرخش با سرعت ثابتی ادامه پیدا می کند. اما در فاز انتهایی، چرخش چرخ معکوس می شود تا زاویه دوباره به صفر برگردد. در هر یک از تغییر فاز ها ما شاهد پرشی در نمایش می باشیم. مشکل کجاست؟

حلقه گم شده این روند انتگرال است. بله همان رابطه ای که هیچ موقع به کار نیامد. با بررسی سطح زیر نمودار اسلایدر کنترل، انتظار ما این است که در پایان حرکت زاویه چرخ 1080 درجه باشد ولی چون اسلایدر کنترل ها حافظه ندارند و مقدار قبلی خودشان یادشان نیست(!!!) این اتفاق رخ نمی دهد.انتگرال ریاضی در افتر افکت - کاربرد ریاضیات در صنعت انیمیشن

اگر بخواهید یک حرکت متناوب نرم و دقیق را شبیه سازی کنید حتما به توابع سینوس و کسینوس نیاز دارید. اما همان طور که می دانید ورودی این توابع به صورت رادیان می باشد و دوره تناوب این توابع برابر با 2PI رادیان و مقدار خروجی آن ها میان دو مقدار مثبت و منفی یک تناوب می کند. حال اگر این حرکت را با دوره تناوب متفاوت و بازه بیشتر بخواهیم به ویژگی position اعمال کنیم، چاره چیست؟

حرکت متناوب یک رابطه ریاضی در انیمیشن - کاربرد ریاضیات در صنعت انیمیشن

اینجاست که مفهوم سرعت زاویه ای، یک رابطه اساسی ریاضی در انیمیشن ایفای نقش می کند.

حال تصور کنید بخواهیم فرکانس تناوب را در طول زمان دستخوش تغییر کنیم، برای نتیجه همان اتفاقی می افتد که برای سرعت چرخ رخ داد. تغییرات فرکانس به هیچ وجه نرم نیست و پرش مشاهده می شود.

دستور پر کاربرد دیگر دستور wiggle می باشد. در این دستور نیز فرکانس نقش مهمی دارد. اما اگر نیاز به تغییر فرکانس در طول زمان باشد. باز هم مشکلات عدم هماهنگی تغییرات قبل و بعد از کی فریم ها مشاهده می شود.

کنترل ویگل با استفاده از انتگرال ریاضی در انیمیشن - کاربرد ریاضیات در صنعت انیمیشن

تمامی این مشکلات نشان دهنده لزوم استفاده از ریاضی در انیمیشن می باشد. نجات دهنده ما از مشکل عدم هماهنگی سرعت و فرکانس در زمان های دارای کی فریم، مبحث انتگرال می باشد؛ چرا که با انتگرال می توانیم به کنترلر های برنامه حافظه بدهیم.

ریگ بندی IK

همان طور که گفته شد ریگ بندی IK یک روش برای جایابی مفاصل میانی در بخش ریگ بندی می باشد. این الگوریتم با استفاده از قانون کسینوس ها اعمال می شود.

با استفاده از این قانون با داشتن طول اضلاع می توانیم زاویه ها را بیابیم. این قانون به شکل زیر می باشد.

تصویر قانون کسینوس ها

اما چگونه بایستی این قانون را اعمال کنیم؟

برای پاسخ به این سوال این سه مرحله را برای یک دست اعمال می کنیم. اگر مفاصل دست به صورت زیر نام گزاری شوند:

  • مفصل شانه: shoulder
  • مفصل آرنج: elbow
  • مفصل مچ: wrist
  • موقعیت نهایی مچ: wrist controller

اولین اکسپرشنی که شما نیاز دارید اکسپرشن زیر می باشد که بایستی به ویژگی rotation لایه مفصل شانه اعمال کنید.

A=thisComp.layer("R_shoulder").toWorld(thisComp.layer("R_shoulder").anchorPoint);
B=thisComp.layer("R_elbow").toWorld(thisComp.layer("R_elbow").anchorPoint);
C=thisComp.layer("R_wrist").toWorld(thisComp.layer("R_wrist").anchorPoint);
E=thisComp.layer("R_wrist CONTROLLER").toWorld(thisComp.layer("R_wrist CONTROLLER").anchorPoint);
a=length(B,C);
b=length(E,A);
c=length(A,B);
alpha=radiansToDegrees(Math.acos(clamp(((b*b+c*c-a*a)/(2*b*c)),-1,1)));
D=E-A;
delta=radiansToDegrees(Math.atan2(D[1],D[0]));
delta-alpha

در چهار خط ابتدایی این اکسپرشن موقعیت هر یک از مفاصل و موقعیت نهایی مچ پیدا می شود. در سه خط بعدی طول هر یک از اضلاع مثلثی که از این سه مفصل تشکیل می شود به دست می آید. خط هشتم همان جایی است که ریاضی در انیمیشن خودی نشان می دهد. اگر به ضرب و جمع مقادیر استفاده شده در این دستور دقت کنید؛ در می یابید که همان قانون کسینوس ها اعمال شده است. دو خط ادامه و به دست آوردن بردار D برای یافتن زاویه خط واصل میان مچ و شانه با خط افق می باشد.

حال کافی است زاویه خط واصل میان مچ و شانه و خط افق را از زاویه ای که با اعمال قانون کسینوس ها در مثلث تشکیل شده بدست آوردید کم کنید. این قدم اول شما برای استفاده از ریاضی در انیمیشن بود.

قدم بعدی یافتن زاویه آرنج می باشد. با اعمال اکسپرشن زیر به ویژگی rotation  لایه مفصل بازو این زاویه بدست می آید.

A=thisComp.layer("R_shoulder").toWorld(thisComp.layer("R_shoulder").anchorPoint);
B=thisComp.layer("R_elbow").toWorld(thisComp.layer("R_elbow").anchorPoint);
C=thisComp.layer("R_wrist").toWorld(thisComp.layer("R_wrist").anchorPoint);
E=thisComp.layer("R_wrist CONTROLLER").toWorld(thisComp.layer("R_wrist CONTROLLER").anchorPoint);
a=length(B,C);
b=length(E,A);
c=length(A,B);
alpha=radiansToDegrees(Math.acos(clamp(((b*b+c*c-a*a)/(2*b*c)),-1,1)));
gama=radiansToDegrees(Math.acos(clamp(((a*a-c*c+b*b)/(2*a*b)),-1,1)));
alpha+gama

این اکسپرشن تقریبا مشابه با اکسپرشن اعمال شده به ویژگی rotation مفصل شانه می باشد. یافتن تفاوت این دو اکسپرشن برعهده خودتان.

قدم نهایی برای ریگ بندی ik یک دست، ایجاد ساختار سلسله مراتبی برای مفاصل است. مفصل مچ بایستی به مفصل آرنج و مفصل آرنج نیز به مفصل شانه parent بشود. موقعیت y ویژگی position این دو لایه را بر روی صفر و مقدار x این ویژگی را بر روی مقدار دلخواه طول بازو ها تنظیم کنید.

ریگ بندی ik یک دست تمام شد. مشاهده کردید که چطور ریاضی در انیمیشن و ریگ بندی موثر ظاهر شد. ریگ بندی IK سایر استخوان ها از نیز به همین صورت است. نسخه پیشرفته تری از ریگ بندی IK وجود دارد که به مفاصل چند تایی مانند ستون فقرات یک کاراکتر اعمال میشود. ریگ بندی IK تعمیم داده شده نیازمند روابط ریاضی پی چیده تر و در نتیجه اکسپرشن ها و لایه های بیشتر است.

حرکت اورشات

حرکت اورشات یک حرکت متناوب است که با یک ضریب میرایی ایستا می شود. در حرکت اورشات سه فاکتور اصلی وجود دارد:

  • دامنه amplitude
  • فرکانس frequency تعداد نوسان در ثانیه
  • میرایی Decay با چه ضریبی دامنه نوسان به صفر برسد.

رعایت این حرکت، رعایت یکی از قوانین 12 گانه انیمیشن می باشد. اجزای فرعی یک جسم پس از توقف نیاز به نوسان دارند. رابطه کلی حرکت اورشات به صورت زیر می باشد:رابطه ریاضی حرکت اورشات - کاربرد ریاضیات در صنعت انیمیشن

پیشنهاد مطالعه  انیمیشن کوتاه Bao روایت تنهایی و غربت

حال بیایید این رابطه را به صورت اکسپرشن در بیاوریم:

amp = 80;
freq = 1;
decay = 1;

t = time – inPoint;
amp*Math.sin(t*freq*Math.PI*2)/Math.exp(t*decay)

در این مثال دامنه نوسان بر روی 80 و فرکانس نوسان و هم چنین ضریب میرایی بر روی 1 تنظیم شده اند. در خط بعدی همانطور که مشاهده می کنید مقدار زمانی که از فریم ابتدایی لایه گذشته است محاسبه شده و در خط پایانی نیز رابطه حرکت اورشات به زبان قابل فهم نرم افزار افتر افکت در آمده است.

تفاوت تابع sin و تابع cos در مقدار آن ها هنگام زمان شروع می باشد به این صورت که تابع sin با 90 درجه اختلاف فاز نسبت به تابع cos در زمان صفر مقداری برابر با صفر دارد و تابع cos در زمان صفر مقداری برابر با 1 را به عنوان خروجی به دست می دهد. کاربرد این دو تابع ریاضی در انیمیشن آن جاست که بخواهیم حرکت از صفر شروع شود و یا از ماکسیمم مقدار آن. برای مثال اگر بخواهیم یک آونگ در یک حرکت اورشات از بیشترین زاویه خود به نرمی نوسان کند و به مقدار صفر برسد بایستی از تابع cos در این رابطه استفاده شود.

بیایید با یک دیگر منطق ریاضی پشت این رابطه را بررسی کنیم. تابع Math.sin یک موج سینوسی در بازه مثبت منفی یک با فرکانس معین freq تولید میکند. برای رسیدن به دامنه معین کافی است این موج تولید شده را در عدد ثابتی برابر با دامنه ضرب کنیم. تابع Math.exp یک تابع نمایی تولید می کند که با تقسیم موج تولید شده توسط سینوس بر این تابع شکل موجی مشابه با شکل زیر تولید می شود.شکل موج حرکت اورشات -کاربرد ریاضیات در صنعت انیمیشن

معمولا این تمام آن چیزیست که شما به آن در انیمیشن های تان نیاز دارید. به طور خاص تر شما نیاز دارید که این اکسپرشن را به انتهای یک انیمیشنی اضافه کنید تا با یک حرکت اورشات به نرمی و با نوسان متوقف شود. فوت کوزه گری برای استفاده از این رابطه تنظیم زمان شروع نوسان و با توجه به مقدار ویژگی تنظیم دامنه نوسان می باشد.

گاهی اوقات این سرعت توسط خود اکسپرشن ها ایجاد می شود. به این مثال توجه کنید:

فرض کنید scale یک لایه در مدت 0.1 ثانیه از صفر درصد به 200 درصد قرار است برسد. شما می توانید برای این کار کی فریم بسازید ولی اجازه دهید تا اینکار را با استفاده از اکسپرشن ها انجام دهیم.

t = time - inPoint;
startVal = [0,0];
endVal = [200,200];
dur = 0.1;
linear(t,0,dur,startVal,endVal)

حالا ما بایستی برای پایان این انیمیت، یک حرکت اورشات اضافه کنیم. بیایید این اکسپرشن را به صورت زیر تغییر دهیم:

freq = 3;
decay = 5;

t = time - inPoint;
startVal = [0,0];
endVal = [200,200];
dur = 0.1;
if (t < dur){
  linear(t,0,dur,startVal,endVal);
}else{
  amp = (endVal - startVal)/dur;
  w = freq*Math.PI*2;
  endVal + amp*(Math.sin((t-dur)*w)/Math.exp(decay*(t-dur))/w);
}

حرکت اورشات با سرعت در اکسپرشن - کاربرد ریاضیات در صنعت انیمیشن

در این اکسپرشن ما زمان را به دو بخش تقسیم کردیم بخشی به عنوان ظاهر شدن جسم که در آن اندازه از صفر به صد تغییر می کند و بخش دیگر آن شامل حرکت اورشات می باشد. دامنه نوسان همان طور که گفته شد بایستی سرعت حرکت پیشین باشد. چون حرکت قبلی خطی است این سرعت به سادگی بدست می آید. راز مطابقت سرعت دو مرحله انیمیشن در متغیری به نام w می باشد. این متغیر که به نام سرعت زاویه ای شناخته می شود باعث میشود که با تقسیم مقدار اورشات بر این سرعت روند نوسان یک روند یکنواخت نسبت به قبل بشود.

شما می توانید این نوع از اکسپرشن ها را به هر ویژگی که خواستید اعمال کنید. حرکت اورشات می تواند بر روی ویژگی های چرخش و موقعیت نیز به زیبایی اعمال شود.

حرکت اورشات بر روی ویژگی دارای کی فریم

در مثال قبل حرکت ابتدایی افزایش scale را با استفاده از اکسپرشن linear ساختیم و سپس با توجه به سرعت خطی آن توانستیم دامنه نوسان را تنظیم کنیم. حال تصور کنید این حرکات به وسیله کی فریم ها بر روی ویژگی اعمال شوند. برای اعمال حرکت اورشات نیاز به سرعت در لحظه شروع این حرکت داریم. با اکسپرشن زیر می توانید بر روی هر ویژگی دارای کی فریم، اورشات اعمال کنید.

freq = 3;
decay = 5;

n = 0;
if (numKeys > 0){
  n = nearestKey(time).index;
  if (key(n).time > time) n--;
}
if (n > 0){
  t = time - key(n).time;
  amp = velocityAtTime(key(n).time - .001);
  w = freq*Math.PI*2;
  value + amp*(Math.sin(t*w)/Math.exp(decay*t)/w);
}else
  value

حرکت اورشات برای ویژگی کی فریم دار -کاربرد ریاضیات در صنعت انیمیشن

همانند گذشته، دو خط ابتدایی این اکسپرشن به تعریف متغیر های مورد نیاز در یرنامه اختصاص یافته است. در بخش بعدی یعنی پنج خط بعدی الگوریتم پیاده سازی شده ربطی به ریاضی در انیمیشن ندارد و فقط روندی است برای پیدا کردن زمان کی فریم ها. در قسمت بعدی همان اتفاقی که در مثال عای قبل افتاد رخ می دهد. مقدار دامنه را برابر با سرعت متغییر در لحظه ای قبل از لحظه کی فریم (0.001 ثانیه) قرار دادیم و فرمول ریاضی استفاده شده همان رابطه گذشته است.

حرکت باونس

در حرکت باونس فاکتور های متفاوتی در شبیه سازی آن وجود دارد. برای شبیه سازی طبیعی حرکت باونس علاوه بر روابط استفاده شده ریاضی در انیمیشن نیاز به دانستن کمی فیزیک داریم. فاکتور های مورد نیاز در حرکت باونس عبارتند از زاویه پرتاب، سرعت اولیه، ضریب الاستیک جسم پرتابی، اصطکاک (این مورد را می توانید تاثیر ندهید.)، ضریب گرانش و یا همان جاذبه.

در حرکت باونس دو بعدی ما می توانیم حرکت را به دو بخش x و y تقسیم کنیم. برای این کار بایستی سرعت اولیه را به دو فاکتور افق و عمود تجزیه کرده و تغییرات سرعت عمودی با توجه به ضریب گرانش اعمال می شود و با هر بار برخورد به زمین با توجه به ضریب الاستیک از سرعت عمودی آن کاسته می شود. ضریب اصظکاک نیز در سرعت افقی جسم تاثیر می گذارد. با همه این تفاسیر اکسپرشن مربوط به حرکت باونس به این صورت می باشد.

elev = degreesToRadians(75);
v = 1900;
e = .7;
f = .5;
g = 5000;
nMax = 9;
tLaunch = 1;
 
vy = v*Math.sin(elev);
vx = v*Math.cos(elev);
if (time >= tLaunch){
  t = time - tLaunch;
  tCur = 0;
  segDur = 2*vy/g;
  tNext = segDur;
  d = 0; // x distance traveled
  nb = 0; // number of bounces
  while (tNext < t && nb <= nMax){
    d += vx*segDur;
    vy *= e;
    vx *= f;
    segDur *= e;
    tCur = tNext;
    tNext += segDur;
    nb++
  }
  if(nb <= nMax){
    delta = t - tCur;
    x = d + delta*vx;
    y = delta*(vy - g*delta/2);
  }else{
    x = d;
    y = 0;
  }
  value + [x,-y]
}else
  value

ریاضی در انیمیشن با حرکت باونس توپ -کاربرد ریاضیات در صنعت انیمیشن

7 خط ابتدایی باز هم به تعریف متغیر ها اختصاص یافته است. دو خط بعدی هم به تجزیه سرعت اولیه در دو راستای افقی و عمودی می پردازد. تمامی دستوراتی که در بلوک شرطی (if) آمده است به شبیه سازی حرکت باونس با استفاده از روابط فیزیکی و ریاضی در انیمیشن می پردازد. توجه داشته باشید که این اکسپرشن با استفاده از داشتن متغیر nMax ماکسیمم مقداری که نیاز است تا حرکت رفت و برگشت اتفاق بیافتد را کنترل کند. این متغیر از محاسبات بی نهایت برای حرکت رفت و برگشتی جلو گیری می کند. همچنین با استفاده از متغیر tLunch شما می توانید لحظه پرتاب برا کنترل کنید.

پیشنهاد مطالعه  ایده اصلی داستان | نکاتی از داستان نویسی (قسمت اول)

حرکت باونس برای ویژگی کی فریم دار

برای اضافه کردن حرکت باونس به یک ویژگی که دارای کی فریم است می توانید از اکسپرشن زیر استفاده کنید. واکاوی این اکسپرشن را بر دوش خودتان می گذارم. اما می توانید تنها با کپی کردن این کد آماده به این نوع از حرکت دست پیدا کنید.

e = .7;
g = 5000;
nMax = 9;

n = 0;
if (numKeys > 0){
  n = nearestKey(time).index;
  if (key(n).time > time) n--;
}
if (n > 0){
  t = time - key(n).time;
  v = -velocityAtTime(key(n).time - .001)*e;
  vl = length(v);
  if (value instanceof Array){
    vu = (vl > 0) ? normalize(v) : [0,0,0];
  }else{
    vu = (v < 0) ? -1 : 1;
  }
  tCur = 0;
  segDur = 2*vl/g;
  tNext = segDur;
  nb = 1; // number of bounces
  while (tNext < t && nb <= nMax){
    vl *= e;
    segDur *= e;
    tCur = tNext;
    tNext += segDur;
    nb++
  }
  if(nb <= nMax){
    delta = t - tCur;
    value +  vu*delta*(vl - g*delta/2);
  }else{
    value
  }
}else
  value

ریاضی در انیمیشن با حرکت باونس کی فریم دار -کاربرد ریاضیات در صنعت انیمیشن

تغییر فرکانس و سرعت

در قانون ششم از قواعد 12 گانه انیمیشن به کاهش و افزایش سرعت در ابتدا و انتهای حرکت اشاره شده است. برای این کار به کنترل سرعت نیاز داریم. همانطور که گفته شد اگر بخواهید تا سرعت چرخش یک چرخ را به وسیله یک اسلایدر کنترل تنظیم کنید؛ در نقاط کی فریم دچار پرش و ناهمگونی در انیمیشن می شوید. راه حل نیز استفاده از ریاضی در انیمیشن بود. آن هم قسمت شیرین انتگرال. چرا که اسلایدر کنترل به تنهایی حافظه ای نداشت و شما نیاز دارید تا برای یاد آوری مقدار گذشته اسلایدر کنترل از یک انتگرال گیر در برنامه خود استفاده کنید. اکسپرشن انتگرال گیر به صورت زیر می باشد. کد آماده زیر را کافیست برای ویژگی ها مورد نظرتان کپی کنید.

spd = effect("Slider Control")("Slider");
n = spd.numKeys;
if (n > 0 && spd.key(1).time < time){
  accum = spd.key(1).value*(spd.key(1).time - inPoint);
  for (i = 2; i <= n; i++){
    if (spd.key(i).time > time) break;
    k1 = spd.key(i-1);
    k2 = spd.key(i);
    accum += (k1.value + k2.value)*(k2.time - k1.time)/2;
  }
  accum += (spd.value + spd.key(i-1).value)*(time - spd.key(i-1).time)/2;
}else{
  accum = spd.value*(time - inPoint);
}
value + accum

انیمیت سرعت با روابط ریاضی در انیمیشن

در بلوک شرطی if تمام جادوی ریاضی در انیمیشن اتفاق می افتد. متغیر های k1 و k2 تعیین کننده بازه ابتدایی و انتهایی انتگرال را پیدا می کند. متغیر accum مقدار نهایی انتگرال را محاسبه می کند.با استفاده از این اکسپرشن انیمیت شما نرم و بدون هیچ گونه نا همگونی از سرعت کم به سرعت بالا و دوباره به سرعت کم می رسد.

انتگرال ریاضی در انیمیشن - کاربرد ریاضیات در صنعت انیمیشنمحاسبه انتگرال مقادیر کی فریم شده اسلایدر کنترل

در صورت استفاده از قابلیت Hold keyframe هرچند اکسپرشن قبلی کاربرد دارد ولی در برخی نقاط مشکل دارد. برای رفع این مشکل می توانید از کد های زیر که کمی تغییر در دستورات شرطی آن به وجود آمده است استفاده کنید.

spd = effect("Slider Control")("Slider");
n = spd.numKeys;
if (n > 0 && spd.key(1).time < time){
  accum = spd.key(1).value*(spd.key(1).time - inPoint);
  for (i = 2; i <= n; i++){
    if (spd.key(i).time > time) break;
    k1 = spd.key(i-1);
    k2 = spd.key(i);
    v2 = spd.valueAtTime(k2.time-.001);
    accum += (k1.value + v2)*(k2.time - k1.time)/2;
  }
  accum += (spd.value + spd.key(i-1).value)*(time - spd.key(i-1).time)/2;
}else{
  accum = spd.value*(time - inPoint);
}
value + accum

کنترل فرکانس

برای ساخت یک حرکت متناوب به دو چیز نیاز دارید: فرکانس و دامنه. اگر فرکانس یک حرکت را در طول زمان تغییر دهیم حالتی مشابه با شکل زیر رخ می دهد.کاربرد انتگرال ریاضی در انیمیشن - کاربرد ریاضیات در صنعت انیمیشن

برای جلوگیری از پرش نمودار می توانید از مجموعه کد انتگرال گیر زیر برای تولید حرکت متناوب استفاده کنید.

freq = effect("Slider Control")("Slider");
amp = 100;
n = freq.numKeys;
if (n > 0 && freq.key(1).time < time){
  accum = freq.key(1).value*(freq.key(1).time - inPoint);
  for (i = 2; i <= n; i++){
    if (freq.key(i).time > time) break;
    k1 = freq.key(i-1);
    k2 = freq.key(i);
    accum += (k1.value + k2.value)*(k2.time - k1.time)/2;
  }
  accum += (freq.value + freq.key(i-1).value)*(time - freq.key(i-1).time)/2;
}else{
  accum = freq.value*(time - inPoint);
}
value + amp*Math.sin(accum*Math.PI*2)

بار دیگر انتگرال گیر خطی به کمک ما می آید اما اینبار از حاصل انتگرال (accum) به جای فرکانس در رابطه ریاضی انیمیشن استفاده می کنیم. نمودار زیر حرکت متناوب نمودار قبل را با استفاده از انتگرال گیر خطی نشان می دهد.انتگرال گیر خطی ریاضی در انیمیشن - کاربرد ریاضیات در صنعت انیمیشن

برای حسن ختام این مبحث اکسپرشن wiggle با یک فرکانس متغیر را برای شما قرار می دهم. امیدوارم برای شما کاربرد داشته باشد. کافی است کد زیر را برای ویژگی مورد نظر خود کپی کنید.

freq = effect("Slider Control")("Slider");
amp = 10;
n = freq.numKeys;
if (n > 0 && freq.key(1).time < time){
  accum = freq.key(1).value*(freq.key(1).time - inPoint);
  for (i = 2; i <= n; i++){
    if (freq.key(i).time > time) break;
    k1 = freq.key(i-1);
    k2 = freq.key(i);
    accum += (k1.value + k2.value)*(k2.time - k1.time)/2;
  }
  accum += (freq.value + freq.key(i-1).value)*(time - freq.key(i-1).time)/2;
}else{
  accum = freq.value*(time - inPoint);
}
wiggle(1,amp,1,.5,accum)

اصلاح ویگل با انتگرال گیر ریاضی در انیمیشن - کاربرد ریاضیات در صنعت انیمیشننمودار ویگل اصلاح شده

برای تمرین بیشتر تحت وب و مشاهده کاربرد های دیگر ریاضی در انیمیشن میتوانید سری به خان آکادمی بزنید. مجموعه pixar in a box آموزش جامع و مختصری را در این رابطه عرضه کرده است.

کلام آخر

در این مقاله شما با کاربرد ریاضی در انیمیشن آشنا شدید. مشاهده کردید چگونه قانون کسینوس ها در ریگ بندی IK به کار آمده و ریگ بندی IK چگونه کار ها را برای انیماتور ها ساده تر کرده است. به زودی شما را با ریگ بندی IK تعمیم یافته که برای تعداد استخوان های بیشتر کاربرد دارد آشنا می کنم. در ادامه با کاربرد توابع نمایی ریاضی در انیمیشن آشنا شدید و حرکت اورشوت و باونس زیبایی ساخته شد. در پایان نیز آموختید چگونه یک حرکت متناوب با فرکانس متغیر را با استفاده از یک انتگرال گیر بسازید. با ما همراه باشید.

8 دیدگاه. ارسال دیدگاه جدید

  • pouria

    5 دی, 1401

    سلام و سپاس از سایت خوب شما ببخشید درخواستی داشتم لطفا اگر امکانش هست
    یک کتاب معرفی کنید در ضمینه کاربرد ریاضیات در انیمیشن
    لاتین یا فارسی اصلا مهم نیست سپاس

  • مهدی سعیدی

    8 آبان, 1399

    بله کاملا درسته
    واقعا خوشحالم که با حوصله توضیح میدید
    به قول یکی از دوستان به وب سایتتون باید اسکار بدن!!
    پس این موضوع که ریاضی دارم میخونم در کنار انیماتوری یک امتیاز و برتری حساب میشه دیگه درسته؟

  • مهدی سعیدی

    8 آبان, 1399

    سلام
    ممنون از اطلاعاتتون
    راستش من عاشق انیمیشن هستم و اومدم ریاضی فیزیک
    سال اول دبیرستانم(دهم)
    هیچ وقت فکرشم نمی کردم که ریاضیات اینقدر تو گرافیک کامپیوتری کاربرد داشته باشه
    پس یعنی انیماتور ها به نوعی ریاضی دان هستن؟
    من کسانی رو دیدم که انیمیت میکنن که ریاضی همیشه نمره تک رقمی میگرفتن
    پس چرا ریاضی اینقدر کاربرد داره؟!

    • احمد گلچین

      8 آبان, 1399

      سلام
      هرجا که اسم کامپیوتر میاد پس قطعا ریاضی نقش مهمی در اون خواهد داشت. اما لزوما همه انیماتور ها ریاضی دان نیستند بلکه از نتیجه ریاضیات در کارشون استفاده می کنند.
      برای مثال آقای ادوین کاتمول یک روشی برای گرد کردن اشکال هندسی ارائه کرده که در بسیاری از نرم افزار های سه بعدی این روش پیاده سازی شده و سایر کاربران از اون استفاده می کنند اما اگر شما منطق پشت این ابزار رو بدونید و درک کنید قطعا بهتر و بهینه تر از این ابزار استفاده می کنید.
      یا برخی از ابزار هایی که در این مقاله برای نرم افزار افتر افکت بهش اشاره شده به صورت یک سری پلاگین در اومده که شما حتی با ندوستن الگوریتم پشت اون ها نیز می تونید از اون ها استفاده کنید ولی برای تنظیمات این ابزار ها فقط تجربه به کار شما میاد و سرعت رشد شما کمتر میشه.
      در ضمن نمره پایین در یک درس به معنی اینکه در اون درس شخص افتضاحه نیست و بالعکس نمره بالا در درس مثلا ریاضی شخص رو به ریاضی دان تبدیل نمی کنه و شاید فقط اون رو در حد ریاضی خوان بالا بیاره.
      بسیاری از نکات ریاضی رو افراد به صورت ناخودآگاه در ذهنشون دارند و یا با مشاهده وقایع طبیعی اون رو درک می کنند مثل همین حرکت باونس یا برخورد توپ به زمین. انیماتور های گذشته که سیستم کامپیوتری برای محاسبات نبود و باید روی کاغذ نقاشی می کردند بیشتر با دیدن فیزیک حرکت یک توپ در واقعیت(خیلی بیشتر از حد معمول دیدن و با دقت دیدن) این روند رو درک می کردند و اون رو به روی کاغذ می آوردند اما تصور کن یکی از این افراد ریاضی هم بلد بوده و کار خودشو با اعداد و ارقام سر و سامون داده و این طور شده که در تاریخ موندگار شده و به یکی از افراد مهم پیکسار تبدیل شده.
      خلاصه کلام اگر علم پشت اتفاقات رو بلد باشید اونوقت می تونید اون ها رو بسط بدید و چیز های خارق العاده تری خلق کنید.

      • مهدی سعیدی

        8 آبان, 1399

        بله کاملا درسته
        واقعا خوشحالم که با حوصله توضیح میدید
        به قول یکی از دوستان به وب سایتتون باید اسکار بدن😅
        پس این موضوع که ریاضی دارم میخونم در کنار انیماتوری یک امتیاز و برتری حساب میشه دیگه درسته؟

        • احمد گلچین

          8 آبان, 1399

          ممنون از لطف شما
          بله یک امتیازه به شرط اون که مهارت های انیمیشنی خودتون رو افزایش بدید تا این مهارت تخصصی رو هم در کنار تخصص ریاضیات داشته باشید برای این کار می تونید از آموزش مبانی انیمیشن استفاده کنید.
          موفق باشید.

          • مهدی سعیدی

            8 آبان, 1399

            چشم حتماً
            یه سوال بی ربط…
            چرا عنوان اسم من نارنجی شده؟!

          • تیم پشتیبانی نوشیکا

            8 آبان, 1399

            مربوط به دیزاین سایت است

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

این فیلد را پر کنید
این فیلد را پر کنید
لطفاً یک نشانی ایمیل معتبر بنویسید.

فهرست

لطفا صبر کنید