Bagaimana saya bisa membuat medan 3D "jatuh" seperti Animal Crossing?

15

Animal Crossing memiliki cara unik untuk menggulir peta dunia: Ketika karakter bergerak ke bawah, dunia berguling-guling di bagian atas, seperti tersangkut di tabung karton:

Animal Crossing adalah dunia silinder

Video ini menunjukkan bagaimana ia bergerak.

Bagaimana saya bisa membuat efek ini?

Chris
sumber
1
Tidak terlihat seperti efek bagi saya, sepertinya dunia 3D yang sangat sederhana yang hanya diikuti oleh kamera.
James
Meretas permainan dapat menghasilkan kesalahan tabrakan yang memungkinkan Anda berjalan ke lautan di mana dunia berakhir. Anda dapat melihat serpihan-serpihan dunia yang diterjemahkan "melengkung kembali" dalam kekosongan di luar batas dunia.Video di sini .
Anko

Jawaban:

6

Saya bereksperimen sedikit setelah bermain Deathspank, yang memiliki efek serupa. Meskipun saya tidak pernah menggali cukup dalam untuk melihat apakah itu bisa disetel agar bekerja dengan sangat baik, satu kemungkinan adalah hanya memodifikasi item di vertex shader Anda berdasarkan kedalaman. Fungsi pemetaan cos (kedalaman) ke modifikasi sumbu Y bekerja. Anda dapat menyesuaikannya sedemikian rupa sehingga dunia tidak hanya turun di kejauhan tetapi juga jika lebih dekat dari beberapa kedalaman, membuat dunia terasa bulat. Anda dapat melakukan hal yang sama untuk nilai sumbu X untuk membuatnya tampak lebih bulat. Saya tidak yakin apakah ini benar-benar permainan seperti itu; eksperimen saya memberikan hasil yang tidak memuaskan, tetapi saya tidak bermain dengan banyak rasio, jadi mungkin semudah mengubah tingkat falloff untuk membuatnya lebih baik.

Sean Middleditch
sumber
Memberi +1 karena ini adalah cara saya akan melakukannya. Namun, Anda mungkin ingin mengklarifikasi apa yang Anda maksud dengan 'mendalam'. Bisa jarak dari kamera, atau jarak dari karakter. Saya pikir akan lebih baik untuk bereksperimen dengan keduanya.
DaleyPaley
Maaf saya terlambat ke pesta - seperti 6 tahun terlambat - tetapi dalam kasus AC 'kedalaman' dihitung berdasarkan jarak dari kamera ... tetapi karena posisi kamera didasarkan pada posisi karakter semuanya seperti terhubung.
lvictorino
5

Sepertinya itu hanya mengambil "dunia datar" dan memetakan ke koordinat silindris . Pada dasarnya membungkus dunia dengan sebuah silinder. Saya melakukan sesuatu yang mirip dengan dunia yang datar, tetapi saya membungkusnya dengan bola:

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Cara saya melakukannya untuk bola mirip dengan cara Anda melakukannya untuk sebuah silinder. Pilih radius yang sesuai (ρ atau "rho" dalam koordinat silindris) untuk dunia Anda. Untuk setiap titik, ambil koordinat XZ dari dunia Anda (dengan asumsi Y adalah tinggi), lalu diam-diam ke koordinat silinder menggunakan XZ dan jari-jari ditambah Y. Jika Anda tidak menambahkan Y, Anda akan mendapatkan silinder datar. Kemudian konversikan kembali ke koordinat Cartesian untuk menggambar di dalam game.

MichaelHouse
sumber
3
Hal lain lagi, dimensi Y dunia dalam Animal Crossing jauh lebih besar daripada keliling silinder (hanya dengan melihatnya, karena garis cakrawala sangat dekat). Oleh karena itu beberapa bagian dari peta dunia dipangkas hanya untuk area yang paling dekat dengan karakter dan area yang dipangkas akan dililitkan di seluruh silinder. Ini mirip dengan memotong peta berbasis ubin 2D hanya untuk bagian yang terlihat.
ChrisC
Poin luar biasa. Saya membayangkan itu juga dapat digunakan untuk menjaga jejak memori kecil dengan memuat / membongkar dunia sesuai kebutuhan.
MichaelHouse
5

Anda ingin pergi dari dunia planar, ke dunia silindris.

Rotasi di sekitar sumbu x (dalam koordinat homogen) terlihat seperti ini:

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

Dimana:

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

Untuk menghitung sudut, lihat gambar. Pi / 2 dibatalkan dan Anda dibiarkan dengan:

angle = offset_from_character.z - radius

Juga, lihat gambar. Sudut titik yang diproyeksikan tergantung pada jarak horizontal dari karakter, jarak dari bola tergantung pada vertikal.

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

pastikan untuk menyisihkan hal-hal yang ada di cakrawala, jika tidak seluruh dunia akan membungkusnya.

Penafian: Saya belum menguji ini dan saya bukan ahli matematika, tetapi jawabannya adalah seperti ini. Seseorang tolong perbaiki saya jika saya salah.

dunia bola

DaleyPaley
sumber