Truyền tải thực hiện trong một trò chơi xe hơi


23

Tôi đang cố gắng tạo ra một trò chơi xe hơi đơn giản với thay đổi thiết bị bằng tay. Tuy nhiên, tôi có một chút rắc rối khi thực hiện thay đổi thiết bị.

Đây là mã hiện tại của tôi cho "xe hơi":

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

Tuy nhiên, việc thực hiện này không thực sự hiệu quả. Thiết bị đầu tiên hoạt động tốt, nhưng các thiết bị sau thay đổi gây ra giảm tốc độ. Bằng cách thêm một số thông báo gỡ lỗi, tôi nhận được các giá trị tốc độ này khi thay đổi ở giới hạn 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

Như bạn có thể thấy, tốc độ sau mỗi thay đổi chậm hơn trước khi thay đổi. Làm thế nào bạn sẽ xem xét tốc độ trước khi thay đổi bánh răng để tốc độ sẽ không giảm khi thay đổi bánh răng?


1
Tôi nhớ về hướng dẫn chuyên sâu tuyệt vời này: Vật lý xe hơi cho các trò chơi . Khoảng một phần ba trong bài viết bắt đầu nói về việc truyền lực động cơ.
Eric

Câu trả lời:


17

Tính toán RPM mới dựa trên thiết bị mới và tốc độ hiện tại của xe.

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

vì vậy: thay vì:

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

sử dụng:

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

Tốc độ bây giờ sẽ giống nhau trước và sau khi thay đổi bánh răng, và bạn có thể tăng tốc / giảm tốc từ đó.

chỉnh sửa: thêm vào max(maxRPM, calc)khi bạn muốn giới hạn nó. Giống như trong xe hơi, điều này sẽ dẫn đến việc mất tốc độ khá đột ngột


29

điều này là do không có quán tính trong tính toán tốc độ của bạn. bạn chỉ cần tính toán nó như là một hệ quả tuyệt đối của vòng tua động cơ và bánh răng. nhưng khi bạn tính toán vòng / phút mới sau khi chuyển số, bạn thực sự hạ thấp nó bằng 3600 vòng / phút cố định.

Đây là sai lầm của bạn. thả xuống vòng / phút không cố định giữa các bánh răng. bạn có thể sửa nó bằng cách tạo một mảng thứ hai lưu trữ số vòng quay chính xác giữa mỗi bánh.

Cách thứ hai bạn có thể sửa nó, bằng cách sử dụng các tính toán dựa trên vật lý. Bạn đang thực hiện một mô phỏng, vì vậy bạn có thể thực hiện tích hợp số. Sử dụng thời gian dtvà tích hợp euler hoặc tích hợp Verlet. Điều này nghe có vẻ phức tạp với tên và tất cả nhưng thực tế không phải vậy.

Về cơ bản, điều đó có nghĩa là bạn tạo một bảng tra cứu mô-men xoắn động cơ ở các rpms nhất định. Sau đó, bạn sẽ tính đến một số sức cản không khí tăng theo bình phương tốc độ. Sau đó, mô phỏng sẽ tính toán tốc độ tiếp theo bằng cách đảo ngược định luật thứ hai của newton , f=m a.
Để tìm a=f/m, sau đó tích hợp Euler : speed=speed+a*dt. các mlà khoảng 1200 (trọng lượng xe tiêu biểu). flà lực xuất phát từ mô-men xoắn động cơ, giảm vào hộp số và sau đó được chuyển đổi thành lực bằng công thức đòn bẩy bằng cách xem xét bán kính của bánh xe. (một sản phẩm chéo vector thường, nhưng có thể được đơn giản hóa bằng cách nhân mô-men xoắn với bán kính. bởi vì netwton / mét nhân với mét = newtons.)

bằng cách này, vòng / phút của động cơ được tính ngược, như là một hàm của tốc độ xe tuyến tính.


2
Không có exact number of RPM drop between each gear. Đó là một tỷ lệ, như @Baldrickk chỉ ra. Và mặc dù đó là một ý tưởng tuyệt vời để đầu ra của truyền động là mô-men xoắn chứ không phải tốc độ, một cuộc thảo luận về sức cản của gió và tích hợp verlet nằm ngoài phạm vi của câu hỏi, phải không?
Justin

Vâng. cho một câu trả lời cho câu hỏi tôi muốn giới thiệu câu trả lời của Baldrickk. Tôi ủng hộ nó.
v.oddou

5

Bánh răng được sử dụng như một cơ chế giảm.

Sử dụng hộp số đơn giản hóa chỉ với hai tỷ số trong hộp số, một bánh răng đầu vào (động cơ) và một bánh răng đầu ra (một trong các tỷ số của hộp số) chúng ta có hai tỷ số giảm khác nhau.

Vì vậy, đối với bánh răng đầu vào có x răng và bánh răng đầu ra là x / 2 răng, tốc độ của bánh răng đầu ra gấp đôi tốc độ của bánh răng đầu vào (tỷ lệ hai trên một)

rpm2 = rpm1 * gearRatio

Ở đâu:

gearRatio = teeth1 / teeth2

Vì vậy, thay vì giới hạn mỗi thiết bị bằng tốc độ mã hóa cứng, chúng ta có thể giới hạn nó theo tỷ lệ. Sau đó, bạn có thể tính tốc độ cho một cặp (vòng / phút, bánh răng) cụ thể và khi thay đổi bánh răng, hãy tính tốc độ động cơ cho tốc độ đã biết và một cặp mới.

Để đơn giản hóa, chỉ sử dụng một động cơ được kết nối với hai bánh răng:

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]

vì thế:

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

Khi chuyển sang bánh răng thứ 2, 10000 là tốc độ, vì vậy, cắm vào cùng một công thức, bây giờ chúng ta có:

vehicleSpeed = 10000 #computed above
selectedGear = 2

do đó, vòng quay mới của chúng tôi:

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

Đó là 10000 sau đó sẽ được giảm hơn nữa bởi một khác biệt (có thể được tóm tắt như chỉ là một thiết bị, trông nó lên nếu cần, xin lỗi, có thể gửi jut hai liên kết) và sau đó bởi kích thước bánh xe để tốc độ mặt đất tính toán bằng km hoặc dặm mỗi giờ .

Bạn sẽ phải tính đến thực tế là việc chuyển sang số thấp hơn làm tăng vòng tua động cơ, vì vậy cách tiếp cận đơn giản là kiểm tra maxRPM và giới hạn vòng tua sau khi chuyển sang vòng tua tối đa của bạn, do đó làm giảm tốc độ xe.

Về cơ bản, mỗi lần xảy ra sự thay đổi bánh răng, bạn tính toán động cơRPM từ tốc độ xe, giới hạn nó bằng maxRPM và sau đó quay lại "bình thường" nơi bạn cập nhật vòng / phút từ đầu vào của người dùng và tính tốc độ dựa trên đó.

Để mô phỏng thực tế, bạn phải tính đến ít nhất mô-men xoắn động cơ (câu trả lời của v.oddou) và trượt ly hợp, kết hợp sẽ có các hiệu ứng sau: - khi chuyển lên, giả sử chuyển số đủ nhanh để vòng tua động cơ không giảm , tốc độ sẽ được tăng lên trong khi vòng tua động cơ được hạ xuống cho đến khi chúng được cân bằng - khi chuyển xuống, tốc độ xe sẽ được hạ xuống cho đến khi động cơ sẽ được nâng lên vòng tua mới nhưng điều này có thể vượt quá việc thực hiện "đơn giản".


4

Hãy nhớ rằng một hộp số tay tham gia là một thiết bị hai chiều. Động cơ có thể tăng tốc chiếc xe, giống như chiếc xe (cụ thể hơn là động lượng của nó) có thể tăng tốc động cơ.

Đây là một vấn đề thực sự trong việc truyền tay sớm. Xuống số sẽ đột ngột đá động cơ vào vòng tua cao hơn, ném các chu kỳ đánh lửa không đồng bộ và có thể khiến động cơ bị đình trệ. Điều này được bù đắp bởi lái xe chuyên gia trong đó người lái phải quay động cơ về tốc độ chính xác trước khi nhả côn để tham gia vào hộp số.

Đó là cho đến khi synchromesh được phát triển. Đó là một cơ chế ngăn chặn việc truyền phát cho đến khi tốc độ đầu vào và đầu ra được đồng bộ hóa.

Vì vậy, những gì tôi đề nghị là bạn mô phỏng synchromesh và không tham gia truyền cho đến khi vòng tua động cơ và tốc độ xe phù hợp ở mức hiện tại của chúng.


2

Câu trả lời hiện có vẻ quá phức tạp. Đối với một trò chơi, RPM chỉ là một chỉ số trên màn hình. Tốc độ thực tế là biến thực. Tỷ số truyền xác định cách bạn chuyển đổi tốc độ động cơ thành RPM. Thay đổi bánh răng thay đổi tỷ lệ, nhưng không phải tốc độ. Rõ ràng, RPM cũng thay đổi theo tỷ lệ nghịch của tỷ số truyền.

Vượt quá mức (giảm tốc độ vượt quá giới hạn 8500 vòng / phút của bạn) là điều mà bạn thực hiện riêng, nhưng đó là một điều tồi tệ trong xe hơi và bạn có thể để nó là một điều tồi tệ trong trò chơi của mình.


2
Câu trả lời hiện tại chính xác là những gì hầu hết các trò chơi tôi từng làm, ngay cả những game arcade đơn giản, bởi vì nó thực sự không phức tạp lắm. RPM trên màn hình có thể chỉ là một con số, nhưng cách tiếp cận đó cung cấp cho bạn cả số (bạn có thể điều chỉnh các chỉ số trực quan) và hành vi để khớp với các số đó
Selali Adobor

2

Như những người khác đã đề cập, tốc độ xe phải là giá trị thực và RPM nên được lấy từ đó. Việc tăng tốc sẽ khiến tốc độ quay của động cơ giảm xuống vì tỷ lệ RPM trên km / h sẽ "thay đổi" ngay lập tức nhưng tốc độ xe sẽ không thay đổi.

Tuy nhiên, tôi sẽ đề nghị rằng mô-men xoắn động cơ nên tăng với RPM lên đến một giới hạn nhất định và vượt quá mức đó. Tốc độ mà một chiếc xe tăng tốc phải tỷ lệ thuận với mô-men xoắn chia cho tỷ số truyền, trừ đi lực cản không khí tỷ lệ với bình phương tốc độ. Nếu các bánh răng liên tiếp có tỷ lệ 1: 41: 1, thì sự dịch chuyển tối ưu để tăng tốc sẽ xảy ra tại điểm mà mô-men xoắn ở bánh răng dưới đã giảm xuống khoảng 70% so với bánh răng cao hơn tiếp theo.


2

Xây dựng trên @ v.oddou, sử dụng

max(maxRPM, calc)

sẽ làm cho RPMS tối đa hóa ngay lập tức khi bánh răng bị dịch chuyển, không cho phép chuyển đổi trơn tru từ bánh răng sang bánh răng. Cách thích hợp sẽ là giải quyết RPM bằng cách sử dụng biến tốc độ làm phương trình.

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

Giải quyết cho vòng / phút

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

vì thiết bị cao hơn 1 so với trước đây, RPM sẽ thấp hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.