Deteksi tumbukan bola vs 45 derajat

8

Saya memiliki permainan sederhana di mana pemain menggerakkan bola. Bola memantul dari dinding. Saat ini saya memiliki dinding persegi (■) yang diimplementasikan: Saya menggunakan tabrakan kotak pembatas sederhana untuk memeriksa apakah pemain akan pindah ke dinding ketika memperbarui kecepatan x atau y dan jika demikian, saya melipatgandakan kecepatan itu dengan -1 untuk membuatnya memantul .

Namun, saya juga ingin menerapkan potongan segitiga (◢◣◤◥). Untuk bangkit kembali, saya percaya seseorang cukup menggunakan:

   newxspeed = -1*yspeed;
   newyspeed = -1*xspeed;

Namun, apa yang saya mengalami masalah adalah deteksi tabrakan: Kapan pemain mencapai diagonal?

Qqwy
sumber
2
Saya sangat merekomendasikan tutorial N ( bagian 1 , bagian 2 ) tentang topik ini.
Chris Burt-Brown
Terima kasih banyak. Tutorial itu benar-benar membantu saya untuk akhirnya mengerti bagaimana menyelesaikannya.
Qqwy
Sebenarnya sangat sulit bagi saya untuk menandai salah satu jawaban sebagai solusi 'karena' mereka semua membantu saya untuk memahami masalah tetapi tidak satupun dari mereka sepenuhnya menyelesaikannya. Apa yang harus saya lakukan?
Qqwy

Jawaban:

8

Pertama-tama untuk menghitung deteksi tabrakan antara bola (lingkaran dalam 2D) dan garis yang Anda butuhkan untuk menghitung vektor tegak lurus antara pusat bola yang bergerak dan garis, untuk menghitung jarak ini, Anda perlu melakukan hal berikut:

masukkan deskripsi gambar di sini

Jadi untuk menghitung d pada gambar di atas kita perlu melakukan beberapa langkah.

  1. Asumsikan garis Anda menggunakan parametrik persamaan P (t) = S + t V catatan V adalah arah garis dapat diperoleh dengan mengurangkan (P2 - P1).
  2. Dari Pythagoras:

d ^ 2 = len ( Q - S ) ^ 2 - len (proj ( Q - S )) ^ 2

Kemudian Anda perluas persamaan untuk mendapatkan yang berikut ini, sepertinya sedikit rumit tetapi sebenarnya tidak.

d = sqrt (len ( Q - S ) ^ 2 - len (( Q - S ) dot V ) ^ 2 / V ^ 2)

Di mana Q adalah pusat lingkaran dan S adalah titik mana pun di garis. Setelah jaraknya kurang dari radius lingkaran / bola Anda harus memicu respons tabrakan yang dijelaskan pada titik berikutnya.

Tidak benar untuk selalu membalik komponen x atau y untuk memantulkan bola, yang perlu Anda lakukan adalah merefleksikan vektor kecepatan, untuk melakukannya, Anda perlu menghitung vektor Normal permukaan dan menggunakannya normal untuk menghitung refleksi. vektor menggunakan persamaan berikut

R = 2 * ( V dot N ) * N - V

di mana R adalah vektor refleksi, N adalah normal dari permukaan dan V adalah vektor Velocity.

Dalam kasus 45 deg permukaan Anda normal akan menjadi N = (1,1,0) dengan tanda bervariasi tergantung pada arah mana wajah normal (posisi atau negatif).

concept3d
sumber
Anda menggunakan persamaan yang hebat. Namun, sangat sulit untuk mengikuti seseorang yang baru mengenal vektor. Akan sangat membantu jika Anda membagi persamaan Anda dalam langkah-langkah yang lebih kecil.
Qqwy
Omong-omong, apakah N vektor 2 dimensi atau 3 dimensi? Dari mana nilai ketiga (0) berasal?
Qqwy
Saya menggunakan vektor 3D karena saya berasumsi Anda menggunakan API 3D (dan saya mungkin salah) kalau-kalau benar Anda perlu mengatur komponen ke-3 sebagai 0, tetapi bagaimanapun persamaannya harus bekerja untuk 2D dan 3D (dan mungkin lebih tinggi dimensi tapi itu tidak terlalu penting). mengenai persamaan saya bisa menjelaskan lebih banyak tetapi saya perlu waktu mengedit jawabannya.
concept3d
1
Saya mengedit jawaban, saya harap ini lebih masuk akal sekarang. Tapi saya berharap stackexchange dapat menyediakan cara yang nyaman untuk menulis rumus matematika karena saat ini rasa sakit dan kesalahan cenderung.
concept3d
6

Anda ingin mengukur jarak antara pusat bola dan dinding, jadi:

masukkan deskripsi gambar di sini

menyelesaikan sistem yang Anda lihat dalam gambar akan memberi Anda koordinat titik d.

Kemudian, jika jarak antara titik d dan c lebih kecil atau sama dengan jari-jari bola r, ada tabrakan antara bola dan dinding

Marco
sumber
5

Bola sebenarnya adalah objek yang agak sederhana untuk deteksi tabrakan. Mereka bertabrakan dengan medan ketika jarak antara pusat bola dan tepi medan menjadi kurang dari jari-jari bola. Posisi pusat bola harus sepele untuk diperoleh. Menemukan titik terrain terdekat umumnya lebih rumit dan cara terbaik untuk melakukannya tergantung pada bagaimana medan terwakili.

Algoritme Anda untuk menghitung kecepatan baru setelah memantulkan kemiringan diagonal salah. Membalikkan koordinat x dan y akan membuat bola kembali ke arah yang sama saat mendekati kemiringan. Ini bagus jika bola datang di medan dari sudut kanan, tetapi gagal untuk sudut lain. Anda ingin meniadakan hanya komponen yang normal ke permukaan, misalnya saat memantul dari langit-langit, Anda meniadakan y, bukan x.

Marcks Thomas
sumber
Meskipun jawaban ini tidak secara langsung mendekati masalah, +1 memberi tahu saya tentang cara resolusi tabrakan harus dilakukan dalam kasus ini.
Qqwy