شما اینجا هستید

۳-۲ تجمیع نیروها

پیغام خطا

Deprecated function: The each() function is deprecated. This message will be suppressed on further calls در book_prev() (خط 775 در /home/molavy/public_html/modules/book/book.module).

شتاب = نیرو ترجمه تحت الفظی از قانون دوم نیوتن است(بدون جرم). با این حال، یک مشکل بزرگ اینجا وجود دارد. اجازه بدهید که کاری که می خواستیم انجام بدهیم برگردیم: یک شی در محیط بسازیم که به باد و جاذبه پاسخ بدهد.

 mover.applyForce(wind);
mover.applyForce(gravity);
mover.update();
mover.display();

خوب، بیاید برای چند لحظه مثل یک کامپیوتر فکر کنیم. اول applyForce را برای باد فراخوانی کرده ایم. حالا شتاب شی Mover بر روی PVector باد تنظیم شده است.بعد، ما applyForce را برای گرانش فراخوانی کرده ایم. حالا شتاب شی Mover بر روی بردار گرانش PVector تنظیم شده است. سوم، ما update را فراخوانی کرده ایم. چه اتفاقی در update می افتد؟ شتاب به سرعت اضافه می شود.

 velocity.add(acceleration); 

ما هیچ خطایی در processing نمی بینیم. اما ما به یک مشکل بزرگ برخورد کرده ایم. میزان شتاب در هنگام اضافه کردن به سرعت چقدر است؟ شتاب برابر با نیروی گرانش است. باد نادید گرفته شده. اگر ما applyForce را بیش از یکبار فراخوانی کنیم، بر روی فراخوانی های قبلی بازنویسی می کند. چطور بیش از یک نیرو را مدیریت کنیم؟

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

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

یا، شتاب برابر است با مجموع همه نیرو ها تقسیم بر جرم. به نظر خوب می رسد.به دنبال این بحث، ما در قانون اول نیوتن دیدیم که اگر همه نیرو ها برابر صفر باشند، شی در یک وضعیت تعادلی ظاهر خواهد شد.(مثلا، بدون شتاب). پیاده سازی ما از این فرایند به نام تجمع نیرو شناخته می شود. این خیلی ساده است، همه کاری که باید انجام دهیم است که همه نیرو ها را با هم جمع کنیم. در هر لحظه، ممکن است ۱، ۲، ۶، ۱۲، یا ۳۰۳ نیرو باشد وقتی شی ما میداند که چطور هر شی را با هم جمع کند، اهمیت ندارد که چه تعداد نیرو روی آن اعمال می شوند.

 void applyForce(PVector force) {
    acceleration.add(force);
 } 

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

 if (mousePressed) {
  PVector wind = new PVector(0.5,0);
  mover.applyForce(wind);
} 
وقتی کاربر موس را رها می کند، باد می ایستد، و بر طبق قانون اول نیوتن، شی به حرکت خود با سرعت ثابت ادامه خواهد داد. اگرچه اگر ما فراموش کنیم که شتاب را ریست کنیم، باد هنوز تاثیر گذار خواهد بود، حتی بدتر، تا زمانی که ما نیروها را با هم جمع می کنیم در هر فریم به مقدار خودش در فریم قبلی اضافه خواهد شد.
در شبیه سازی ما شتاب حافظه ندارد. تنها در هر لحظه بر اساس نیروهای محیط محاسبه می شود. این موضوع متفاوت از موقعیت است، که برای حرکت مناسب در فریم بعد باید موقعیت شی در فریم قبلی را به خاطر بسپارد.
راه راحت برای پیاده سازی پاک کردن شتاب در هر فریم این است که PVector را در آخر تابع update در صفر ضرب می کنیم.
 void update() {
    velocity.add(acceleration);
    location.add(velocity);
    acceleration.mult(0);
 } 

تمرین ۲-۱

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

دیدگاه جدیدی بگذارید