একটি গাড়ী গেম সংক্রমণ বাস্তবায়ন


23

আমি ম্যানুয়াল গিয়ার পরিবর্তনগুলি সহ একটি সাধারণ গাড়ি গেম তৈরি করার চেষ্টা করছি। তবে গিয়ার পরিবর্তনগুলি প্রয়োগ করতে আমার কিছুটা সমস্যা হচ্ছে।

"গাড়ী" এর জন্য আমার বর্তমান কোডটি এখানে:

int gear = 1; // Current gear, initially the 1st
int gearCount = 5; // Total no. of gears

int speed = 0; // Speed (km/h), initially 0
int[] maxSpeedsPerGear = new int[]
{
    40,  // First gear max. speed at max. RPM
    70,  // Second gear max. speed at max. RPM
    100, // and so on
    130,
    170
}

int rpm = 0; // Current engine RPM
int maxRPM = 8500; // Max. RPM

public void update(float dt)
{
    if(rpm < maxRPM)
    {
        rpm += 65 / gear; // The higher the gear, the slower the RPM increases
    }

    speed = (int) ((float)rpm / (float)maxRPM) * (float)maxSpeedsPerGear[gear - 1]);

    if(isKeyPressed(Keys.SPACE))
    {
        if(gear < gearCount)
        {
            gear++; // Change the gear
            rpm -= 3600; // Drop the RPM by a fixed amount
            if(rpm < 1500) rpm = 1500; // Just a silly "lower limit" for RPM
        }
    }
}

তবে, এই বাস্তবায়ন আসলে কাজ করে না। প্রথম গিয়ারটি সূক্ষ্মভাবে কাজ করে, তবে নিম্নলিখিত গিয়ার পরিবর্তনগুলি গতি হ্রাসের কারণ হয়। কিছু ডিবাগিং বার্তা যুক্ত করে, আরপিএম সীমাতে পরিবর্তন করার সময় আমি এই গতির মানগুলি পাই:

Speed at gear 1 before change: 40
Speed after changing from gear 1 to gear 2: 41

Speed at gear 2 before change: 70
Speed after changing from gear 2 to gear 3: 59

Speed at gear 3 before change: 100
Speed after changing from gear 3 to gear 4: 76

Speed at gear 4 before change: 130
Speed after changing from gear 4 to gear 5: 100

আপনি দেখতে পাচ্ছেন, পরিবর্তনের আগে প্রতিটি পরিবর্তনের পরে গতি ধীর হয়। গিয়ার পরিবর্তন করার আগে আপনি গতিটিকে কীভাবে বিবেচনা করবেন যাতে গিয়ারগুলি পরিবর্তন করার সময় গতিটি নামবে না?


1
আমি এই দুর্দান্ত গভীর-টিউটোরিয়ালটি স্মরণ করিয়ে দিচ্ছি: গেমসের জন্য কার ফিজিক্স । নিবন্ধের প্রায় এক তৃতীয়াংশ ইঞ্জিন ফোর্স ট্রান্সমিশন সম্পর্কে কথা বলা শুরু করে।
এরিক

উত্তর:


17

গাড়ির নতুন গিয়ার এবং বর্তমান গতির উপর ভিত্তি করে নতুন আরপিএম গণনা করুন।

speed = (int) ((float)rpm / (float)maxRPM) * (float)maxSpeedsPerGear[gear - 1]);

সুতরাং: পরিবর্তে:

rpm -= 3600; // Drop the RPM by a fixed amount

ব্যবহার করুন:

rpm = max(maxRPM,(float)maxRPM * (float)speed / (float)maxSpeedsPerGear[gear - 1]);

গিয়ার পরিবর্তনের আগে এবং পরে গতিটি এখন একই রকম হবে এবং আপনি সেখান থেকে বিস্তৃত / হ্রাস করতে পারেন।

সম্পাদনা: max(maxRPM, calc)আপনি এটি সীমাবদ্ধ করতে চাইলে যুক্ত হয়েছে। গাড়ীর মতো এটিরও দ্রুত গতি হ্রাস পেতে হবে loss


29

এটি কারণ আপনার গতির গণনায় কোনও জড়তা নেই। আপনি কেবল এটি ইঞ্জিন আরপিএম এবং গিয়ারের পরম ফলাফল হিসাবে গণনা করুন। তবে আপনি যখন গিয়ার শিফট আপের পরে নতুন আরপিএম গণনা করেন, আপনি যথাযথভাবে 3600 আরপিএম পদক্ষেপের মাধ্যমে এটি কমিয়ে আনেন।

এটি আপনার ভুল আরপিএম ড্রপডাউন গিয়ারগুলির মধ্যে স্থির নয়। আপনি প্রতিটি গিয়ারের মধ্যে আরপিএম ড্রপের সঠিক সংখ্যা সংরক্ষণ করে দ্বিতীয় অ্যারে তৈরি করে এটি ঠিক করতে পারেন।

দ্বিতীয়ভাবে আপনি এটি ঠিক করতে পারেন, এটি শারীরিক ভিত্তিক গণনা ব্যবহার করে। আপনি একটি সিমুলেশন করছেন, যাতে আপনি সংখ্যার একীকরণ করতে পারেন। সময়, dtএবং ইউলার একীকরণ বা ভারলেট ইন্টিগ্রেশন ব্যবহার করে । এটি নামগুলির সাথে জটিল শোনায় এবং আসলে তবে তা নয়।

মূলত এর অর্থ হ'ল আপনি প্রদত্ত আরপিএমগুলিতে ইঞ্জিন টর্ক জন্য একটি সারণী তৈরি করেন। তারপরে আপনি গতির বর্গক্ষেত্রের সাথে বাড়তি কিছু বায়ু প্রতিরোধের বিষয়টি বিবেচনা করবেন। তারপরে সিমুলেশন নিউটনের দ্বিতীয় আইনটিকে বিপরীত করে পরবর্তী গতি গণনা করবে f=m a
জন্য a=f/m, তারপর ইউলার ইন্টিগ্রেশন: speed=speed+a*dt। এর mপ্রায় 1200 (সাধারণ গাড়ির ওজন)। fইঞ্জিন টর্ক থেকে উদ্ভূত বলটি, গিয়ারবক্সে হ্রাস এবং চক্রের ব্যাসার্ধ বিবেচনা করে লিভার সূত্র ব্যবহার করে জোর করে রূপান্তরিত। (একটি ভেক্টর ক্রস পণ্য সাধারণত, তবে ব্যাসার্ধের সাথে টর্ককে গুণিত করে সরল করা যায় because কারণ নেটউটন / মিটার গুণিত মিটার = নিউটন

এই ভাবে, লিনিয়ার গাড়ির গতির একটি কার্য হিসাবে ইঞ্জিনের আরপিএম পিছন দিকে গণনা করা হয়।


2
নেই exact number of RPM drop between each gear। এটি একটি অনুপাত, যেমন @ বালড্রিক এটাকে নির্দেশ করে। এবং গতির চেয়ে সঞ্চালনের আউটপুটটি টর্কযুক্ত হওয়া একটি দুর্দান্ত ধারণা, বায়ু প্রতিরোধের এবং ভারলেট ইন্টিগ্রেশন সম্পর্কিত আলোচনা প্রশ্নের ক্ষেত্রের বাইরে কিছুটা নয়, না?
জাস্টিন 12

হ্যাঁ। প্রশ্নের উত্তরের জায়গাগুলির জন্য আমি বাল্ড্রিকের উত্তরটি সুপারিশ করব। আমি এটি upvated।
v.oddou

5

গিয়ারগুলি হ্রাস প্রক্রিয়া হিসাবে ব্যবহৃত হয়।

গিয়ারবক্সে মাত্র দুটি অনুপাত সহ একটি সরলীকৃত সংক্রমণ ব্যবহার করে একটি ইনপুট গিয়ার (ইঞ্জিন) এবং একটি আউটপুট গিয়ার (গিয়ারবক্সের একটি অনুপাত) আমাদের দুটি আলাদা হ্রাস অনুপাত রয়েছে।

সুতরাং এক্স দাঁতযুক্ত এক্সপুট গিয়ার এবং এক্স / 2 দাঁতের আউটপুট গিয়ারের জন্য, আউটপুট গিয়ারের গতি ইনপুট গিয়ারের দ্বিগুণ (দুই থেকে এক অনুপাত)

rpm2 = rpm1 * gearRatio

কোথায়:

gearRatio = teeth1 / teeth2

সুতরাং হার্ডকডযুক্ত গতি দ্বারা প্রতিটি গিয়ার সীমাবদ্ধ না করে, আমরা অনুপাতের দ্বারা এটি সীমাবদ্ধ করতে পারি। তারপরে আপনি নির্দিষ্ট (আরপিএমইঙ্গাইন, গিয়ার) জোড়ার জন্য গতি গণনা করতে পারেন এবং যখন গিয়ারটি পরিবর্তন করা হয় তখন জানা গতি এবং একটি নতুন জুটি দেওয়া ইঞ্জিনের গতি গণনা করুন।

সরল করার জন্য, দুটি গিয়ারের সাথে যুক্ত কেবল একটি ইঞ্জিন ব্যবহার করে:

rpmEngine = 5000

gearRatio[1] = 2 #low gear:  one rotation of the engine results in 2 rotations output
gearRatio[2] = 3 #high gear: one rotation of the engine results in 3 rotations output

vehicleSpeed = rpmEngine * gearRatio[selectedGear]

তাই:

selectedGear = 1
vehicleSpeed = rpmEngine * gearRatio[selectedGear] #5000 * 2 = 10000 

2 য় গিয়ারে স্থানান্তরিত করার সময়, 10000 গতি হয়, সুতরাং একই সূত্রটিতে প্লাগ করে, আমাদের এখন:

vehicleSpeed = 10000 #computed above
selectedGear = 2

এইভাবে আমাদের নতুন আরপিএম:

rpmEngine = vehicleSpeed / gearRatio[selectedGear] #10000 / 3 = 3333.3

এটি 10000 এর পরে আরও একটি ডিফারেনশিয়াল দ্বারা হ্রাস পাবে (যা কেবল অন্য গিয়ার হিসাবে বিমূর্ত করা যেতে পারে, প্রয়োজন হলে এটি সন্ধান করুন, দুঃখিত, দু'টি লিঙ্ক পোস্ট করতে পারেন) এবং তারপরে চক্রের আকার দ্বারা প্রতি ঘণ্টায় কিলোমিটার বা মাইল দূরে স্থল গতি গণনা করতে হবে ।

আপনাকে এই বিষয়টি বিবেচনায় নিতে হবে যে নিম্ন গিয়ারে স্থানান্তর করা ইঞ্জিন আরপিএমকে বাড়িয়ে তোলে, তাই একটি সহজ পদ্ধতির মাধ্যমে সর্বোচ্চআরপিএম পরীক্ষা করা এবং আপনার সর্বোচ্চ আরপিএম-এ স্থানান্তরিত হওয়ার পরে আরপিএম সীমাবদ্ধ করা যায়, এইভাবে গাড়ির গতি কমে যায়।

সুতরাং মূলত, প্রতিবার যখন একটি গিয়ার শিফট ঘটে তখন আপনি গাড়ির গতি থেকে ইঞ্জিনআরপিএম গুনবেন, এটি সর্বোচ্চআরপিএম দ্বারা সীমাবদ্ধ করুন এবং তারপরে "সাধারণ" এ ফিরে আসুন যেখানে আপনি ইউজার ইনপুট থেকে আরপিএম আপডেট করেন এবং তার ভিত্তিতে গণনা গতি।

বাস্তবসম্মত সিমুলেশনের জন্য, আপনাকে কমপক্ষে ইঞ্জিন টর্ক (v.oddou এর উত্তর) এবং ক্লাচ স্লিপেজ বিবেচনা করতে হবে, যা মিলিত হওয়ার ফলে এই প্রভাবগুলি হবে: - স্থানান্তরিত করার সময়, শিফটটি যথেষ্ট দ্রুত গতিতে ধরে নিবেন যে ইঞ্জিন আরপিএম পড়ে না , ইঞ্জিন আরপিএম কমিয়ে আনা অবধি গতি বাড়াতে হবে যতক্ষণ না সেগুলি ভারসাম্যহীন হয় - নীচে নামার সময়, ইঞ্জিনটি নতুন আরপিএম পর্যন্ত উঠানো না হওয়া পর্যন্ত গাড়ির গতি কমিয়ে দেওয়া হবে তবে এটি সম্ভবত "সাধারণ" বাস্তবায়নের বাইরে চলে যায়।


4

মনে রাখবেন যে একটি নিযুক্ত ম্যানুয়াল ট্রান্সমিশন একটি দ্বি-মুখী ডিভাইস। ইঞ্জিন যেমন গাড়িটিকে আরও ত্বরান্বিত করতে পারে ঠিক তেমনি যানটি (আরও নির্দিষ্টভাবে এর গতিবেগ) ইঞ্জিনকে ত্বরান্বিত করতে পারে।

প্রথম দিকের ম্যানুয়াল সংক্রমণে এটি একটি আসল সমস্যা ছিল। ডাউনশিফিং হঠাৎ করে ইঞ্জিনটিকে একটি উচ্চতর আরপিএমের কাছে লাথি মারবে, ইগনিশন চক্রটিকে সিঙ্কের বাইরে ফেলেছিল এবং সম্ভবত ইঞ্জিনটি থামিয়ে দেবে। এটি বিশেষজ্ঞ ড্রাইভিং দ্বারা অফসেট হয়েছিল যেখানে সংক্রমণে নিযুক্ত হওয়ার জন্য ড্রাইভারটিকে ক্লাচ ছেড়ে দেওয়ার আগে ইঞ্জিনটিকে সঠিক গতিতে নিয়ে যেতে হয়েছিল।

সিনক্রোমশ তৈরি হওয়ার আগ পর্যন্ত এটি ছিল। এটি এমন একটি প্রক্রিয়া যা ইনপুট এবং আউটপুট গতি সিঙ্ক না হওয়া পর্যন্ত সংক্রমণকে নিযুক্ত করা থেকে আটকা দেয়।

সুতরাং, আমি যা পরামর্শ দিচ্ছি তা হল আপনি সিঙ্ক্রোমশটি অনুকরণ করুন এবং ইঞ্জিন আরপিএম এবং গাড়ির গতি তাদের বর্তমান স্তরের সাথে মিলিত না হওয়া পর্যন্ত সংক্রমণকে নিযুক্ত করবেন না।


2

বিদ্যমান উত্তরটি অনেক জটিল বলে মনে হচ্ছে। একটি গেমের জন্য, আরপিএম স্ক্রিনে কেবল একটি সূচক। আসল গতি হল আসল পরিবর্তনশীল। গিয়ার অনুপাত নির্ধারণ করে যে আপনি কীভাবে ইঞ্জিনের গতি আরপিএম-তে রূপান্তর করবেন। গিয়ার পরিবর্তন করা অনুপাত পরিবর্তন করে, কিন্তু গতি নয়। স্পষ্টতই, আরপিএম গিয়ার অনুপাতের বিপরীত হিসাবেও পরিবর্তন করে।

ওভাররেভিভিং (আপনার 8500 আরপিএম সীমা ছাড়িয়ে যাওয়া) এমন একটি জিনিস যা আপনি পৃথকভাবে প্রয়োগ করতেন তবে এটি গাড়িগুলির মধ্যে একটি খারাপ জিনিস এবং আপনি এটি আপনার গেমের খারাপ জিনিস হতে পারেন।


2
বিদ্যমান উত্তরটি হ'ল বেশিরভাগ গেমগুলি আমি যা দেখেছি ঠিক তা-ই, এমনকি সহজ তোরণ গেমস, কারণ এটি আসলে এত জটিল নয়। স্ক্রিনে আরপিএম কেবল একটি সংখ্যক হতে পারে, তবে সেই পদ্ধতির সাহায্যে আপনি উভয় সংখ্যাটি (যা আপনি যেভাবেই ভিজ্যুয়াল সূচকগুলির জন্য চিহ্নিত করতে পারেন) এবং সেই সংখ্যার সাথে মেলে এমন আচরণ
সেলাালী অ্যাডোবার ২

2

অন্যরা যেমন বলেছে, গাড়ির গতিটি আসল মূল্য হওয়া উচিত এবং আরপিএম থেকে এটি নেওয়া উচিত। আপশিফিংয়ের ফলে ইঞ্জিনের আবর্তনশীল গতি হ্রাস হওয়া উচিত কারণ প্রতি কিমি / ঘন্টা প্রতি আরপিএম অনুপাত "তাত্ক্ষণিকভাবে" পরিবর্তিত হবে তবে গাড়ির গতি তা হবেনা।

তবে আমি পরামর্শ দেব যে ইঞ্জিন টর্কটি একটি নির্দিষ্ট সীমা পর্যন্ত আরপিএমের সাথে বাড়তে হবে এবং এর বাইরে চলে যেতে পারে। যে হারে কোনও যানবাহন ত্বরান্বিত করে তা গিয়ার অনুপাতের সাথে বিভক্ত টর্কের সাথে আনুপাতিক হওয়া উচিত, বিয়োগ বায়ু টান যা গতির বর্গক্ষেত্রের সমানুপাতিক। যদি ক্রমাগত গিয়ারগুলির মধ্যে 1: 41: 1 অনুপাত থাকে, তবে ত্বরণের জন্য অনুকূল স্থানান্তরটি এমন পর্যায়ে ঘটবে যেখানে নিম্ন গিয়ারের টর্কটি পরবর্তী উচ্চতর গিয়ারের প্রায় 70% নেমে এসেছিল।


2

ব্যবহার করে @ v.oddou এ বিল্ডিং

max(maxRPM, calc)

গিয়ারগুলি গিয়ারে স্থানান্তরিত করার সাথে সাথে আরপিএমএস তাত্ক্ষণিকভাবে সর্বাধিক আউট হয়ে যায়, গিয়ার থেকে গিয়ারে কোনও মসৃণ রূপান্তর না দেয়। সঠিক উপায় হ'ল আরপিএমের গতির পরিবর্তনশীলকে সমীকরণ হিসাবে ব্যবহার করা সমাধান করা।

speed = (int) ((float)rpm / (float)maxRPM) * (float)maxSpeedsPerGear[gear - 1]);

আরপিএমের জন্য সমাধান করুন

rpm = (maxRPM * speed) / maxSpeedsPerGear[gear - 1] ;

যেহেতু গিয়ারটি আগের চেয়ে 1 উচ্চতর, আরপিএম এর কম হবে।

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