Làm cách nào để sửa các đối tượng trong trò chơi Popping pop hay jittering trong công cụ vật lý?


11

Tôi đã có một động cơ vật lý đơn giản giúp giải quyết các va chạm bằng cách điều chỉnh trực tiếp vị trí của các vật thể chồng chéo (chỉ vòng tròn bây giờ), trái ngược với việc chỉ thay đổi vận tốc hoặc áp dụng xung lực. Vận tốc chỉ được thay đổi sau khi các tác động đã được giải quyết hoặc trong phần tích hợp.

Tôi đã có một vấn đề là trong một đống các vật thể, các vật thể trên cùng chịu quá nhiều áp lực (điều này tồn tại ngầm, không có mô hình áp suất trong thuật toán) trên các vật thể ở dưới cùng của đống, dẫn đến việc chúng bị đẩy qua các tầng, Vân vân.

Tôi muốn khắc phục điều này bằng cách sắp xếp các đối tượng theo tọa độ y của chúng, vì vậy các va chạm được giải quyết từ dưới lên. Nhưng bây giờ, công cụ cho thấy hành vi popping kỳ lạ cho các đối tượng thực sự nên nghỉ ngơi (xem gif)

nhập mô tả hình ảnh ở đây

Không chỉ cung cấp cho bạn mã nguồn - đây có thể là gì?


5
Nói chung, điều này tương tự như việc giải một hệ phương trình tuyến tính theo cách lặp (hoặc hệ phi tuyến, tùy thuộc vào các ràng buộc / điều kiện / vv) của bạn. Dù thế nào đi nữa, bạn đang nhìn thấy những đồ tạo tác này bởi vì chúng là thứ chính xác để thấy: các trạng thái trung gian của một quá trình hội tụ. Tránh điều này là khá khó khăn và có thể ám chỉ rất nhiều vụ hack khó chịu (dù sao, điều này xảy ra trong cuộc sống thực, ở cấp độ phân tử, và đó là những gì bạn có ở đó để giống với một cái gì đó trong cuộc sống thực :)). Có lẽ tốt để điều tra box2d để xem giải pháp của họ cho động lực dựa trên xung lực.
teodron

@TravisG bạn đã giải quyết vấn đề như thế nào? Tôi đang xem xét một vấn đề tương tự khi cố gắng thực hiện một công cụ vật lý rất đơn giản.
cheesus nói ngừng bắn mod 12/12/13

1
@cheeesus Đã được một thời gian kể từ khi tôi làm việc với nó, nhưng tôi tin rằng tôi chỉ sử dụng nhiều lần lặp hơn với các dấu thời gian nhỏ hơn.
TravisG

Câu trả lời:


5

Một giải pháp tôi đã tìm thấy khi sử dụng hiệu chỉnh vị trí là có một vài lần lặp và thay đổi cường độ với mỗi lần lặp.

doPhysics();

int num_iterations = 5;
for(int iteration=0; iteration<num_iterations; ++iteration)
{
    float strength = float(iteration+1)/num_iterations;
    correctPositions(strength);
}

Vì vậy, lần lặp đầu tiên có cường độ 1 / num_iterations và lần lặp cuối có cường độ là 1. Điều này làm cho các mô phỏng của tôi mượt mà và ổn định hơn so với việc sử dụng cùng một số lần lặp với cường độ cố định.


2
Giải pháp tốt đẹp, nhưng tại sao nó hoạt động?
Gustavo Maciel

5

Vấn đề của bạn nằm ở chỗ bạn không có trạng thái "nghỉ ngơi" cho cơ thể. Bất kỳ hệ thống vật lý nào cũng có một lượng năng lượng, là động năng, nhiệt, vân vân. Trong thực tế, vật thể rắn biến dạng nhẹ, và chuyển một số động năng thành nhiệt, mặc dù điều đó khó có thể đo lường được. Cũng đáng lưu ý rằng trong thực tế không có thứ gọi là vật thể hoàn toàn rắn. Ngay cả các vật liệu dày đặc, như kim cương, có không gian ở giữa các nguyên tử, tạo cho phòng cấu trúc nguyên tử uốn cong và hấp thụ động năng.

Để làm cho điều này có liên quan, các cơ quan nghỉ ngơi ở trong trạng thái mà các lực duy nhất có hiệu lực là "lực bình thường", nghĩa là, lực ngăn các cơ thể trôi qua nhau. Độ lớn của lực bình thường đó, tỷ lệ thuận với mật độ của các vật thể và chúng đã xâm nhập vào nhau bao xa.

Động cơ vật lý gọi giá trị này là "dốc".

Đây là mẹo: Tính toán độ dốc và sửa vị trí của các cơ thể và áp dụng lực bình thường, dựa trên vận tốc tương đối của hai cơ thể. trong quá trình cập nhật của chính các cơ thể, tính toán động năng của mỗi cơ thể. Nếu nó ở dưới một giá trị tối thiểu, sau đó đặt cơ thể vào trạng thái ngủ, cho đến khi một lực đủ lớn được áp dụng cho nó. (thường gấp đôi giá trị tối thiểu).


0

Tại sao không thêm một bề mặt "dính" vào chúng và để chúng dính vào vị trí nghỉ ngơi dần dần và khi một vật khác chạm vào nó, nó sẽ truyền một lượng năng lượng vào nó khiến nó di chuyển nhưng bề mặt dính sẽ khiến nó mất đi một phần năng lượng này và dừng lại trong tư thế nghỉ ngơi. Gif có vẻ như không có ma sát với 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.