Animal Crossing gibi “düşme” 3B arazisini nasıl yapabilirim?


15

Animal Crossing , dünya haritasını kaydırmanın benzersiz bir yoluna sahiptir: Karakter aşağı indiğinde, dünya bir karton tüpe yapışmış gibi üstte yuvarlanır:

Animal Crossing silindir dünyası

Bu video nasıl hareket ettiğini gösterir.

Bu efekti nasıl oluşturabilirim?


1
Bana bir etki gibi görünmüyor, kameranın izlediği çok basit bir 3D dünyasına benziyor.
James

Oyunu kesmek, dünyanın bittiği okyanusa girmenizi sağlayan bir çarpışma hatası üretebilir. Dünyanın uçlarının ötesindeki boşlukta “kıvrılmış” dünyanın parçalarını görebilirsiniz. Burada video .
Anko

Yanıtlar:


6

Benzer bir etkiye sahip Deathspank oynadıktan sonra biraz deney yapıyordum. Süper iyi çalışmak için ayarlanıp ayarlanamayacağını görmek için yeterince araştırmamış olmama rağmen, bir olasılık sadece köşe gölgelendiricinizdeki öğeleri derinliğe göre değiştirmektir. Cos (derinlik) işlevini Y ekseni değişikliğine eşleyen bir işlev çalışır. Dünyayı sadece mesafeden düşmekle kalmaz, aynı zamanda bir derinlikten daha yakınsa, dünyayı özellikle yuvarlak hissettirecek şekilde ayarlayabilirsiniz. Daha küresel görünmesi için X ekseni değeri için de aynısını yapabilirsiniz. Bu tür oyunların gerçekte böyle olup olmadığından emin değilim; deneylerim tatmin edici olmayan sonuçlar verdi, ancak oranlarla fazla oynamadım, bu yüzden daha iyi hale getirmek için falloff oranını değiştirmek kadar basit olabilir.


+1 çünkü bunu yapmamın yolu buydu. Ancak, ne demek istediğinizi 'derinlik' ile netleştirmek isteyebilirsiniz. Kameradan uzaklık veya karakterden uzaklık olabilir. Her ikisini de denemenin iyi olacağını düşünüyorum.
DaleyPaley

Maalesef partiye geç kaldım - 6 yıl gibi - ama AC durumda 'derinlik' kameradan olan mesafeye göre hesaplanıyor ... ama kamera konumu karakter konumuna dayandığı için her şey bir çeşit bağladı.
lvictorino

5

Görünüşe göre sadece "düz bir dünya" alıyor ve silindirik koordinatlarla eşleşiyor . Esasen dünyayı bir silindir üzerine sarmak. Düz bir dünyaya benzer bir şey yaptım, ama onu bir küreye sardım:

resim açıklamasını buraya girin resim açıklamasını buraya girin

Bir küre için yaptığım gibi, bir silindir için yaptığınız gibi. Dünyanız için uygun bir yarıçap seçin (silindirik koordinatlarda ρ veya "rho"). Her köşe için, dünyanızın XZ koordinatlarını alın (Y'nin yükseklik olduğu varsayılarak), ardından XZ ve yarıçap artı Y'yi kullanarak silindirik koordinatlara geçin. Y'yi eklemezseniz, düz bir silindir elde edersiniz. Sonra oyunda çizmek için Kartezyen koordinatlarına geri dönün.


3
Bahsedilmesi gereken başka bir şey, dünyanın Hayvan Geçişindeki Y boyutu, silindirin çevresinden çok daha büyüktür (sadece göz küresi ile, çünkü ufuk çizgisi çok yakındır). Bu nedenle dünya haritasının bir kısmı sadece karaktere en yakın alanlara kesilir ve bu kırpılmış alan tüm silindirin etrafına sarılır. 2B döşeme tabanlı haritayı yalnızca görünür parçalara kırpmaya benzer.
ChrisC

Mükemmel nokta. Bunun, dünyayı gerektiği gibi yükleyerek / boşaltarak bellek ayak izini küçük tutmak için de kullanılabileceğini hayal ediyorum.
MichaelHouse

5

Düzlemsel bir dünyadan silindirik bir dünyaya geçmek istiyorsunuz.

X ekseni etrafında bir dönüş (homojen koordinatlarda) şöyle görünür:

     | 1   0   0   0 |
Rx = | 0  ca  -sa  0 |
     | 0  sa   ca  0 |
     | 0   0    0  1 |

Nerede:

ca = cos(angle) and sa = sin(angle)

Açıyı hesaplamak için görüntüye bakın. Pi / 2 iptal olur ve sizde kalırsınız:

angle = offset_from_character.z - radius

Ayrıca, resme bakın. Yansıtılan noktanın açısı karakterden yatay mesafeye, küreden uzaklık dikeye bağlıdır.

new_position = character_position - vec3(0,radius,0) + Rx * vec3(0,radius+_old_position.y,0)

ufukta olan şeyleri attığınızdan emin olun, aksi takdirde tüm dünya sarılır.

Feragatname: Bunu test etmedim ve matematik uzmanı değilim, ama cevap böyle bir şey. Eğer yanılıyorsam birisi beni düzeltsin.

küresel dünya

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.