Misalnya, ambil skenario ini (permisi keterampilan menggambar mengerikan saya):
Ini didasarkan pada "Portal", di mana stickman akan melalui portal biru (yang terhubung ke portal merah), tetapi ada dinding yang menghentikannya di portal merah. Karena itu dia tidak bisa sepenuhnya melalui portal.
Jadi pertanyaan saya adalah ini: Bagaimana saya melakukan deteksi fisika / tabrakan dengan mereka? Apakah saya mengiris pemain? Apakah ada cara untuk menghubungkan mereka? Apakah ada mesin fisika yang mendukung melakukan ini? Jika tidak, bagaimana saya membuatnya?
Jawaban:
The Portal permainan memiliki cara yang baik dimana mereka memecahkan masalah ini:
Pemain menempel melalui portal sumber (biru) dan terlihat menonjol keluar dari portal target (oranye). Pemain disalin ke portal target dan terlihat melangkah melewatinya. Gim ini membuat gambar yang Anda lihat saat melihat melalui portal sumber dengan menggunakan kamera kedua dan render-to-tekstur.
Namun, salinan pemain di lokasi target tidak berinteraksi dengan fisika. Itu hanya ada untuk tujuan rendering. Sebagai gantinya, mereka membuat objek tabrakan virtual di sisi lain portal sumber, dan membuat pemain bertabrakan dengan itu. Ini membuat fisika tetap sederhana.
Anda hanya perlu benda-benda virtual tersebut sejauh yang bisa dijangkau pemain tanpa melalui portal sepenuhnya. Segera setelah pemain melewati portal sepenuhnya, situasinya terbalik.
Gambar untuk diilustrasikan : Portal biru adalah portal sumber, portal oranye portal target. Kotak putih putus-putus adalah objek tabrakan virtual, sedangkan kotak nyata adalah objek yang diberikan. Pemain (dengan titik merah) hanya berinteraksi dengan benda-benda langsung di sekitarnya. Objek-objek di portal oranye benar-benar diabaikan.
sumber
Begini cara saya mencoba dan melakukannya.
Saat Anda berada di dalam portal akan ada dua salinan pemain di mesin fisika. Setiap salinan mengabaikan semua tabrakan yang berada di sisi berlawanan dari portal, dan Anda kemudian menggabungkan hasilnya dan menerapkan hasil simulasi untuk kedua model.
Idealnya Anda akan menerapkan gravitasi secara terpisah untuk setiap setengah pemain, tetapi Anda mungkin bisa lolos hanya dengan menerapkannya di sisi portal tempat pusat massa pemain berada.
Untuk mengabaikan tabrakan itu, Anda perlu mengatur volume yang sesuai, dan menguji apakah ada titik di dalamnya. Sebuah silinder (mungkin diregangkan secara vertikal) tampaknya menjadi pilihan yang baik. Tesnya kira-kira seperti itu
if (!collisionPoint.InsideCylinder(portal)) ProcessCollision(); else IgnoreCollision();
Saya percaya sebagian besar mesin fisika memiliki sistem untuk menyaring benda yang bisa bertabrakan, jadi harus dimungkinkan menggunakan mesin fisika standar. Misalnya http://bulletphysics.org/mediawiki-1.5.8/index.php/Collision_Filtering#Custom_collision_filtering
Untuk menggabungkan hasilnya, pilihan paling sederhana mungkin adalah menambahkan semacam kendala yang tidak fleksibel di antara keduanya, dan biarkan mesin fisika menanganinya.
sumber
Mengapa kamu mau? Anda tidak perlu menghitung seberapa jauh seorang pemain "turun"; Anda akan mengetahui seberapa jauh ke bawah saat objek melewati simulasi.
Sebuah portal, dari perspektif murni dalam game, tidak lebih dari sebuah teleporter rumit yang mengacaukan tabrakan untuk mengubah objek yang dapat collidable menjadi objek yang tidak dapat collidable. Ketika suatu benda menyentuh portal, ia mulai berpotensi bertabrakan dengan benda-benda di sisi lain. Ketika objek melewati "cukup jauh" melalui portal, Anda secara efektif memindahkannya ke portal lain, secara instan mengubah posisi dan orientasinya.
Fisika hanya berjalan seperti biasa.
sumber
When an object touches the portal, it starts potentially colliding with things on the other side
ya persis. Bagaimana saya melakukan ini dengan mesin fisika? Saya kira itu adalah pertanyaan saya :)