Menjaga rotasi di antara dua objek


9

Dalam game XNA saya, saya memiliki dua objek yang bertabrakan. Ketika objek pertama bertabrakan dengan yang lain, ia dapat menempel padanya dan memindahkannya ke dunia. Saya mengalami masalah dengan matematika di sini (Matematika bukan poin kuat saya). Saat ini saya memiliki objek kedua menempel ke yang pertama dan bergerak dengan itu, tetapi saya tidak bisa mendapatkannya untuk menjaga arah aslinya. Jadi, jika benda itu menghadap ke atas, ia harus menjaga arah ini relatif terhadap bagaimana benda itu diputar dengan benda aslinya.

masukkan deskripsi gambar di sini

Adakah kiat tentang cara terbaik untuk mencapainya?


Saya pikir kedua objek akan berputar pada sumbu pusat dari objek lainnya.
MichaelHouse

Jawaban:


3

Sejauh menyangkut sudut, jaga agar sudut benda kedua sama dengan sudut benda pertama. Untuk posisi, ketika kedua objek bertabrakan satu sama lain, cari jarak objek kedua dari yang pertama menggunakan rumus jarak.

distance = math.sqrt((x2 - x1)^2 + (y2 - y1)^2)

Untuk menemukan posisi objek kedua relatif terhadap objek pertama:

x2 = x1 + distance * math.cos(angle)
y2 = y1 + distance * math.sin(angle)

2

Selain jawaban @ tesselode, saya sarankan Anda menyimpan daftar objek terlampir untuk setiap objek dunia dalam gim Anda. Sesuatu di sepanjang garis List<WorldObject> AttachedObjects. Kemudian, ketika Anda akan mendeteksi tabrakan, Anda akan menambahkan persegi panjang hitam ke yang merah AttachedObjects. Setelah itu, hanya masalah memperbarui posisi anak-anak menggunakan metode @ tesselode setiap kali Anda memperbarui posisi orang tua.


2

Saya berasumsi salah satu dari dua akan memiliki kontrol atas yang lain, seperti garpu-angkat. Dalam gambar Anda, saya berasumsi ini adalah yang hitam, dan yang merah adalah paket. Anda hanya menyebutkan bahwa Anda memiliki masalah dengan sudut, jadi itu saja yang akan saya bahas.

Ketika benda-benda saling menempel, Anda harus ingat perbedaan sudut antara keduanya (saya akan menyebutnya Theta). Saya telah menggambar ini pada gambar 2 dengan panah dari gambar pertama yang ditarik satu sama lain. Sampai objek tidak terkunci, sudut objek Merah akan ditentukan oleh sudut Hitam plus Theta, seperti yang ditunjukkan pada Gambar 3.

// When Latching:
theta = Red.angle - Black.angle;

// When retrieving Red's angle:
Red.angle = Black.angle + theta

Sudut diff


1

Anda bisa menerapkan kemampuan untuk memiliki objek anak untuk objek (di mana objek anak akan secara otomatis dipengaruhi oleh perubahan posisi / rotasi induk). Kemudian pada saat tabrakan ketika mereka harus menempel bersama-sama, Anda membuat objek yang tidak terlihat dan membuat kedua objek yang dilampirkan menjadi anak-anak. Kemudian, alih-alih menerapkan transformasi (gerakan, rotasi) pada objek individual, Anda menerapkannya pada objek besar, ATAU Anda masih bisa menerapkan kekuatan pada objek individual anak-anak, yang akan memeriksa "apakah saya punya orangtua?", Dan jika ya, gaya akan dikirim ke induk (yang akan menggabungkan kekuatan dari semua objek anak menjadi satu vektor yang akan berlaku untuk dirinya sendiri).

Juga, pendekatan ini harus benar menangani rotasi mereka, jika Anda menghitung pusat massa untuk induk tak terlihat sesuai dengan bobot objek latch, yang tampaknya metode John tidak mencapai (objek bergabung berputar di sekitar pusat massa bersama baru mereka, tidak sekitar pusat massa salah satu objek), dan Anda dapat dengan mudah menyarangkan perilaku semacam ini tanpa memerlukan kode tambahan. Tampaknya menjadi pendekatan yang lebih kuat dan fleksibel.

+ kondisi jika gaya yang diberikan pada anak cukup kuat untuk mematahkan sendi, dan Anda dapat menangani "unlatching" itu dengan hanya menghapus hubungan orangtua-anak. Jika hanya ada satu anak yang tersisa, Anda membuatnya terpisah juga dan menghapus juga orang tua yang tidak terlihat.

Saya dapat memberikan lebih banyak detail (dengan gambar dan setidaknya kodesemu dan semacamnya) jika Anda tertarik.

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.