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

۱۰-۱ تعامل و شتاب

پیغام خطا

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).

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

هر زمان ما می خواهیم یک محاسبه برداری بر طبق یک قانون یا فرمول انجام دهیم، ما نیاز به محاسبه دو چیز داریم: اندازه و جهت. اجازه دهید با جهت شروع کنیم. ما می دانیم که بردار شتاب از موقعیت فعلی شی به موقعیت نشانگر اشاره کند. بیایید برای خودمان اینطور تعریف کنیم که: شی در موقعیت (x,y) قرار دارد و موس در موقعیت (mouseX, mouseY) قرار دارد.

تصویر ۱-۱۵

در تصویر ۱-۱۵، ما می توانیم ببینیم که بردار(dx,dy) با تفریق موقعیت شی ها از موقعیت موس به دست می آید. 

dx = mouseX – x

dy = mouseY - y

اجازه بدهید که تصویر بالا را با استفاده از PVector پیاده سازی کنیم. در نظر بگیرید که ما در کلاس Mover قرار داریم و بنابراین ما دسترسی به شی های موقعیت که یک PVector است داریم، پس داریم:

 

PVector mouse = new PVector(mouseX,mouseY);
PVector dir = PVector.sub(mouse,location);


برای جمع بندی، ما مراحل زیر را باید بگذرانیم:

۱- برداری که به موقعیت هدف اشاره دارد را محاسبه کنیم(در اینجا نشانگر)

۲-بردار حاصل را نرمال کنیم(طول آن را به یک کاهش دهیم)

۳- اندازه بردار به مقدار مناسب تبدیل کنیم(با ضرب آن در عدد مورد نظر)

۴- بردار حاصل را به عنوان شتاب به شی بدهیم.

اینجا این مراحل در تابع update قرار گرفته است

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

حالا این جای خالی را پر کنید: به هر جهت برای تنظیم اندازه( حالا هرچقدر که می خواهد باشد) PVector شتاب، ما ابتدا باید بردار جهت را ــــــــــــــــ کنیم.

درست گفتید، بله، آن را نرمال کنیم. اگر ما بتوانیم اندازه بردار را به بردار یکه تبدیل کنیم(بزرگی به اندازه یک) ما یک بردار داریم که به ما مسیر حرکت را می گوید. حالا می توانیم آن را به هر اندازه ای که لازم داریم تغییر اندازه دهیم. ضرب در هر چیزی مساوی همان چیز می شود.

 

 float anything = ?????
dir.normalize();
dir.mult(anything); 

مثال ۱-۱۰ شتاب به سمت نشانگر

 

 void update() {
 
    PVector mouse = new PVector(mouseX,mouseY);
    PVector dir = PVector.sub(mouse,location);
 
    dir.normalize();
 
    dir.mult(0.5);
 
    acceleration = dir;
 
    velocity.add(acceleration);
    velocity.limit(topspeed);
    location.add(velocity);
 
  } 

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

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

تمرین ۱-۸ سعی کنید مثال بالا را با تغییر اندازه شتاب به این شکل پیاده سازی کنید. وقتی که دور یا نزدیک نیست قوی تر باشد.

بیایید ببینیم که این مثال با آرایه ای از اشیاء mover به چه شکل می شود(بیشتر از یکی)

 

 Mover[] movers = new Mover[20];
 
void setup() {
  size(640,360);
  background(255);
  for (int i = 0; i < movers.length; i++) {
    movers[i] = new Mover();
  }
}
 
void draw() {
  background(255);
 
  for (int i = 0; i < movers.length; i++) {
    movers[i].update();
    movers[i].checkEdges();
    movers[i].display();
  }
}
 
class Mover {
 
  PVector location;
  PVector velocity;
  PVector acceleration;
  float topspeed;
 
  Mover() {
    location = new PVector(random(width),random(height));
    velocity = new PVector(0,0);
    topspeed = 4;
  }
 
  void update() {
 
 
    PVector mouse = new PVector(mouseX,mouseY);
    PVector dir = PVector.sub(mouse,location);
    dir.normalize();
    dir.mult(0.5);
    acceleration = dir;
 
    velocity.add(acceleration);
    velocity.limit(topspeed);
    location.add(velocity);
  }
 
  void display() {
    stroke(0);
    fill(175);
    ellipse(location.x,location.y,16,16);
  }
 
  void checkEdges() {
 
    if (location.x > width) {
      location.x = 0;
    } else if (location.x < 0) {
      location.x = width;
    }
 
    if (location.y > height) {
      location.y = 0;
    }  else if (location.y < 0) {
      location.y = height;
    }
  }
} 

تصویر ۱-۱۶ پروژه اکوسیستم

پروژه اکوسیستم

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

مرحله ۱تمرین:

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

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