Nhân vật của tôi sẽ dừng lại ở đâu?


12

Nhiều năm trước tôi đã mã hóa một số AI cho một trò chơi giả 3d ngân sách. Có một tính toán mà tôi chưa bao giờ thực sự tìm ra cách tốt nhất để làm, và đó là tính toán nơi kẻ thù sẽ kết thúc nếu nó dừng lại ngay bây giờ. Ví dụ:

  • Kẻ thù hiện đang ở X = 540.0.
  • Kẻ thù đang di chuyển đúng 10 pixel mỗi khung hình.
  • Khi kẻ thù muốn dừng lại, tốc độ của nó sẽ giảm 1 pixel cho mỗi khung hình cho đến khi nó về không.

Có một công thức đơn giản nào có thể đưa tôi đến vị trí mà kẻ thù kết thúc khi anh ta hoàn toàn dừng lại? Tôi đã kết thúc việc tính toán trước và mã hóa phần bù phù hợp với nhu cầu của mình nhưng sẽ phải tính riêng cho kẻ thù với tốc độ khác nhau.

Câu trả lời:


7

Tôi thường đồng ý với câu trả lời của John. Tôi sẽ cung cấp một công thức được sửa đổi một chút (có thêm V / 2 vào giá trị của anh ấy):

D = V / A * (V + A) / 2 

Với V = 10A = 1, điều đó được D = 55. Đây chính xác là kết quả của

10 + 9 + 8 + 7 + .... + 3 + 2 + 1

đó là chuyển động theo từng khung hình của kẻ thù.

Đây là cách bạn đi đến bước đó.

  1. V : Vận tốc hiện tại = 10 pixel / khung hình, A : Gia tốc hiện tại = 1 pixel / khung hình ^ 2
  2. T : Thời gian dừng lại = V / A = 10 khung hình.
  3. Khoảng cách đã di chuyển trong 10 khung hình = frame1 + frame2 + frame3 + ... = V + (VA) + (V-2 * A) + ...
  4. Điều này bằng với T * V - A / 2 * T * (T-1), đơn giản hóa phương trình trên.

+1 Tôi không thể thấy bất kỳ lỗi logic nào trong giải pháp của bạn và tôi thực sự không thể nhớ được mình đã tìm ra giải pháp của mình như thế nào. Vì vậy, biểu hiện của tôi phải sai và có lẽ tôi đã không nhận thấy do sự khác biệt nhỏ và thiếu kiểm tra chi tiết? Biểu thức của tôi có trở thành chính xác không nếu tôi chỉ cần thêm một nửa vận tốc?
John McDonald

Tôi đã trả lời câu hỏi của riêng tôi bằng cách sử dụng năng lượng calc. Lấy biểu thức của tôi + (v / 2) dường như luôn bằng biểu thức của bạn cho bất kỳ v và a đã cho.
John McDonald

Cảm ơn cả @John và bạn, điều này sẽ giúp tôi tiết kiệm rất nhiều nỗ lực trong những ngày qua! Tôi chấp nhận câu trả lời này, vì nó đơn giản và hiệu quả hơn nhưng câu trả lời của John cũng được đánh giá cao. Cố lên các chàng trai!
Kaivosukeltaja

6

Tôi đã có cùng một vấn đề chính xác khi làm việc với trò chơi của mình và tôi phải mất toán học mãi mãi (bleh). Vì vậy, đây là:

minDistanceToStop = 0.5 * acceleration * Math.Pow(velocityLinear() / acceleration, 2.0);

Viết lại thành toán thông thường:

(Acceleration / 2) * (linearVelocity / Acceleration)^2

Trong đó gia tốc trong trường hợp của bạn là 1 và linearVelocity là 10:

(1 / 2) * (10 / 1)^2
= 50 units to stop

BIÊN TẬP

Kết quả và lời giải thích của Jimmy đều đúng. Công thức của tôi yêu cầu bạn cũng thêm một nửa vận tốc.

minDistanceToStop = (0.5 * acceleration * Math.Pow(velocityLinear() / acceleration, 2.0)) + (velocityLinear() / 2);

hoặc là

((Acceleration / 2) * (linearVelocity / Acceleration)^2) + (linearVelocity / 2)
((1 / 2) * (10 / 1)^2) + (10 / 2)
= 55

2
Chỉ để ghi lại, Math.Pow () là một ý tưởng tồi tệ, khủng khiếp ở đây. Nó có thể đặc biệt là số mũ '2.0' nếu nó đủ thông minh, nhưng bất kỳ cách nào bạn cắt nó, viết lại biểu thức đó là '0,5 * linearVelocity * linearVelocity / Gia tốc' sẽ là một chiến thắng lớn.
Steven Stadnicki

4

Các tính toán về việc thay đổi vận tốc là toàn bộ điểm tính toán. Tôi đã không làm điều đó trong một thời gian vì vậy tôi không nhớ ra khỏi đỉnh đầu của mình, nhưng tôi nghĩ rằng tình huống của bạn chỉ đơn giản là lấy tích phân -1 (tức là giảm tốc).


0

Đây không phải là chuyển động tăng tốc liên tục?

X = Xi + V*t + (1/2) * a * (t^2)

Trong đó:
X: Vị trí cuối
Xi: Vị trí ban đầu
V: Vận tốc
t: Thời gian
a: Gia tốc

Phần khó khăn duy nhất ở đây là làm thế nào để xác định "t", vì chúng ta chậm lại với gia tốc -1, sau đó chúng ta có thể tính t = V / a, sau đó t là 10.

vì vậy,
Xi: 540
V: 10
t: 10
a: -1

Đặt mọi thứ vào:

X = 540 + 10*10 + (1/2) * (-1) * (10 ^ 2) 
X = 540 + 100 + (-50) 
X = 540 + 50 
X = 590

Công thức xuất phát từ việc tích hợp gia tốc: Kiểm tra tại đây

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.