urutan gambar isometrik dengan lebih besar dari gambar ubin tunggal - algoritma urutan gambar?

8

Saya memiliki peta isometrik tempat saya meletakkan berbagai gambar. Sebagian besar gambar akan muat di atas ubin tunggal, tetapi beberapa gambar sedikit lebih besar. Sebagai contoh, saya memiliki tempat tidur ukuran 2x3 ubin.

Ini menciptakan masalah ketika menggambar objek saya ke layar karena saya mendapatkan beberapa ubin yang keliru menumpuk ubin lainnya.

Dua solusi yang saya tahu adalah membagi gambar menjadi segmen ubin 1x1 atau menerapkan algoritma urutan gambar saya sendiri, misalnya dengan menetapkan setiap gambar nomor. Gambar dengan angka 1 diambil lebih dulu, lalu 2, 3 dll.

Adakah yang punya saran tentang apa yang harus saya lakukan?

Sepertinya saya suka memisahkan gambar isometrik sangat tidak jelas. Bagaimana Anda memutuskan bagian gambar mana yang 'berada' di ubin tertentu? Saya tidak dapat membagi semua gambar saya secara manual.

Algoritma draw order sepertinya pilihan yang lebih baik tetapi saya tidak yakin apakah itu akan mudah diimplementasikan. Saya tidak bisa memecahkan, di kepala saya, bagaimana menghadapi situasi di mana Anda mengubah indeks dari satu gambar, yang menyebabkan ketukan pada banyak gambar lainnya. Jika ada yang punya sumber daya / tutorial tentang ini saya akan sangat berterima kasih.

Roger Smith
sumber

Jawaban:

3

Yang Anda butuhkan disebut algoritma pelukis.

Anda ingin menggambar ubin yang paling jauh terlebih dahulu, termasuk barang-barang kecil atau karakter di dalamnya.

Kemudian gambar terdekat berikutnya, dan ulangi sampai selesai.

Objek Anda yang menjangkau lebih dari satu ubin harus memiliki jangkar / titik asal yang dinyatakan. Ini adalah sel kisi yang ketika digambar, akan menghasilkan objek yang lebih besar juga digambar. Titik asal dipilih sehingga ditarik setelah semua sel objek berdarah menjadi ditarik terlebih dahulu.

Berdasarkan pertanyaan Anda, titik asal Anda akan menjadi ubin yang paling dekat dengan kamera. (Jika Anda menggunakan kotak, bukan ubin berbentuk berlian, sebaiknya ubin bagian bawah kiri atau kanan bawah.)

Contoh kode untuk kotak-persegi. Ubah arah loop untuk jaringan berlian Anda.

for(int y = 0; y < GridHeight; ++y) {
    for(int x = GridWidth - 1; x > -1; --x) {
        MapCell cell = getMapCell(x,y);
        DrawTerrain(cell);
        if(cell.IsDoodadOrigin){
            DrawDoodad(cell);
        }
        if(cell.IsCharacterOrigin){
            DrawCharacter(cell);
        }
    }
}
Jim
sumber
Saya tidak melihat bagaimana ini bisa bekerja? Bayangkan tempat tidur 2x3 yang dikelilingi oleh kotak-kotak. Ketika iterasi melalui sel, pada saat Anda mencapai 'asal' dari objek yang lebih besar Anda sudah menggambar kotak yang seharusnya berada di belakang dan di depan tempat tidur.
Wozza
Anda benar, teknik ini akan bekerja untuk kotak persegi. Ini juga akan berfungsi untuk kisi-kisi diagonal yang menggunakan doodad / karakter persegi. Ini tidak akan berfungsi untuk bentuk 2x3 tidak beraturan pada kisi diagonal.
Jim
3

Bagilah benda-benda Anda menjadi 1 × 1 × 1 kubus, dengan menetapkan masing-masing gambar kubus dari bagian-bagian objek yang secara fisik akan berada di kubus itu.

Ini mudah jika Anda mulai dengan objek 3D aktual dan merendernya ke 2D. Jika Anda menggambar objek secara langsung dalam 2D ​​(atau jika Anda memiliki seni yang perlu Anda pisahkan), dibutuhkan upaya manual. Untungnya, perpecahan tidak perlu tepat, selama Anda memastikan bahwa tidak ada bagian gambar yang ditetapkan untuk tumpahan kubus yang diberikan di luar area heksagonal yang kubus 1 × 1 × 1 padat pada posisi itu akan menutupi. Mungkin membantu membuat hamparan yang menunjukkan garis besar setiap kubus sebagai lapisan tambahan di editor grafis Anda.

Kemudian Anda hanya menetapkan prioritas untuk setiap kubus sebagai p = x + y + z (dengan asumsi bahwa ketiga koordinat meningkat ke arah kamera) dan membuat kubus dalam urutan naik berdasarkan prioritas.


Berikut adalah contoh cepat berdasarkan gambar ini dari Wikimedia Commons (oleh Phasmatinox / Allefant , digunakan di bawah lisensi CC-By-SA 3.0 ):

        Proyeksi isometrik objek yang diperluas dibagi menjadi kubus

Laci laci di gambar mengambil dua ubin, dan saya telah menggambar batas-batas ubin (hexagon merah) di atasnya. Bagian-bagian dari gambar yang terletak di dalam setiap segi enam harus ditetapkan untuk ubin yang sesuai; bagian di mana segi enam tumpang tindih dapat ditugaskan ke salah satu petak (atau bahkan untuk keduanya, jika Anda suka), karena pilihan tidak akan mempengaruhi hasil akhir.

Perhatikan bahwa Anda mungkin perlu menguraikan algoritma sederhana ini jika Anda dapat memiliki beberapa objek dalam satu ubin, dinding / lantai di antara ubin, atau benda (seperti orang) bergerak dengan lancar di antara ubin. Dinding dan lantai cukup sederhana untuk ditangani: mereka dapat digambar kapan saja setelah isi ubin ada di depan (dari sudut pandang kamera) dan sebelum ubin ada di belakang. Ini juga merupakan aturan praktis yang berguna untuk objek yang bergerak di antara ubin; perlakukan mereka seperti dinding di antara ubin-ubin itu.

Adapun beberapa objek dalam ubin, kadang-kadang - itu cukup sederhana: misalnya, jika Anda memiliki buku yang terletak di atas dada di gambar, itu harus jelas diambil setelah permukaan itu terletak. Namun, berbagai hal bisa menjadi lebih rumit jika Anda, katakanlah, memiliki benda yang dapat diduduki orang. Misalnya, jika seseorang sedang duduk di bangku, menghadap jauh dari kamera, maka tubuh orang tersebut harus ditarik setelah bangku tetapi kaki mereka (yang berada di belakang bangku dari kamera) harus ditarik sebelum itu. Salah satu solusi, dalam hal ini, adalah dengan membagi kaki orang yang duduk menjadi komponen yang terpisah dengan posisinya sendiri (baik di ubin yang berdekatan, atau di antara ubin).

Ilmari Karonen
sumber
1

Ini dapat membantu Anda untuk mempartisi objek berdasarkan tipe atau ketinggian. Misalnya, lansekap (lantai, dinding) harus digambar sebelum benda (tempat tidur). Juga, karena perspektif isometrik, petak dengan ketinggian lebih rendah harus digambar sebelum petak yang lebih tinggi.

Juga, jika Anda menggunakan penomoran indeks (pemesanan Z, sebenarnya), saya sarankan menggunakan celah di antara angka - jangan membuat lantai 1dan tempat tidur Anda 2. Gunakan sesuatu seperti lantai = 10dan tempat tidur = 20atau 100atau sesuatu yang lain, sehingga Anda dapat "memasukkan" barang-barang di tengah tanpa menambah domino semua yang lain.

ashes999
sumber
Saya berencana melakukan apa yang Anda sarankan di paragraf pertama. Masalah yang saya alami adalah bahwa objek dengan tipe yang sama tumpang tindih secara tidak benar. misalnya tempat tidur saya tumpang tindih dengan meja samping tempat tidur. Saya menyarankan agar saya memberi setiap contoh gambar nomor yang berbeda, misalnya, tidak memberi semua tempat tidur nomor 20, misalnya?
Roger Smith
Tergantung. Bagaimana jika Anda memiliki dua tempat tidur yang bersebelahan? Salah satu cara orang sering menyiasatinya adalah dengan menambahkan objek dalam urutan yang seharusnya digambar, tetapi saya tidak tahu apakah itu akan membantu Anda.
ashes999
1
Jika dua tempat tidur bersebelahan, maka tempat tidur yang memiliki nilai y lebih tinggi harus ditarik di atas yang lain. Jika koordinatnya sama dengan y, maka yang memiliki nilai x tertinggi (dengan asumsi puncak peta adalah (0,0)
Roger Smith