Saya mengembangkan permainan di mana pemain dapat menggunakan tali untuk berayun (seperti yang dilakukan Spiderman atau Bionic Commando ) dan saya mengalami masalah dalam menerapkan perilaku ini. Adakah yang bisa membantu saya bagaimana melakukan ini, maksud saya rumus fisika dan lain-lain. Sampai sekarang saya telah menghasilkan 3 ide. Salah satunya menggunakan pegas, tetapi menghabiskan banyak waktu dan kadang-kadang gelisah. Dua lainnya sedang mencoba menghitung langkah berikutnya (satu melalui menghitung energi potensial dan satu melalui menghitung torsi) dan keduanya hampir menabrak setiap kali aktor mencoba untuk mengayun.
Berikut adalah kode yang saya tulis untuk menghitung torsi:
float dx = Runner->getPosition().x - ancher.x;
float dy = Runner->getPosition().y - ancher.y;
float t0 = atan2(dy,dx); //my current angle
float k = ((dy) *vx - (dx) * vy) / (dx * dx+dy * dy); //previus angular velocity
k -= gravity * cos(t0) *dt; // new angular velocity (gravity is positive)
t0 += k * dt - acc * cos(t0) *dt * dt / 2; // rotate the rope
float dx1 = r0 * cos(t0); // new position (r0 is rope length)
float dy1 = r0 * sin(t0);
vx = (dx1 - dx) / dt; //calculate velocity
vy = (dy1 - dy) / dt;
physics
platformer
rope-physics
Ali1S232
sumber
sumber
Jawaban:
Jika Anda menginginkan ayunan kaku, sehingga jarak ke titik rotasi konstan, cukup perlakukan karakter sebagai titik pada lingkaran yang berpusat di titik rotasi. Beri dia kecepatan sudut satu dimensi (sepanjang lingkaran). Setiap frame percepatan sudut harus
accelerationDueToGravity * cos(angleOfPlayerOnCircle)
(dengan 0-derajat menunjuk ke kanan).Jika Anda ingin tali menjadi lebih panjang / lebih pendek, Anda bisa menggunakan skema di atas dan hanya memvariasikan jari-jari setiap frame.
sumber
setelah banyak upaya saya pergi dengan box2d.
ada umumnya dua pendekatan untuk simulasi ini atau setidaknya saya menemukan 2:
di setiap senario Anda harus memiliki ancher (yang dalam kasus saya adalah kotak statis). lebih baik jika Anda menurunkan berat bagian tali (baik Anda menggunakan bentuk lingkaran atau bentuk persegi panjang), misalnya untuk memiliki fisika yang lebih realistis saya mengatur kerapatan mereka menjadi 0,1 dan untuk kotak yang terhubung di ujung tali saya menggunakan kerapatan 10.
Hal lain yang perlu Anda khawatirkan bagaimana segmen tali Anda bereaksi satu sama lain. Saya hanya ingin tali saya bergerak bebas dalam adegan jadi saya menandai semua perlengkapan tali sebagai sensor. Anda mungkin perlu pendekatan yang berbeda.
hal berikutnya yang harus Anda khawatirkan adalah jumlah iterasi yang Anda ikuti untuk pembaruan dunia: untuk segmen tali yang rendah (mungkin paling banyak 8) tidak perlu menggunakan nilai iterasi tinggi, mungkin 10/10 yang disarankan oleh box2d sendiri sudah cukup tetapi jika Anda meningkatkan jumlah segmen misalnya saya mencoba 30 segmen, dengan jumlah iterasi yang rendah, tali Anda tampaknya bertambah panjang lebih dari yang seharusnya, jadi Anda mungkin perlu 40 atau 40 iterasi untuk menyelesaikan situasi tersebut.
setelah beberapa pengujian tampaknya kotak 2d dirancang untuk adegan dengan ukuran objek 0,1 m hingga 10 m dan ukuran maksimum yang disarankan untuk adegan besar adalah sekitar 50 mx 50 m. jadi pada dasarnya Anda perlu menurunkan skala objek Anda untuk mencocokkan parameter ini. dalam kasus saya, saya pertama kali mencoba untuk mengirimkan posisi piksel langsung ke box2d tetapi sepertinya ada beberapa batas kecepatan yang mencegah dunia untuk bergerak secepat yang seharusnya, jadi saya harus skala adegan saya sekitar 64 kali untuk mendapatkan hasil terbaik. Meskipun saya tidak menguji diri saya sendiri ada beberapa batasan dalam box2d yang mencegah Anda menggunakan adegan yang lebih besar. misalnya ada nilai yang ditentukan dalam
b2Setting.h
file#define b2_maxTranslation 2.0f
Anda dapat mengubah pengaturan box2d tetapi tampaknya tidak dianjurkan.sumber
Sudahkah Anda mempertimbangkan memperlambat kecepatan gerakan ayun berdasarkan seberapa jauh talinya dari garis tegak lurus (tengah)?
sumber
Ketika pemain lebih jauh dari panjang tali, pemain akan segera didorong kembali dengan kekuatan yang sama dengan jarak yang telah dia lewati. Ini harus bekerja tanpa rasa kenyal, dan harus terasa intuitif bagi pemain. Anda mungkin harus mengubah fisika Anda untuk mendapatkan hasil terbaik untuk gim Anda.
Saat talinya terpasang. Simpan
maxLength
nilai.Setiap pembaruan, periksa
distance
antaraplayer
, danattachPoint
Jika
distance
kurang darimaxLength
pembaruan biasanya, tidak ada efek dari tali.Jika jaraknya lebih besar dari
maxLength
, temukannormal
dariattachPoint
ke pemain. Dapatkan perbedaan antaradistance
danmaxLength
. Tambahkan keplayerVelocity
,normal
dikalikan dengan perbedaannya.Kode semu:
sumber
dx = player.x - attachpoint.x
dandy = player.y - attachpoint.y
.Jika Anda melihat http://www.cocos2d-iphone.org/archives/1112 ada penerapan tali dengan tubuh kaku yang melekat pada ujung tali. Menggunakan Box2D untuk mesin fisika. Jika Anda melihat kode sumbernya, saya yakin Anda bisa menerapkannya dalam bahasa apa pun yang Anda suka.
Juga, tautan di atas ke pertanyaan Rope adalah milik saya dan demo ini (tautan disediakan) di atas sangat membantu.
sumber