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:
Bu video nasıl hareket ettiğini gösterir.
Bu efekti nasıl oluşturabilirim?
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:
Bu video nasıl hareket ettiğini gösterir.
Bu efekti nasıl oluşturabilirim?
Yanıtlar:
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.
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:
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.
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.