Bagaimana cara mengimplementasikan deteksi tabrakan portal?

12

Misalnya, ambil skenario ini (permisi keterampilan menggambar mengerikan saya): gambar

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?

MiJyn
sumber
Sejauh yang saya tahu mereka menjelaskan beberapa hal dalam komentar pengembang Portal 1.
Archy
@ Byte56, terima kasih, saya memperbarui posting saya. Saya pikir ini harus lebih memperjelasnya :)
MiJyn
1
Saya pikir situasi yang Anda gambarkan sangat jarang di portal (jika pernah terjadi) karena portal tidak penempatan mengambang bebas. Mereka ditempatkan di dinding, dan hanya dinding tertentu. Saya tidak ingat situasi di mana saya bisa menempatkan portal, tetapi tidak bisa melewatinya karena hambatan di ujung portal. Saya membayangkan Anda dapat membuat salinan sementara pemain di kedua lokasi untuk periode transisi.
MichaelHouse
2
@ Byte56: Anda tidak harus ingat banyak. Saya ingat hal ini dilakukan di Portal 1. Saya sepertinya mengingat sebuah area penghancuran di mana orang dapat menggunakan portal untuk menghindari kematian. Bertabrakan dengan barang di dekat portal adalah hal yang biasa terjadi, dan mesin menanganinya dengan mudah.
Nicol Bolas

Jawaban:

7

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.

masukkan deskripsi gambar di sini

Daniel AA Pelsmaeker
sumber
4
" menggunakan kamera kedua dan render-to-tekstur " Komentar pengembang di Portal 1 secara eksplisit mengatakan bahwa mereka tidak menggunakan render-to-tekstur, karena itu tidak berfungsi dengan baik untuk kebutuhan mereka (terutama dengan melihat portal dari portal lain ). Sebaliknya, mereka pada dasarnya mengubah versi dunia ke sisi lain portal dan hanya membuat ulang melalui itu.
Nicol Bolas
Wow, ini menjawab hampir semuanya! Saya hanya ingin tahu, apakah itu berfungsi dengan portal menjadi lubang dengan benda-benda di dalamnya?
MiJyn
6

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 ituif (!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.

Adam
sumber
Hmm, oke, bagaimana saya melakukan ini? Saya mendapatkan bagian tentang menyalin pemain, tetapi selain itu, saya tidak mengerti. Bagaimana saya bisa mengabaikan tabrakan dari sisi yang berlawanan? Bagaimana saya menggabungkan hasil?
MiJyn
Saya telah mengedit beberapa detail lebih lanjut.
Adam
terima kasih, saya akan memikirkan hal ini dan membalas nanti setelah saya dapat meluruskan ini di kepala saya :)
MiJyn
Terima kasih banyak, jawaban Anda dan Virtlink menjawab pertanyaan saya :) Sekarang untuk memutuskan mana yang mengatur "jawaban yang benar" untuk ...
MiJyn
4

Bagaimana saya menghitung seberapa jauh pemain turun?

Mengapa kamu mau? Anda tidak perlu menghitung seberapa jauh seorang pemain "turun"; Anda akan mengetahui seberapa jauh ke bawah saat objek melewati simulasi.

Bagaimana saya bisa menghubungkan portal?

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.

Nicol Bolas
sumber
When an object touches the portal, it starts potentially colliding with things on the other sideya persis. Bagaimana saya melakukan ini dengan mesin fisika? Saya kira itu adalah pertanyaan saya :)
MiJyn
@ MiJyn: Anda menulis mesin fisika yang bisa melakukan itu. Valve pada dasarnya harus memecah mesin Source untuk membuat Portal benar-benar berfungsi. Tidak ada mesin fisika komersial atau open-source yang bisa melakukannya. Ada alasan mengapa, terlepas dari popularitas Portal, tidak ada banyak klon Portal di pasar.
Nicol Bolas
menarik, karena ada banyak game lain yang memiliki mekanisme yang sangat mirip (lihat bahkan mod TARDIS untuk minecraft). Saya yakin bahwa harus ada beberapa cara untuk melakukannya dengan mudah.
MiJyn