Bagaimana cara memperbaiki objek "popping" atau jittering di mesin fisika?

11

Saya punya mesin fisika sederhana yang memecahkan tabrakan dengan hanya memperbaiki posisi tubuh yang tumpang tindih (hanya lingkaran untuk saat ini) secara langsung, sebagai lawan dari hanya mengubah kecepatan atau menerapkan impuls. Kecepatan hanya diubah setelah dampak diselesaikan, atau selama bagian integrasi.

Saya punya masalah bahwa dalam tumpukan objek, objek teratas menerapkan terlalu banyak tekanan (ini ada secara implisit, tidak ada pemodelan tekanan dalam algoritme) pada objek di bagian bawah tumpukan, yang mengakibatkan mereka terdorong masuk ke lantai, dll.

Saya ingin memperbaiki ini dengan mengurutkan objek berdasarkan koordinat y mereka, sehingga tabrakan diselesaikan dari bawah ke atas. Tapi sekarang, mesin menunjukkan perilaku popping aneh untuk objek yang seharusnya benar-benar diam (lihat gif)

masukkan deskripsi gambar di sini

Tanpa hanya memberi Anda kode sumber - apa ini?

TravisG
sumber
5
Secara keseluruhan, ini mirip dengan menyelesaikan sistem persamaan linear secara iteratif (atau sistem nonlinier, tergantung pada kendala / kondisi Anda / dll). Apa pun kasusnya, Anda melihat artefak ini karena secara numerik adalah hal yang benar untuk dilihat: keadaan perantara dari proses konvergen. Menghindari ini cukup sulit dan bisa menyiratkan banyak peretasan yang tidak menyenangkan (lagi pula, ini terjadi dalam kehidupan nyata, pada tingkat molekuler, dan itulah yang Anda miliki untuk menyerupai sesuatu yang terbaik di kehidupan nyata :)). Mungkin baik untuk menyelidiki box2d untuk melihat solusi mereka untuk dinamika berbasis impuls.
teodron
@ TravisG bagaimana Anda memecahkan masalah? Saya melihat masalah yang sama ketika mencoba menerapkan mesin fisika yang sangat sederhana.
cheesus mengatakan berhenti menembakkan mod
1
@ cheeesus Sudah lama sejak saya mengerjakannya, tapi saya percaya saya hanya menggunakan lebih banyak iterasi dengan timesteps yang lebih kecil.
TravisG

Jawaban:

5

Salah satu solusi yang saya temukan ketika menggunakan koreksi posisi adalah memiliki beberapa iterasi dan memvariasikan kekuatan dengan setiap iterasi.

doPhysics();

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

Jadi iterasi pertama memiliki kekuatan 1 / num_iterations dan yang terakhir memiliki kekuatan 1. Ini membuat simulasi saya lebih halus dan lebih stabil daripada hanya menggunakan jumlah iterasi yang sama dengan kekuatan tetap.

DaleyPaley
sumber
2
Solusi yang bagus, tetapi mengapa itu bekerja?
Gustavo Maciel
5

Masalah Anda terletak pada kenyataan bahwa Anda tidak memiliki kondisi "istirahat" untuk tubuh Anda. Setiap sistem fisika memiliki sejumlah energi, baik itu kinetik, termal, dan sebagainya. Pada kenyataannya, benda padat sedikit berubah bentuk, dan mengubah sebagian energi kinetik menjadi panas, meskipun sulit diukur. Perlu juga dicatat bahwa pada kenyataannya tidak ada benda yang benar-benar solid. Bahkan bahan padat, seperti berlian, memiliki ruang di antara atom-atom, memberikan ruang struktur atom untuk melenturkan, dan menyerap energi kinetik.

Untuk membuat ini relevan, benda istirahat berada dalam keadaan di mana satu-satunya kekuatan yang berlaku adalah "kekuatan normal", yang berarti, kekuatan yang mencegah benda mengambang melalui satu sama lain. Besarnya gaya normal itu, sebanding dengan kerapatan benda-benda, dan seberapa jauh mereka telah saling menembus.

Mesin fisika menyebut nilai ini "slop".

Begini caranya: Hitung kemiringan, dan perbaiki posisi benda, dan terapkan gaya normal, berdasarkan kecepatan relatif kedua benda. selama pembaruan tubuh itu sendiri, hitung energi kinetik dari masing-masing tubuh. Jika di bawah nilai minimum, maka tidurlah tubuh, sampai kekuatan yang cukup besar diterapkan padanya. (biasanya dua kali nilai minimum).

Ian Young
sumber
0

Mengapa tidak menambahkan permukaan "lengket" kepada mereka dan meminta mereka tetap pada posisi istirahat secara bertahap dan ketika benda lain menabraknya, ia memindahkan sejumlah energi ke dalamnya yang menyebabkannya bergerak tetapi permukaan lengket akan menyebabkannya kehilangan sebagian energi ini dan berhenti dalam posisi istirahat. gif sepertinya tidak memiliki gesekan untuk itu.

segera
sumber