গতি বাড়ার সাথে সাথে কীভাবে কম বেগ হারাতে অবজেক্ট পাবেন


11

আমি ফ্ল্যাশ এ একটি গেম বিকাশ করছি এবং আমার একটু সাহায্য দরকার। এটি গণিতের সমস্যা হিসাবে বিবেচিত হতে পারে।

আমার বস্তু গতিতে উড়ছে Xএবং আমার বস্তু পাথরের সাথে সংঘর্ষে পড়তে পারে। এটি যখন একটি পাথরের সাথে সংঘর্ষ হয়, আমি পাথরটি ভেঙে চালিয়ে যেতে আমার অবজেক্টটি প্রয়োজন, তবে কম বেগ দিয়ে। এটি হার্ড-কোড করা এবং এর মতো কিছু লিখতে সহজ: myVelocity -= 10;তবে আমার মূল সমস্যাটি হ'ল আমি চাই এটির বেগটি কম বেগ হারাতে চাই প্রাথমিক গতিবেগের চেয়ে বেশি।

উদাহরণস্বরূপ: বেগটি যদি 300 হয় তবে আমি এটি 10 ​​হারাতে চাই এবং 200 হয় যদি আমি এটি 20 হারাতে চাই।

এটি কি কোনও ধরণের সূত্র দিয়ে করা যেতে পারে?


1
কীভাবে সহজ কিছু সম্পর্কে log(myVelocity + 1) * N?
জোনাথন কনেল

উত্তর:


6

আমি গতিটি উল্টাব এবং আপনার পছন্দ মতো কিছু দিয়ে গুন করব:

float velocity = 300.0f;
float collisionEffect = 3000.0f / velocity;
if (collisionEffect > velocity)
{
    // Choose which one you like: with or without restitution

    // No restitution
    collisionEffect = velocity;

    // Restitution
    collisionEffect = velocity + (collisionEffect - velocity) * 0.3f;
}
velocity -= collisionEffect;

এই উদাহরণটি এই প্রভাব দেয়:

400 loses 7.5
300 loses 10
200 loses 15
100 loses 30
 50 loses 50  // Using no restitution
 50 loses 53  // Using restitution
 20 loses 20  // Using no restitution
 20 loses 59  // Using restitution

"পুনরুদ্ধার" কি?
jprete

পুনরুদ্ধারের উদয় হয়। যা বাস্তবসম্মত।
মার্টিজন কোর্টেক্স

30

যে সিস্টেমটি আপনি এবং অন্যরা বর্ণনা করেছেন সেগুলি প্রকৃত চেহারাযুক্ত পদার্থবিজ্ঞান তৈরি করবে না। প্রধান সূত্র একটি দ্বারা 0.5 * মি * বনাম ^ 2 (সৃতিবিদ্যা শক্তি) হ্রাস হয় ধ্রুবক যখনই বস্তুর কোথাও হিট মান।

সুতরাং ওজন 2 কেজি সহ কোনও বস্তু যদি কোনও ব্লকে আঘাত করে, যা ব্রেক হওয়ার আগে 16 জ্ শক্তি প্রয়োজন: বস্তু চলাচলের গতি এই টেবিল অনুযায়ী পরিবর্তন হবে:

4  m/s -> the block will not break
5  m/s -> 3   m/s
6  m/s -> 4.4 m/s
7  m/s -> 5.7 m/s
8  m/s -> 6.9 m/s
9  m/s -> 8   m/s
10 m/s -> 9.1 m/s

7
এটি গ্রহণ করা উচিত - এটি সঠিক, বাস্তববাদী, কার্যকর করা সহজ, এবং অবজেক্ট এবং ব্লক ভর এবং বেগের সমস্ত ক্ষেত্রে পরিচালনা করবে।
টেসেরেক্স

3
আপনি যদি সুনির্দিষ্ট 'কার্টুন পদার্থবিজ্ঞান' প্রভাব না অর্জন করেন তবে আপনি আরও বাস্তববাদী সিস্টেমের সাথে চলে যাওয়া প্রায়শই একটি ভাল ধারণা; আপনি সম্ভাব্য ইঞ্জিন ব্রেকিং প্রান্তের মামলাগুলি পাবেন না তা নিশ্চিত করার জন্য আরও কয়েকটি ভাল উপায় রয়েছে are
স্টিভেন স্টাডনিকি

1
এই উত্তরটি ভাল ছিল, আমি জানি। তবে আমার খেলাটি একটি কার্টুন বিশ্বে সেট করা আছে এবং এটি বাস্তবসম্মত হওয়ার দরকার নেই। প্রশ্ন জিজ্ঞাসা করার সময় আমার আরও নির্দিষ্ট হওয়া উচিত been
আফরা

1
এটি একটি সম্প্রদায় প্রকল্প, লোকেরা এখানে প্রশ্নের উত্তর দিতে এবং জিজ্ঞাসিত প্রশ্নের উত্তর দেওয়ার জন্য, এটি সেরা উত্তর। আপনি কেবল আপনার বিশেষ ক্ষেত্রে হ্যাকি সমাধানটিকে পছন্দ করেন বলে এই উত্তরটি সর্বোত্তম উত্তর নয়। সমাধান হিসাবে হ্যাকি উত্তরটি নির্বাচন করে, যখন অন্য কেউ এই ধরণের প্রশ্নের উত্তরের জন্য সাইট অনুসন্ধান করবে, তারা ধরে নেবে যে অ-বাস্তবসম্মত উত্তরটিই এর চেয়ে উত্তম।
রিচার্ড ফ্যাবিয়ান

1
@ রিচার্ড অন্য সমাধানটি হ্যাকি নয় কেবল কারণ এটি বাস্তববাদী পদার্থবিজ্ঞান ব্যবহার করে না, ব্লকগুলি সহজেই পড়ে না বলে টেট্রিস হ্যাকি কি? লোকেরা যদি গ্রহণযোগ্য উত্তরটিকে 'উত্তম' বলে মনে করে পরিবর্তে এটি উত্তরটি যা প্রশ্নকারীকে সন্তুষ্ট করে, তবে এটি তাদের দোষ। সমস্ত উত্তর এবং ভোট এখনও স্পষ্ট।
সিসকোআইপিফোন 26'11

2

আপনি কোন ধরণের রেঞ্জ চান তা বলতে আসলেই আপনি পর্যাপ্ত তথ্য দেননি, যেমন এটি আবদ্ধ কিনা, আপনি জ্যামিতিক অগ্রগতি চান কিনা ইত্যাদি tell

প্রথম কাজটি আপনি করতে চান তা আপনি যে গতিটি হারাতে চান তার সাথে আনুপাতিক একটি সংখ্যা অর্জন করা (এটির মতো হবে না, তবে এটি আপনার ক্ষতির সাথে আনুপাতিক করতে গতি বাড়ার সাথে সাথে এটি হ্রাস করা উচিত)। এটি করার মানক উপায় হ'ল পরস্পর গ্রহণ করা :

temp = 1 / currentVelocity;

এখন, 100 এর জন্য আপনার 0.01 থাকবে, 200 এর জন্য আপনার 0.005 থাকবে, 300 এর জন্য আপনার কাছে 0.0033 থাকবে।

এখন আপনাকে কেবল সেই সংখ্যাটি গুণের মাধ্যমে সত্যই যা কিছু করতে চান তার সাথে সামঞ্জস্য করতে হবে। সুতরাং

k = 3000;
newVelocity = temp * k;

আপনাকে আপনার ২০ টি 300 এর বিনিময়ে দেবে, তবে এটি আপনাকে 10 এর পরিবর্তে 200 এর জন্য 15 দেবে This এটি আপনার পক্ষে উপযুক্ত হতে পারে, সেক্ষেত্রে আপনাকে আরও পড়ার দরকার নেই। আপনি নিজের পছন্দ অনুযায়ী কে সামঞ্জস্য করতে পারেন তবে আপনি যদি আরও কিছু না করেন যেমন আপনি জ্যামিতিক অগ্রগতি বাস্তবায়ন না করে বা বৃদ্ধির ভিত্তি পরিবর্তন না করেন তবে আপনি তাদের পছন্দ মতো সংখ্যাগুলি পেতে পারেন না। আমি এখানে জ্যামিতিক অগ্রগতিতে যাচ্ছি না, তবে আপনি যদি বেসটি পরিবর্তন করতে চান তবে আপনি এটি নীচে করুন:

base = 100;
temp = 1 / (currentVelocity - base);
if (temp < 0) temp = 0; //adjust temp so never less than zero, cannot gain force!

k = 2000;
velocityLoss= temp * k;
if (velocityLoss > currentVelocity) //(1) or make currentVelocity an unsigned int
    velocityLoss = currentVelocity; //(2)

এটি আপনাকে আপনার প্রশ্নে মূলত যে পরিসরটি চেয়েছিল, সেই পরিমাণ সরবরাহ করবে, ২০০ -> 10, 200 -> লোকসান 20. এফওয়াইআই 100 -> 40 এর ক্ষতি এবং 50 -> 80 এর ক্ষতি (!) যার অর্থ আপনি আপনার বিয়োগফলকে সীমাবদ্ধ করা দরকার - এটি আমি লাইনগুলিতে (1) এবং (2) করেছি।

এই পুরো সমস্যাটির কাছে যাওয়ার অন্যান্য উপায় রয়েছে, অবশ্যই, আমি নিশ্চিত যে আমার চেয়ে গণিতগুলি আরও দক্ষ, তারা এখানে পোস্ট করবে।


0

আমি মনে করি, আপনি বেগ দিয়ে কেবল সাধারণ বিভাগটি ব্যবহার করতে পারেন। উদাহরণস্বরূপ: হারানো = 3 000 / myVelocity ity যখন বেগ 300 হয়, আপনি 10 হারাবেন, যখন এটি 200 হবে, আপনি 15 হারাবেন correct সঠিক ধ্রুবকগুলি বেছে নেওয়া আপনার পক্ষে up

আপনি যদি চান তবে আপনি আরও জটিল সূত্র ব্যবহার করতে পারেন, যেমন: ধ্রুবক / (ধ্রুবক 2 * বেগ ^ 2 + ধ্রুবক 3 * বেগ)। আবার - কেবল ধ্রুবকগুলি বেছে নিন, যা আপনার পক্ষে উপযুক্ত হবে।


তিনি যা চেয়েছিলেন এবং রিয়েল ফিজিক্সে কী ঘটে তার সম্পূর্ণ বিপরীত।
Ali1S232

আমি আপনাকে বুঝতে পারি না। বিপরীত কি?
জাকারমার্জ

আমার ধারণা আমি আপনাকে ভুল উত্তর দিয়েছি, আমার খারাপ।
Ali1S232
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.