Cara mendapatkan objek kehilangan kecepatan lebih sedikit karena kecepatannya meningkat


11

Saya mengembangkan game di Flash dan saya butuh sedikit bantuan. Ini bisa dianggap sebagai masalah matematika.

Objek saya terbang dengan kecepatan Xdan objek saya bisa bertabrakan dengan batu. Ketika itu bertabrakan dengan batu, saya perlu objek saya untuk memecahkan batu dan melanjutkan, tetapi dengan kecepatan yang lebih sedikit. Sangat mudah untuk membuat hard-code dan menulis sesuatu seperti:, myVelocity -= 10;tapi masalah utama saya adalah saya ingin kehilangan lebih sedikit kecepatan semakin tinggi kecepatan awalnya.

Sebagai contoh: Jika kecepatannya 300 saya ingin kehilangan 10 dan jika 200 saya ingin kehilangan 20.

Bisakah ini dilakukan dengan semacam formula?


1
Bagaimana dengan sesuatu yang sederhana log(myVelocity + 1) * N?
Jonathan Connell

Jawaban:


6

Saya akan membalikkan kecepatan dan mengalikannya dengan sesuatu yang Anda sukai:

float velocity = 300.0f;
float collisionEffect = 3000.0f / velocity;
if (collisionEffect > velocity)
{
    // Choose which one you like: with or without restitution

    // No restitution
    collisionEffect = velocity;

    // Restitution
    collisionEffect = velocity + (collisionEffect - velocity) * 0.3f;
}
velocity -= collisionEffect;

Contoh ini memberikan efek ini:

400 loses 7.5
300 loses 10
200 loses 15
100 loses 30
 50 loses 50  // Using no restitution
 50 loses 53  // Using restitution
 20 loses 20  // Using no restitution
 20 loses 59  // Using restitution

Apa itu "restitusi"?
jprete

Restitusi memantul. Yang realistis.
Martijn Courteaux

30

sistem yang Anda dan orang lain gambarkan tidak akan menghasilkan fisika yang tampak nyata. rumus utamanya adalah untuk mengurangi 0,5 * m * v ^ 2 (energi kinematik) dengan nilai konstan setiap kali benda mengenai suatu tempat.

jadi jika sebuah benda dengan berat 2Kg mencapai beberapa blok, yang membutuhkan energi 16j sebelum rusak: kecepatan gerakan objek akan berubah sesuai tabel ini:

4  m/s -> the block will not break
5  m/s -> 3   m/s
6  m/s -> 4.4 m/s
7  m/s -> 5.7 m/s
8  m/s -> 6.9 m/s
9  m/s -> 8   m/s
10 m/s -> 9.1 m/s

7
Ini harus diterima - benar, realistis, mudah diimplementasikan, dan akan menangani semua kasus objek dan memblokir massa dan kecepatan.
Tesserex

3
Kecuali Anda memiliki efek 'fisika kartun' spesifik yang Anda harapkan untuk dicapai, menggunakan sistem yang lebih realistis hampir selalu merupakan ide yang bagus; ada beberapa cara yang lebih baik untuk memastikan Anda tidak akan mendapatkan kasus tepi yang berpotensi merusak mesin.
Steven Stadnicki

1
Jawabannya bagus, saya tahu. Tapi permainan saya diatur dalam dunia kartun dan itu tidak perlu realistis. Saya harus lebih spesifik ketika mengajukan pertanyaan.
Afra

1
ini adalah proyek komunitas, orang-orang di sini untuk menjawab pertanyaan dan untuk pertanyaan yang diajukan, ini adalah jawaban terbaik. Hanya karena Anda lebih suka solusi peretasan untuk kasus khusus Anda tidak berarti bahwa jawaban ini bukan jawaban terbaik. Dengan memilih jawaban peretasan sebagai solusi, ketika orang lain mencari situs untuk jawaban atas pertanyaan semacam ini, mereka akan menganggap bahwa jawaban yang tidak realistis adalah yang lebih baik.
Richard Fabian

1
@ Richard Solusi lain tidak hacky hanya karena tidak menggunakan fisika realistis, apakah Tetris hacky karena blok tidak jatuh dengan lancar? Jika orang menganggap jawaban yang diterima adalah yang 'lebih baik' daripada menganggap itu adalah jawaban yang memuaskan penanya, itu adalah kesalahan mereka. Semua jawaban dan suara masih jelas.
CiscoIPPhone

2

Anda belum benar-benar memberikan informasi yang cukup untuk mengetahui kisaran seperti apa yang Anda inginkan, yaitu apakah itu dibatasi, apakah Anda ingin perkembangan geometris, dll.

Hal pertama yang ingin Anda lakukan adalah mendapatkan angka yang proporsional dengan jumlah kecepatan yang ingin Anda hilangkan (tidak harus sama, tetapi harus menurun ketika kecepatan meningkat agar proporsional dengan kerugian Anda). Cara standar untuk melakukan itu adalah dengan menerima timbal balik :

temp = 1 / currentVelocity;

Sekarang, untuk 100 Anda akan memiliki 0,01, untuk 200 Anda akan memiliki 0,005, untuk 300 Anda akan memiliki 0,0033 dan seterusnya.

Sekarang Anda hanya perlu menyesuaikan nomor itu dengan apa pun yang Anda inginkan, dengan mengalikannya. Begitu

k = 3000;
newVelocity = temp * k;

akan memberi Anda 20 untuk 300, tetapi itu akan memberi Anda 15 untuk 200 daripada 10. Ini mungkin baik untuk Anda, dalam hal ini Anda tidak perlu membaca lebih lanjut. Anda dapat menyesuaikan k sesuka Anda tetapi Anda mungkin tidak mendapatkan angka dengan cara yang Anda sukai, kecuali jika Anda melakukan sedikit lagi, seperti menerapkan progresi geometris, atau mengubah dasar kenaikan. Saya tidak akan masuk ke perkembangan geometris di sini, tetapi jika Anda ingin mengubah basis, Anda melakukannya sebagai berikut:

base = 100;
temp = 1 / (currentVelocity - base);
if (temp < 0) temp = 0; //adjust temp so never less than zero, cannot gain force!

k = 2000;
velocityLoss= temp * k;
if (velocityLoss > currentVelocity) //(1) or make currentVelocity an unsigned int
    velocityLoss = currentVelocity; //(2)

Ini akan memberi Anda rentang yang semula Anda tanyakan dalam pertanyaan Anda, 300 -> kehilangan 10, 200 -> kehilangan 20. FYI 100 -> kehilangan 40, dan 50 -> kehilangan 80 (!) Yang berarti Anda Anda harus membatasi pengurangan Anda - yang telah saya lakukan pada baris (1) dan (2).

Ada cara lain untuk mendekati seluruh masalah ini, tentu saja, yang saya yakin mereka yang lebih mahir secara matematis daripada saya, akan memposting di sini.


0

Saya pikir, Anda dapat menggunakan pembagian sederhana dengan kecepatan. Misalnya: hilang = 3 000 / myVelocity. Ketika kecepatan 300, Anda akan kehilangan 10, ketika 200, Anda akan kehilangan 15. Terserah Anda untuk memilih konstanta yang benar.

Jika Anda mau, Anda bisa menggunakan rumus yang lebih kompleks, seperti: konstanta / (kecepatan konstan2 * ^ 2 + kecepatan konstan3 *). Sekali lagi - cukup pilih konstanta, yang cocok untuk Anda.


itu sepenuhnya terbalik dari apa yang dia minta dan apa yang terjadi dalam fisika nyata.
Ali1S232

Aku tidak mengerti kamu Apa yang terbalik?
zacharmarz

Saya kira saya salah mengerti jawaban Anda, salah saya.
Ali1S232
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.