Sebuah bola menyentuh sudut, di mana ia akan membelokkan?

46

Saya perlu memoles trigonometri saya dan berharap Anda dapat membantu di sini dengan model matematika sederhana. Berikut adalah model saya sejauh ini pada gambar terlampir. Saya sadar bahwa frame animasi memiliki masalah lain ketika bola bergerak sangat cepat, tetapi untuk sekarang saya hanya perlu menghitung ballDx dan ballDy. Mungkin juga ballDx = 0 (hanya gerakan vertikal), tetapi ketika bola membelokkan ballDx mungkin mendapatkan nilai yang berbeda.

Tumbukan 2D antara bola dan ujung sudut benda padat yang tidak dapat digerakkan

Lumis
sumber
22
Apakah ini yang mereka sebut "kasus sudut"?
Andrew Grimm
2
Jelas, seiring berjalannya waktu, segera kita dapat menggunakan teori relativitas untuk menyelesaikannya - masalahnya semakin besar (ive).
Lumis

Jawaban:

45

Catatan: Semua yang berikut mengasumsikan permukaan bola tidak gesekan (sehingga tidak akan mulai berputar atau melambung karena berbeda).

Pada saat tabrakan, bola akan menyentuh sudut. Ketika benda padat bertabrakan, suatu gaya akan bertindak di sepanjang permukaan yang disebut normal, yaitu tegak lurus terhadap permukaan pada titik tumbukan.

Karena itu bola, tegak lurus ke permukaan mengarah ke pusat bola. Ok, jadi kita tahu arah gaya, bagaimana dengan besarnya? Dengan asumsi tabrakan elastis (dan bahwa persegi panjang tidak bisa bergerak), bola harus melambung pada kecepatan yang sama dengan yang ditimbulkannya.

Biarkan (nDx, nDy) menjadi kecepatan setelah tumbukan, (oDx, oDy) kecepatan sebelum tumbukan, dan (x, y) posisi bola pada titik tumbukan. Lebih jauh kita asumsikan sudut bola bertabrakan adalah pada (0,0).

Mengekspresikan wawasan kami sebagai formula, kami memiliki:

(nDx, nDy) = (oDx, oDy) + c * (x, y)
length (nDx, nDy) = length (oDx, oDy)

Yang setara dengan:

nDx = oDx + c * x
nDy = oDy + c * y
nDx^2 + nDy^2 = oDx^2 + oDy^2

Mengganti dua persamaan pertama dalam yang terakhir, kita dapatkan:

(oDx + c * x)^2 + (oDy + c * y)^2 = oDx^2 + oDy^2

Memperluas menggunakan thorem binomial

(a+b)^2 = a^2 + 2ab + b^2 

hasil:

oDx^2 + 2 * oDx * c * x + (c * x) ^ 2 + oDy^2 + 2 * oDy * c * y + (c * y) ^ 2 = oDx^2 + oDy^2
2 * oDx * c * x + 2 * oDy * c * y + (c * x) ^ 2 + (c * y) ^ 2 = 0
(2 * oDx * x + 2 * oDy * y) * c + (x^2 + y^2) * c^2 = 0

Persamaan kuadrat ini untuk cmemiliki dua solusi, salah satunya adalah 0. Jelas, itu bukan solusi yang kami minati, karena umumnya arah bola akan berubah sebagai hasil dari tabrakan. Untuk mendapatkan solusi lain, kami membagi kedua sisi dengan c dan mendapatkan:

(2 * oDx * x + 2 * oDy * y) + (x^2 + y^2) * c = 0

Itu adalah:

 c = -(2 * oDx * x + 2 * oDy * y) / (x^2 + y^2)

Untuk meringkas, kami memiliki:

c = -(2 * oDx * x + 2 * oDy * y) / (x^2 + y^2)
nDx = oDx + c * x
nDy = oDy + c * y

Edit : Dalam kode:

if (collision) {
    float x = ballX - cornerX;
    float y = ballY - cornerY;
    float c = -2 * (ballDx * x + ballDy * y) / (x * x + y * y);
    ballDx = ballDx + c * x;
    ballDy = ballDy + c * y;
}

Beberapa pertimbangan implementasi: Meskipun Anda dapat memperkirakan (x, y) dengan posisi bola setelah langkah simulasi, perkiraan ini akan mengubah sudut defleksi dan karenanya sangat terlihat, sehingga langkah simulasi Anda harus sangat halus (mungkin seperti itu sehingga bola tidak bergerak lebih dari 1/20 diamaternya per langkah). Untuk solusi yang lebih akurat, Anda dapat menghitung waktu tabrakan terjadi, dan membagi langkah simulasi pada waktu itu, yaitu melakukan langkah parsial hingga titik tabrakan, dan langkah parsial lain untuk sisa langkah.

Sunting 2: Menghitung titik dampak

Misalkan r adalah jari-jari, (x0, y0) posisi dan (dx, dy) kecepatan bola pada awal langkah simulasi. Untuk kesederhanaan, mari kita asumsikan bahwa sudut yang dimaksud terletak pada (0,0).

Kita tahu:

(x,y) = (x0, y0) + (dx, dy) * t

Kami ingin

length(x,y) = r

Itu adalah

(x0 + dx * t) ^ 2 + (y0 + dy * t) ^ 2 = r^2
x0^2 + 2 * x0 * dx * t + dx^2 * t^2 + y0^2 + 2 * y0 * dy * t + dy^2 * t^2 = r ^ 2
(dx^2 + dy^2) * t^2 + (2 * x0 * dx + 2 * y0 * dy) * t + (x0^2 + y0^2 - r^2) = 0
\____  _____/         \____________  ___________/       \_______  ________/
     \/                            \/                           \/
     a                             b                            c

Itu adalah persamaan kuadrat dalam t. Jika diskriminatif

D = b^2 - 4 * a * c

negatif, tidak memiliki solusi, yaitu bola tidak akan pernah menyentuh sudut pada jalannya yang sekarang. Jika tidak, dua solusi diberikan oleh

t1 = (-b - sqrt(D)) / (2 * a)
t2 = (-b + sqrt(D)) / (2 * a)

Kami tertarik pada saat tabrakan dimulai, yang merupakan waktu sebelumnya t1.

Metode Anda akan menjadi:

    // compute a,b,c and D as given above

    if (D >= 0) {
        t = (-b - sqrt(D)) / (2 * a);
        if (0 < t && t <= ts) {
            // collision during this timestep!

            x = x + t * dx;
            y = y + t * dy;
            ts = ts - t;

            // change dx and dy using the deflection formula 
        }
    }

    x = x + ts * dx;
    y = y + ts * dy;
meriton - mogok
sumber
1
ini layak diberi +1
dinamis
1
Jangan ragu untuk memilih, kemudian :-)
meriton - saat mogok
3
Anda mengatakan sangat awal At the moment of collision, the ball will be touching the cornertetapi saya tidak melihat pembenaran dari perkiraan ini (dan itu harus perkiraan karena itu tidak benar - bola menyentuh di dua tempat, tidak ada yang merupakan sudut).
Peter Taylor
1
@ Peter Taylor: Apakah Anda memperhatikan bahwa OP telah menggambar bola di luar persegi panjang, dan rumus deteksi tabrakan yang diberikan dalam pertanyaan mengasumsikan ini juga? Anda harus berpikir di luar kotak di sini :-)
meriton - mogok
1
Suka jawaban ini, tetapi bisa menggunakan markup $ $ LaTeX $ dari matematika.
Martin Wickman
13

Inilah cara visual dalam memandang suatu masalah.

Set masalah asli adalah lingkaran vs persegi panjang (abu-abu pada gambar di bawah). Ini sama dengan titik vs rected round (ditunjukkan dalam warna hitam).

Jadi ini adalah masalah multi-bagian. Anda sedang menguji tabrakan titik Anda dengan 4 garis (diekstrusi keluar dari tepi kotak oleh jari-jari lingkaran asli) dan 4 lingkaran (di sudut-sudut persegi panjang dengan jari-jari yang sama dengan lingkaran asli).

Dengan kecepatan kasar di gambar asli Anda, titik akan mengenai lingkaran sudut kanan bawah. Yang harus Anda lakukan adalah mencari tahu titik di lingkaran sudut yang akan Anda tekan, menghitung sudutnya, dan memantulkannya.

masukkan deskripsi gambar di sini

Saya akan meninggalkan derivasi itu sebagai latihan untuk pembaca.

Tetrad
sumber
2

Saya sedang mengerjakan permainan dan juga terjebak di sini. Tapi saya kira begini:

masukkan deskripsi gambar di sini

Ada pandangan lain Masalah saya adalah bahwa saya tidak tahu cara cepat menghitung dx baru, dy (bagi saya menggunakan matematika tradisional memerlukan terlalu banyak perhitungan).

Risa
sumber
Sudut pandang saya berbeda dengan yang ada di tautan ke-2, karena saya tidak berpikir vektor kecepatan baru tergantung pada pusat blok seperti itu. Saudaraku memberi tahu saya bahwa bola akan memantul kembali ke arah yang lama (dx = -dx && dy = - dy) tapi saya rasa tidak.
Risa
Jika bola menyentuh sudut dan jarak ballX dari sudutX lebih kecil dari 1/4 bolaW maka akan memantul kembali, jika tidak maka akan membelok ke depan ke kanan. Ini adalah model sederhana yang saya gunakan saat ini, yang tidak disesuaikan untuk menemukan sudut yang tepat.
Lumis
0

Kinematika adalah semua tentang memilih yang benar, seperti yang paling nyaman untuk perhitungan, kerangka acuan.

Di sini kita pertama-tama akan mendefinisikan transformasi T yang menyelesaikan sumbu kita menjadi komponen paralel ( x ' ) dan tegak lurus ( y' ) menjadi garis antara pusat bola dan sudut. Transformasi terbalik T * akan mengembalikan sistem koordinat asli kami.

Dalam kerangka referensi baru ini, dengan refleksi (dan simetri waktu dan ruang fisika), kita memiliki transformasi kecepatan kontak M ( impuls titik ) seperti yang membalikkan komponen x ' dan membiarkan komponen y' tidak berubah . Dalam istilah matriks, ini adalah matriks diagonal dengan -1 dan 1 pada diagonal.

Maka kecepatan setelah tabrakan hanyalah: V ' = T * . M . T . Vo .

Saat dampak t adalah kemudian hanya solusi untuk ( T . Do ) + ( X . T . Vo () t ) = r di mana X adalah operator proyeksi sumbu X dan r adalah jari-jari bola. Ulang, kita memperoleh
t = ( r - ( T . Do )) / (( X . T . Vo ) ( t ))

Ini memiliki keuntungan berbeda dari mengubur semua matematika yang rumit di perpustakaan grafis standar yang ditulis, diuji, dan di-debug secara ketat. Solusi ini juga identik untuk situasi 2D dan 3D - cukup aktifkan pustaka grafis. Akhirnya, ini menyoroti bahwa seseorang harus terlebih dahulu berpikir tentang kerangka referensi yang sesuai sebelum menangani masalah fisika. Selalu ada godaan NIH, tetapi sebenarnya itu hanya resep untuk bug ketika lebih banyak solusi ringkas tersedia.

Pieter Geerkens
sumber