স্ট্যাক ওভারফ্লো সম্প্রদায়ের সহায়তায় আমি একটি সুন্দর মৌলিক-তবে মজাদার পদার্থবিজ্ঞান সিমুলেটর লিখেছি।
আপনি একটি বল চালু করতে মাউসকে ক্লিক করুন এবং টেনে আনুন। এটি চারদিকে বাউন্স করবে এবং শেষ পর্যন্ত "তলে" থামবে।
আমার পরবর্তী বড় বৈশিষ্ট্যটি আমি যুক্ত করতে চাই বল থেকে বলের সংঘর্ষ। বলের চলাচলটি কুড়াল এবং y গতির ভেক্টর হিসাবে বিভক্ত হয়। আমার মাধ্যাকর্ষণ আছে (প্রতিটি ধাপে ওয়াই ভেক্টরের ছোট হ্রাস), আমার ঘর্ষণ আছে (উভয় ভেক্টরের প্রতিটি প্রাচীরের সাথে সংঘর্ষের ছোট হ্রাস)। বলগুলি সত্যই আশ্চর্যজনকভাবে বাস্তববাদী পথে ঘোরে।
আমার ধারণা আমার প্রশ্নের দুটি অংশ রয়েছে:
- বল থেকে বলের সংঘর্ষ শনাক্ত করার সেরা পদ্ধতি কী?
আমার কি কেবলমাত্র একটি ও (এন ^ 2) লুপ রয়েছে যা প্রতিটি বলের উপরে পুনরাবৃত্তি করে এবং অন্যান্য বলটি এটি ব্যাসার্ধের ওভারল্যাপ হয় কিনা তা পরীক্ষা করে দেখায়? - বল সংঘর্ষে বল পরিচালনা করতে আমি কী সমীকরণগুলি ব্যবহার করব? পদার্থবিজ্ঞান 101
এটি দুটি বলের গতি X / y ভেক্টরকে কীভাবে প্রভাবিত করে? দুটি বল মাথা নীচু করার ফলে দিকটি কী? আমি প্রতিটি বল এ কীভাবে প্রয়োগ করব?
"দেয়ালগুলির" সংঘর্ষ সনাক্তকরণ এবং ফলস্বরূপ ভেক্টরের পরিবর্তনগুলি পরিচালনা করা সহজ ছিল তবে আমি বল-বলের সংঘর্ষের সাথে আরও জটিলতা দেখতে পাচ্ছি। দেয়ালগুলির সাথে আমাকে কেবল উপযুক্ত x বা y ভেক্টরের নেতিবাচক নিতে হয়েছিল এবং এটিটি সঠিক দিকে চলে যাবে। বল দিয়ে আমি মনে করি না যে এটি সেভাবে।
কিছু দ্রুত স্পষ্টতা: সরলতার জন্য আমি আপাতত একটি নিখুঁত স্থিতিস্থাপক সংঘর্ষের সাথে ঠিক আছি, আমার সমস্ত বলগুলিতে এখন একই ভর রয়েছে, তবে ভবিষ্যতে আমি এটি পরিবর্তন করতে পারি।
সম্পাদনা করুন: সংস্থানগুলি আমি দরকারী বলে মনে করেছি
ভেক্টর সহ 2 ডি বল পদার্থবিজ্ঞান: ত্রিগোনমিতি ছাড়া 2-মাত্রিক সংঘর্ষ। Pdf
2 ডি বল সংঘর্ষ সনাক্তকরণ উদাহরণ: সংযুক্তি সনাক্তকরণ
সফল!
আমার বল সংঘর্ষ সনাক্তকরণ এবং প্রতিক্রিয়া দুর্দান্ত কাজ করছে!
প্রাসঙ্গিক কোড:
সংঘর্ষ সনাক্তকরণ:
for (int i = 0; i < ballCount; i++)
{
for (int j = i + 1; j < ballCount; j++)
{
if (balls[i].colliding(balls[j]))
{
balls[i].resolveCollision(balls[j]);
}
}
}
এটি প্রতিটি বলের মধ্যে সংঘর্ষের জন্য চেক করবে তবে রিলান্ড্ট চেকগুলি এড়িয়ে চলবে (যদি বলটি 1 বল 2 এর সাথে সংঘর্ষ হয় কিনা তা যদি আপনাকে পরীক্ষা করতে হয় তবে বল 2 বল 1 টির সাথে সংঘর্ষ হয় কিনা তা পরীক্ষা করে দেখার দরকার নেই। এছাড়াও, এটি নিজের সাথে সংঘর্ষের জন্য চেকিং এড়িয়ে যায় )।
তারপরে, আমার বল ক্লাসে আমার সংঘর্ষ () এবং রেজোলিউশনসিদ্ধকরণ () পদ্ধতি রয়েছে:
public boolean colliding(Ball ball)
{
float xd = position.getX() - ball.position.getX();
float yd = position.getY() - ball.position.getY();
float sumRadius = getRadius() + ball.getRadius();
float sqrRadius = sumRadius * sumRadius;
float distSqr = (xd * xd) + (yd * yd);
if (distSqr <= sqrRadius)
{
return true;
}
return false;
}
public void resolveCollision(Ball ball)
{
// get the mtd
Vector2d delta = (position.subtract(ball.position));
float d = delta.getLength();
// minimum translation distance to push balls apart after intersecting
Vector2d mtd = delta.multiply(((getRadius() + ball.getRadius())-d)/d);
// resolve intersection --
// inverse mass quantities
float im1 = 1 / getMass();
float im2 = 1 / ball.getMass();
// push-pull them apart based off their mass
position = position.add(mtd.multiply(im1 / (im1 + im2)));
ball.position = ball.position.subtract(mtd.multiply(im2 / (im1 + im2)));
// impact speed
Vector2d v = (this.velocity.subtract(ball.velocity));
float vn = v.dot(mtd.normalize());
// sphere intersecting but moving away from each other already
if (vn > 0.0f) return;
// collision impulse
float i = (-(1.0f + Constants.restitution) * vn) / (im1 + im2);
Vector2d impulse = mtd.normalize().multiply(i);
// change in momentum
this.velocity = this.velocity.add(impulse.multiply(im1));
ball.velocity = ball.velocity.subtract(impulse.multiply(im2));
}
উত্স কোড: বল টু বলের জন্য সম্পূর্ণ উত্স coll
কারও কাছে যদি এই বেসিক ফিজিক্স সিমুলেটরটি উন্নত করার জন্য কিছু পরামর্শ থাকে তবে আমাকে জানান! আমি এখনও একটি জিনিস যোগ করতে চাই কৌণিক গতি তাই বল আরও বাস্তববাদী রোল করবে। অন্য কোন পরামর্শ? মতামত দিন!
Vector2d impulse = mtd.multiply(i);
আমি * সাধারণীকরণ করা এমটিডি ভেক্টর হতে হবে। এর মতো কিছু:Vector2d impulse = mtd.normalize().multiply(i);