Saya sedang mengerjakan permainan di mana pemain dapat mengambil benda menggunakan sesuatu seperti sinar traktor, dan membawanya berkeliling.
Menarik benda ke arah tengah balok tidaklah sulit. Tapi begitu objeknya cukup dekat dengan pusat, saya harus menyimpannya di sana saat pemain bergerak, yang merupakan masalah yang saya alami. Saya dapat memikirkan dua cara untuk melakukannya, dan keduanya memiliki masalah:
Perbarui posisi objek setiap kali posisi pemain berubah, pertahankan posisi tetap di tengah balok.
Perbarui kecepatan objek untuk menunjuk langsung ke pusat balok, semakin jauh, semakin banyak kecepatan.
Bergerak dan berputar bekerja dengan baik dengan kedua pendekatan, tetapi fisika salah ketika benda yang dibawa bertabrakan dengan benda lain:
Dengan pendekatan pertama, fisika diabaikan sepenuhnya. Objek yang dibawa hanya mendorong sesuatu keluar dari jalan. Itu karena perubahan posisi hanya seharusnya dilakukan sebagai bagian dari fisika dunia, berdasarkan kecepatan.
Dengan pendekatan kedua, fisika pada dasarnya berperilaku sebagaimana mestinya, tetapi bereaksi berlebihan. Masalahnya adalah: Untuk menjaga benda yang dibawa di tengah-tengah balok bahkan ketika berputar dan bergerak, saya perlu menggunakan nilai kecepatan tinggi. Jadi, begitu benda yang dibawa menyentuh benda lain, ia mendapat kecepatan yang terlalu banyak dari tabrakan.
Bagaimana saya bisa menerapkan ini dengan benar? Tebakan terbaik saya sekarang adalah untuk pergi dengan pendekatan kedua dan menambahkan penanganan khusus untuk benda yang dibawa ke fisika dunia, mengurangi kecepatan ke nilai waras untuk tabrakan atau ketika pemain berhenti membawa mereka. Tapi itu sepertinya solusi yang cukup canggung.
Sunting: Menambahkan beberapa kode pseudo untuk menggambarkan cara kerjanya sekarang (itu akan menjadi pendekatan kedua di atas)
void attract_object(object, ticks) {
Vector distance = beam_center - object.center;
// If the object is not close to the beam center, attract it slowly
if (magnitude(distance) > 10) {
object.velocity += distance.normalized() * ticks * 0.1;
return;
}
// Here comes the part we're talking about. That magic 0.5 is just high enough
// that the object isn't lost while moving around. But it's still so high that
// other objects are repelled with way too much force.
object.velocity = distance * ticks * 0.5;
}
Dari apa yang saya lihat, ini terjadi ketika objek yang dibawa mendorong objek lain:
- Objek yang dibawa bertabrakan dengan objek lain
- Kecepatan objek terdistribusi dengan baik, sehingga objek yang dibawa didorong menjauh dari pusat balok dalam proses
- Kode di atas menyebabkan objek yang dibawa untuk kembali ke pusat balok, dengan kecepatan sangat banyak sehingga akan kembali ke sana dengan cepat
- Ketika benda yang dibawa bergerak kembali ke tengah balok, setengah dari kecepatan tinggi ditransfer ke objek lain, memukulnya kembali dengan keras. Karena kecepatan awal objek yang diangkut nampak waras, saya dapat membayangkan bahwa langkah 2 hingga 4 diulang beberapa kali, membangun kecepatan tinggi.
Itu tampaknya menjadi penyebabnya. Saya tidak bisa memikirkan cara yang bagus untuk memperbaikinya :(