İki nesne arasında dönmeyi sürdürme


9

XNA oyunumda çarpışan iki nesnem var. İlk nesne diğeriyle çarpıştığında, ona kilitlenebilir ve dünya hakkında hareket edebilir. Burada matematikle ilgili bir sorunum var (Matematik benim güçlü yanım değil). Şu anda birincisine ikinci nesne mandalım var ve onunla hareket ediyorum, ama orijinal yönünü koruyamıyorum. Dolayısıyla, nesne yukarı dönükse, bu öğeyi orijinal öğeyle nasıl döndürüldüğüne göre tutmalıdır.

resim açıklamasını buraya girin

Bunu en iyi nasıl başarabileceğime dair herhangi bir ipucu var mı?


Her iki nesnenin de diğer nesnenin merkezinin ekseni etrafında döneceğini düşünüyorum.
MichaelHouse

Yanıtlar:


3

Açı söz konusu olduğunda, ikinci nesnenin açısını birincinin açısıyla aynı tutun. Konum için, iki nesne birbiriyle çarpıştığında, uzaklık formülünü kullanarak ikinci nesnenin birinciden uzaklığını bulun.

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

İkinci nesnenin birinci nesneye göre konumunu bulmak için:

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

2

@ Tesselode'un cevabına ek olarak, oyununuzdaki her dünya nesnesi için ekli nesnelerin bir listesini tutmanızı tavsiye ederim. Çizgisinde bir şey List<WorldObject> AttachedObjects. Ardından, bir çarpışma tespit ettiğinizde, kırmızı dikdörtgene siyah dikdörtgeni eklersiniz AttachedObjects. Bundan sonra, ebeveynin konumunu her güncellediğinizde sadece çocukların pozisyonlarını @ tesselode'un yöntemini kullanarak güncellemek meselesidir.


2

İkisinden birinin diğeri üzerinde kontrole sahip olacağını varsayıyorum, tıpkı bir forklift gibi. Çiziminizde, bunun siyah olan ve kırmızı olanın paket olduğunu varsayıyorum. Sadece açılarda sorun yaşadığınızı söylüyorsunuz, bu yüzden ele alacağım.

Nesneler birbirine geçtiğinde, ikisi arasındaki açı farkını hatırlamanız gerekir (buna Theta diyorum). Bunu şekil 2'de, ilk şekildeki oklar birbiri üzerine çizerek çizdim. Nesneler kilitleninceye kadar, Kırmızı nesnenin açısı, Şekil 3'te gösterildiği gibi Siyahın açısı artı Theta tarafından belirlenecektir.

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

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

Açı Farkı


1

Bir nesne için alt nesnelere sahip olma yeteneğini uygulayabilirsiniz (alt nesnelerin üst nesnenin konumu / dönüşündeki değişikliklerden otomatik olarak etkileneceği yer). Daha sonra çarpışma üzerine bir araya gelerek görünmez bir nesne yaparsınız ve her iki bağlı nesneyi de çocukları yaparsınız. Daha sonra, tek tek nesnelere dönüşüm (hareket, döndürme) uygulamak yerine, onu büyük olana uygularsınız, VEYA yine de tek tek çocuk nesnelerine, "bir ebeveynim var mı?" evet, kuvvet ebeveyne gönderilir (bu, tüm alt nesnelerden gelen kuvvetleri kendisine uygulayacağı bir vektöre birleştirir).

Ayrıca, görünmez ebeveyn için kütle merkezini, John'un yönteminin yerine getirmediği kilitli nesnelerin ağırlıklarına göre hesaplarsanız, bu yaklaşımın rotasyonunu düzgün bir şekilde ele alması gerekir (birleştirilmiş nesne yeni paylaşılan kütle merkezi etrafında döner, değil nesnelerden birinin kütle merkezinin etrafında) ve bu tür davranışları herhangi bir ek kod gerekmeden kolayca iç içe yerleştirebilirsiniz. Daha sağlam ve esnek bir yaklaşım gibi görünüyor.

+ Çocuğa uygulanan kuvvet eklemi kıracak kadar güçlü ise ve sadece ebeveyn- çocuk ilişkisini kaldırarak "mandalını" kaldırabilirsiniz. Yalnızca bir çocuk kaldıysa, onu da ayrı yapar ve görünmez ebeveyni de çıkarırsınız.

İlgileniyorsanız daha fazla ayrıntı (resim ve en azından sözde kod vb.) Sağlayabilirim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.