การนำระบบเกียร์มาใช้ในเกมรถยนต์


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
        }
    }
}

อย่างไรก็ตามการใช้งานนี้ไม่ได้ผลจริงๆ เกียร์แรกทำงานได้ดี แต่การเปลี่ยนเกียร์ต่อไปนี้ทำให้ความเร็วลดลง เมื่อเพิ่มข้อความดีบั๊กฉันจะได้รับค่าความเร็วเหล่านี้เมื่อเปลี่ยนที่ จำกัด 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
ผมนึกถึงนี้กวดวิชาที่ดีเยี่ยมในเชิงลึก: รถฟิสิกส์สำหรับเกม ประมาณหนึ่งในสามในบทความเริ่มพูดถึงการส่งกำลังของเครื่องยนต์
Eric

คำตอบ:


17

คำนวณ RPM ใหม่ตามเกียร์ใหม่และความเร็วปัจจุบันของรถ

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)ตามที่คุณต้องการ จำกัด เช่นเดียวกับในรถยนต์สิ่งนี้น่าจะส่งผลให้สูญเสียความเร็วอย่างกะทันหัน


29

นี่เป็นเพราะไม่มีความเฉื่อยในการคำนวณความเร็วของคุณ คุณเพียงแค่คำนวณว่าเป็นผลมาจากการรอบต่อนาทีของเครื่องยนต์และเกียร์ แต่เมื่อคุณคำนวณรอบต่อนาทีใหม่หลังจากเปลี่ยนเกียร์คุณจะลดระดับสังเกตุด้วยการแก้ไข 3600 รอบต่อนาที

นี่คือความผิดพลาดของคุณ การลดลงของรอบต่อนาทีไม่ได้รับการแก้ไขระหว่างเกียร์ คุณสามารถแก้ไขได้โดยกำหนดให้อาเรย์ที่สองเก็บจำนวนรอบต่อนาทีที่แน่นอนระหว่างแต่ละเกียร์

วิธีที่สองที่คุณสามารถแก้ไขได้คือโดยใช้การคำนวณทางกายภาพ คุณกำลังจำลองสถานการณ์ดังนั้นคุณสามารถทำการรวมเชิงตัวเลขได้ การใช้เวลา, dtและการรวมออยเลอร์หรือการรวม Verlet ฟังดูซับซ้อนด้วยชื่อและทั้งหมด แต่จริงๆแล้วไม่ใช่

โดยทั่วไปจะหมายความว่าคุณสร้างตารางการค้นหาสำหรับแรงบิดเครื่องยนต์ที่ rpms ที่กำหนด จากนั้นคุณจะคำนึงถึงความต้านทานอากาศที่เพิ่มขึ้นด้วยกำลังสองของความเร็ว f=m aจากนั้นจำลองจะคำนวณความเร็วถัดไปโดยการย้อนกลับของนิวตันกฎหมายสอง
เพื่อหาข้อมูลแล้วบูรณาการออยเลอร์:a=f/m คือประมาณ 1200 (น้ำหนักรถทั่วไป) คือแรงที่เกิดจากแรงบิดของเครื่องยนต์ลดลงในกระปุกเกียร์จากนั้นแปลงเป็นแรงโดยใช้สูตรคานโดยพิจารณาจากรัศมีของล้อ (โดยทั่วไปแล้วเวกเตอร์ครอสโปรดัค แต่สามารถทำให้ง่ายขึ้นโดยการคูณแรงบิดด้วยรัศมีเนื่องจากนิวตัน / เมตรคูณเมตร = นิวตัน)speed=speed+a*dtmf

ด้วยวิธีนี้รอบต่อนาทีของเครื่องยนต์จะถูกคำนวณย้อนหลังเป็นฟังก์ชั่นของความเร็วของรถเชิงเส้น


2
exact number of RPM drop between each gearไม่มี มันเป็นอัตราส่วนเนื่องจาก @Baldrickk ชี้ให้เห็น และในขณะที่มันเป็นความคิดที่ดีที่จะให้การส่งสัญญาณเป็นแรงบิดมากกว่าความเร็วการอภิปรายเกี่ยวกับการต้านทานลมและการรวม verlet นั้นอยู่นอกขอบเขตของคำถามไม่ใช่หรือ?
Justin

ใช่. สำหรับจุดในการตอบคำถามฉันจะแนะนำคำตอบของ Baldrickk ฉันยกมันขึ้นมา
v.oddou

5

Gearsถูกใช้เป็นกลไกการลด

การใช้การส่งข้อมูลที่ง่ายขึ้นมีเพียงสองอัตราส่วนในกระปุกเกียร์หนึ่งเกียร์อินพุท (เครื่องยนต์) และหนึ่งเกียร์ออก (หนึ่งในอัตราส่วนของกระปุกเกียร์) เรามีอัตราส่วนลดต่างกันสองแบบ

ดังนั้นสำหรับเกียร์อินพุทที่มีฟัน x และเฟืองเอาท์พุทของ x / 2 ฟันความเร็วของเฟืองออกจะเป็นสองเท่าของเกียร์อินพุท (อัตราส่วนสองต่อหนึ่ง)

rpm2 = rpm1 * gearRatio

ที่อยู่:

gearRatio = teeth1 / teeth2

ดังนั้นแทนที่จะ จำกัด แต่ละเกียร์ด้วยความเร็วฮาร์ดโค้ดเราสามารถ จำกัด มันตามอัตราส่วน จากนั้นคุณสามารถคำนวณความเร็วสำหรับคู่ (rpmEngine, gear) ที่เฉพาะเจาะจงและเมื่อเปลี่ยนเกียร์แล้วให้คำนวณความเร็วของเครื่องยนต์ตามความเร็วที่ทราบและคู่ใหม่

หากต้องการทำให้ง่ายขึ้นให้ใช้เพียงเครื่องยนต์ที่เชื่อมต่อกับสองเกียร์

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 แล้ว 10,000 เป็นความเร็วดังนั้นการเสียบในสูตรเดียวกันตอนนี้เรามี:

vehicleSpeed = 10000 #computed above
selectedGear = 2

ดังนั้นรอบต่อนาทีใหม่ของเรา:

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

10,000 ซึ่งจะลดลงอีกด้วยค่าที่แตกต่างกัน (ซึ่งสามารถสรุปได้ว่าเป็นเพียงอุปกรณ์อื่นมองขึ้นมาถ้าต้องการขอโทษสามารถโพสต์ jut สองลิงก์) แล้วตามขนาดล้อเพื่อคำนวณความเร็วพื้นดินเป็นกิโลเมตรหรือไมล์ต่อชั่วโมง .

คุณจะต้องคำนึงถึงความจริงที่ว่าการเปลี่ยนเกียร์ต่ำทำให้เครื่องยนต์รอบต่อนาทีสูงขึ้นดังนั้นวิธีการง่ายๆคือการตรวจสอบmaxRPMและ จำกัด รอบต่อนาทีหลังจากเปลี่ยนเป็นรอบต่อนาทีสูงสุดของคุณซึ่งจะช่วยลดความเร็วของยานพาหนะ

ดังนั้นทุกครั้งที่มีการเปลี่ยนเกียร์คุณคำนวณ engineRPM จากความเร็วรถ จำกัด โดย maxRPM แล้วกลับไปที่ "ปกติ" ที่คุณอัปเดตรอบต่อนาทีจากอินพุตผู้ใช้และคำนวณความเร็วตามนั้น

สำหรับการจำลองที่เหมือนจริงคุณต้องคำนึงถึงแรงบิดของเครื่องยนต์อย่างน้อย (คำตอบ v.oddou) และคลัตช์เลื่อนซึ่งรวมกันจะมีเอฟเฟกต์เหล่านี้: - เมื่อขยับขึ้นสมมติว่าการเปลี่ยนนั้นเร็วพอที่รอบเครื่องยนต์ไม่ตก ความเร็วจะเพิ่มขึ้นในขณะที่รอบต่อนาทีของเครื่องยนต์ลดลงจนกว่าพวกเขาจะมีความสมดุล - เมื่อขยับลงความเร็วของยานพาหนะจะลดลงจนกว่าเครื่องยนต์จะถูกยกขึ้นเป็นรอบต่อนาทีใหม่ แต่อาจจะเกินการใช้งาน "ง่าย"


4

โปรดทราบว่าการส่งด้วยตนเองแบบมีส่วนร่วมเป็นอุปกรณ์สองทาง เครื่องยนต์สามารถเร่งยานพาหนะได้เช่นเดียวกับยานพาหนะ (โดยเฉพาะแรงขับของมัน) สามารถเร่งเครื่องยนต์ได้

นี่เป็นปัญหาที่แท้จริงในการส่งสัญญาณด้วยตนเองในช่วงต้น ทันใดนั้นการเปลี่ยนเกียร์จะทำให้เครื่องยนต์หมุนเป็นรอบต่อนาทีที่สูงขึ้นทำให้วงจรการจุดระเบิดไม่ตรงกันและอาจทำให้เครื่องยนต์หยุดทำงาน นี่คือการชดเชยโดยการขับขี่ผู้เชี่ยวชาญที่คนขับต้องหมุนเครื่องยนต์ให้มีความเร็วที่ถูกต้องก่อนที่จะปล่อยคลัตช์เพื่อส่งสัญญาณ

จนกระทั่งจนกระทั่งมีการพัฒนาซินโครเมช เป็นกลไกที่ป้องกันไม่ให้การส่งข้อมูลมีส่วนร่วมจนกว่าความเร็วอินพุตและเอาต์พุตจะซิงค์กัน

ดังนั้นสิ่งที่ฉันแนะนำคือคุณจำลองซินโครเมชและไม่ทำการส่งสัญญาณจนกว่าเครื่องยนต์รอบต่อนาทีและความเร็วรถจะเท่ากันกับระดับปัจจุบัน


2

คำตอบที่มีอยู่ดูเหมือนจะซับซ้อนเกินไป สำหรับเกม RPM เป็นเพียงตัวบ่งชี้บนหน้าจอ ความเร็วที่แท้จริงคือตัวแปรที่แท้จริง อัตราทดเกียร์จะเป็นตัวกำหนดว่าคุณจะแปลงความเร็วรอบเครื่องยนต์เป็น RPM ได้อย่างไร การเปลี่ยนเกียร์จะเปลี่ยนอัตราส่วน แต่ไม่ใช่ความเร็ว เห็นได้ชัดว่า RPM นั้นเปลี่ยนไปเช่นกันกับอัตราการหมุนของเกียร์

Overrevving (การลดระดับลงเกินขีด จำกัด 8500 RPM ของคุณ) เป็นสิ่งที่คุณต้องทำแยกต่างหาก แต่มันเป็นสิ่งที่ไม่ดีในรถยนต์และคุณสามารถปล่อยให้มันเป็นสิ่งที่ไม่ดีในเกมของคุณ


2
คำตอบที่มีอยู่คือสิ่งที่เกมส่วนใหญ่ที่ฉันเคยเห็นแม้แต่เกมอาร์เคดธรรมดา ๆ เพราะมันไม่ซับซ้อน RPM บนหน้าจออาจเป็นตัวเลข แต่วิธีการนั้นให้ทั้งจำนวน (ซึ่งคุณสามารถปรับแต่งสำหรับตัวบ่งชี้ที่มองเห็นได้) และพฤติกรรมเพื่อให้ตรงกับตัวเลขเหล่านั้น
Selali Adobor

2

ดังที่คนอื่น ๆ ได้กล่าวถึงความเร็วของยานพาหนะควรเป็นค่าจริงและควรได้รับ RPM จากนั้น การยกเครื่องควรทำให้ความเร็วในการหมุนของเครื่องยนต์ลดลงเนื่องจากอัตราส่วนของ RPM ต่อกิโลเมตร / ชั่วโมงจะเปลี่ยนเป็น "ทันที" แต่ความเร็วรถจะไม่เปลี่ยนแปลง

ฉันขอแนะนำให้ แต่แรงบิดของเครื่องยนต์นั้นควรเพิ่มขึ้นด้วย RPM จนถึงขีด จำกัด และลดลงเกินกว่านั้น อัตราที่ยานพาหนะเร่งควรเป็นสัดส่วนกับแรงบิดหารด้วยอัตราส่วนเกียร์ลบด้วยการลากอากาศซึ่งเป็นสัดส่วนกับกำลังสองของความเร็ว หากเกียร์ติดต่อกันมีอัตราส่วน 1: 41: 1 การเปลี่ยนเกียร์ที่ดีที่สุดสำหรับการเร่งจะเกิดขึ้น ณ จุดที่แรงบิดในเกียร์ล่างลดลงถึงประมาณ 70% ของสิ่งที่มันจะอยู่ในเกียร์ถัดไปที่สูงขึ้น


2

สร้างบน @ v.oddou โดยใช้

max(maxRPM, calc)

จะทำให้ RPMS สูงสุดออกทันทีเมื่อมีการเปลี่ยนเกียร์ไม่อนุญาตให้มีการเปลี่ยนเกียร์จากเกียร์หนึ่งไปอีกเกียร์หนึ่ง วิธีที่เหมาะสมคือการแก้ปัญหาสำหรับ RPM โดยใช้ตัวแปรความเร็วเป็นสมการ

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

แก้ปัญหารอบต่อนาที

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

เนื่องจากเกียร์ 1 สูงกว่าที่เคยเป็นมาก่อน RPM จะต่ำกว่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.