2012-12-23 32 views
5

Tôi đang cố gắng giảm dần tốc độ của vật thể, sử dụng thuộc tính "giảm xóc". Sau đó, tôi muốn di chuyển vị trí của vật thể bằng vận tốc. Có vẻ như thế này:Giảm vận tốc với deltaTime?

velocity.x *= velocity.damping; 
velocity.y *= velocity.damping; 
x += velocity.x; 
y += velocity.y; 

Không đơn giản hơn thế và hoạt động tốt, nhưng đây là vấn đề của tôi: Tôi đang sử dụng biến deltaTime, có chứa lượng thời gian (tính bằng giây) , bản cập nhật cuối cùng của vòng lặp trò chơi của tôi đã diễn ra. Áp dụng vận tốc là đủ dễ dàng:

x += velocity.x * deltaTime; 
y += velocity.y * deltaTime; 

Nhưng làm cách nào tôi có thể giải thích cho deltaTime khi tôi nhân đặc tính giảm xóc? Ý tưởng của tôi là, để tìm chuyển vị trong x hoặc y và nhân deltaTime với điều đó, như sau:

velocity.x += (velocity.x * velocity.damping - velocity.x) * deltaTime; 
velocity.y += (velocity.y * velocity.damping - velocity.y) * deltaTime; 

Tắt nó không hoạt động. Tôi không thực sự hiểu tại sao, nhưng tôi vẫn nhận được kết quả khác nhau khi tôi kiểm tra nó. Nếu tôi chỉ đơn giản là bỏ qua giảm xóc hoặc đặt nó thành 1.0, mọi thứ hoạt động, do đó, vấn đề phải nằm trong hai dòng cuối cùng.

+0

Tại sao bạn trừ đi tốc độ trong đoạn mã cuối cùng? – Matthias

+0

(velocity.x * velocity.damping) là vận tốc mới.x. Tôi trừ đi vận tốc ban đầu.x từ đó, để có được sự khác biệt. – user1925315

Trả lời

8
velocity.x += (velocity.x * velocity.damping - velocity.x) * deltaTime; 

Điều đó có nghĩa là bạn có gia tốc không đổi, không giảm xóc.

velocity.x * (1 - velocity.damping) 

là số tiền mà bạn giảm tốc độ từ giá trị hiện tại trong một đơn vị thời gian. Tỷ lệ thuận với vận tốc hiện tại, do đó, trong đơn vị thời gian tiếp theo, bạn sẽ giảm vận tốc xuống một lượng nhỏ hơn bằng cách sử dụng hệ số giảm xóc. Nhưng nhân với deltaTime, bạn trừ số tiền tương tự, được tính từ giá trị ban đầu trong tất cả các đơn vị thời gian deltaTime.

Giả sử hệ số giảm chấn là 0.9, vì vậy bạn giảm tốc độ xuống một phần mười theo đơn vị thời gian. Nếu bạn sử dụng công thức tuyến tính (nhân với deltaTime), sau 10 đơn vị thời gian vận tốc của bạn sẽ trở thành 0, và sau 11, nó sẽ chuyển hướng. Nếu bạn đi từng bước, bắt đầu từ vận tốc ban đầu là v_0 = 1, bạn sẽ nhận được

v_1 = v_0*0.9 = 0.9 
v_2 = v_1*0.9 = 0.81 
v_3 = v_2*0.9 = 0.729 
v_4 = v_3*0.9 = 0.6561 

v.v ... Nếu bạn mở ra công thức cho v_4, bạn sẽ có được

v_4 = v_3*0.9 = v_2*0.9*0.9 = v_1*0.9*0.9*0.9 = v_0*0.9*0.9*0.9*0.9 = v_0 * 0.9^4 

vậy, việc tổng quát hoá, bạn thấy rằng công thức nên

velocity.x *= Math.pow(velocity.damping, deltaTime); 

(Giả sử Action Script không khác với ECMA Script trong những chức năng đó được gọi.)

Tương tự như vậy đối với velocity.y tất nhiên.

+1

Cảm ơn bạn đã giải thích. Làm cho cảm giác hoàn hảo! :) – user1925315

Các vấn đề liên quan