Untuk permainan
Frameshift pasca-apokaliptik saya
, saya perlu mengisi dunia terbuka yang sangat besar dengan beragam kota. Tim kami hanya memiliki 3 orang, jadi saya, tentu saja, menggunakan kekuatan prosedural Houdini!
Sebelumnya, ketika saya tidak tahu tentang Houdini, saya menulis di C # alat saya sendiri untuk pembuatan mesh prosedural untuk Unity. Menambahkan fitur baru adalah proses yang sangat panjang, dan ketika saya pernah mendengar bahwa Houdini dirancang untuk tugas-tugas seperti itu, saya segera beralih ke sana. Saya bereksperimen dengan berbagai cara menghasilkan kota dan jalan, dan dalam artikel ini saya akan berbicara secara singkat tentang teknik yang akhirnya saya gunakan untuk permainan.
Pertama, saya membuat alat untuk menghasilkan jaringan jalan yang bisa digunakan di kota. Keputusan saya didasarkan pada konsep yang disajikan di
sini , serta pada artikel yang digunakan sebagai referensi. Ada banyak pembicaraan tentang medan tensor dan vektor eigen, dan semuanya ditulis dengan sangat teknis, tetapi secara singkat dapat dijelaskan sebagai berikut: untuk kasus saya (membuat jaringan jalan pada relief) saya perlu membuat garis kontur lega, serta garis yang tegak lurus terhadapnya.
Saya mulai dengan bantuan, dan berkat sedikit bantuan dari contoh Houdini Gubbins, saya menghasilkan vektor di setiap titik bantuan yang diarahkan ke jalur, dan garis gradien menggunakan VEX:
Vektor kuning menunjukkan garis kontur.
Maka kita perlu membuat kisi-kisi jalan-jalan kota dan mencampur vektor-vektornya dengan vektor-vektor yang mengulangi kurva alami dari relief. Jadi kita akan menciptakan area yang menyerupai jaringan jalan-jalan kota, berpadu dengan baik dengan reliefnya. Di sini kita meletakkan grid pada relief, kemudian polyframing sehingga normals berbaris di sepanjang garis grid, menambahkan falloff untuk smooth blending dan akhirnya menetapkan path vektor baru, yang merupakan campuran dari dua vektor:
Pada gambar di atas, Anda dapat melihat bahwa di dalam batas-batas persegi panjang, garis kontur lebih seperti sebuah kisi. Saya juga melakukan proses serupa untuk menambahkan pengaruh jalan yang dibuat secara manual ke permainan. Saya memperkenalkan slider di Unity HDA sehingga pengaruhnya dapat diubah dengan membuat jalan yang lebih alami atau lebih "persegi" dalam batas kota.
Selanjutnya, saya akan mengonversi bidang vektor ke VDB sehingga Anda dapat mengambil sampel dari mereka untuk membuat jalan yang sudah jadi. Dengan pelacakan volume SOP Anda bisa mendapatkan visualisasi yang indah:
Itu sudah mulai terlihat seperti jaringan jalan! Mereka terlalu dekat satu sama lain, tetapi secara umum sudah ada bentuk. Kemudian kami melakukan banyak operasi pengambilan sampel dari kecepatan VDB dan banyak gangguan untuk membuat garis jalan yang sudah jadi. Kode gangguan pada dasarnya mengatur jalan ke jarak yang tepat dan mengakhirinya jika terlalu dekat dengan jalan lain atau terlalu panjang:
Lalu kami melakukan post-processing untuk menghaluskan semuanya, menghapus bagian-bagian kecil, memperpanjang jalan buntu untuk membuat persimpangan yang realistis, dan meletakkan jalan di medan. Hasil akhirnya terlihat seperti ini:
Masih ada beberapa bagian yang tidak realistis, tetapi sedikit pembersihan manual di Unity dapat diterima, mengingat berapa banyak waktu yang kami hemat dalam hal ini.
Jadi, kami secara prosedural menghasilkan jaringan jalan kota, tetapi hasilnya hanya sekelompok kurva di Houdini. Sekarang saya akan menunjukkan kepada Anda bagaimana menghasilkan geometri jalan untuk masing-masing kurva ini untuk membuat jerat yang dapat Anda gunakan di Unity. Ini adalah hasil kami sebelumnya yang diport ke Unity:
Pertama, Anda perlu memberi tahu bagaimana transfer data antara Houdini dan Unity dilakukan. Dalam kasus jalan, saya menulis ke file JSON urutan titik, lebar jalan, dan preset permukaan jalan. Di Unity, saya membuat alat editor untuk mengedit jalan secara manual menggunakan kurva Bezier:
Anda dapat menemukan banyak tutorial di mesin pencari tentang membuat editor kurva Bezier di Unity. Untuk mentransfer data kembali ke Houdini, saya menggunakan simpul Python untuk membaca file JSON:
Di sini Anda melihat hasil membuat jaringan jalan perkotaan, yang diperoleh di atas, tapi kali ini dibaca dari file JSON, karena sekarang diperoleh dari Unity dengan perubahan manual.
Saya juga mengimpor bantuan dari Unity, membaca data mentahnya. Mungkin hari ini dapat dilakukan secara native dengan bantuan HDA, karena Mesin Houdini telah meningkatkan dukungan untuk medan Persatuan, tetapi ketika saya melakukan pekerjaan ini, itu masih tidak begitu baik.
Lalu kita buat persimpangan. Pekerjaan utama di sini dilakukan oleh SOP Stitch Persimpangan, tapi saya juga menggunakan VEX untuk memperpanjang jalan sedikit jika mereka tidak berpotongan sepenuhnya, dan menghapus ujung pendek sehingga persimpangan T dibuat dengan benar.
Selanjutnya, saya membuat grup persimpangan dengan menggunakan falloff dari persimpangan, di mana jarak atenuasi sama dengan terluas di persimpangan jalan. Lalu saya memperluas kelompok tepi ini dalam kasus-kasus di mana sudut antara dua jalan kurang dari 45 derajat sehingga ada ruang yang cukup antara kedua ujung persimpangan untuk membuat mesh dengan lebar yang diinginkan:
Perhitungan dalam simpul VEX menemukan sisi miring dari segitiga siku-siku (kita dapat mengasumsikan bahwa setiap bagian individu dari persimpangan terdiri dari dua segitiga siku-siku):
Karena kita tahu berapa lebar jalan dari kelompok persimpangan seharusnya (ditunjukkan pada gambar di atas sebagai A) dan mengetahui sudut a, kita dapat menghitung C untuk menemukan jarak dimana kita perlu memperluas grup persimpangan untuk membaginya dengan lebar yang diinginkan.
Lalu kami membuat kelompok jembatan, menyoroti bagian jalan yang berada di atas jarak tertentu di atas tanah. Ini dilakukan dengan menggunakan Ray SOP dengan "jarak titik persimpangan" dihidupkan dan "titik transformasi" dimatikan. Selanjutnya, untuk membuat kurva siap pakai untuk geometri penutupan, kami menggunakan Polycut untuk memotong persimpangan dan grup jembatan sehingga hanya jalan biasa yang tersisa.
Dan sekarang kita akhirnya mulai membuat jerat nyata. Subnet yang membuat persimpangan persimpangan adalah versi modifikasi dari tutorial
Solving Intersections . Subnet yang menciptakan geometri jalan juga menutup garis dan menciptakan UV. Ada
tutorial hebat lainnya yang dibuat oleh HoudiniSimon. Ini memberitahu Anda cara menghasilkan UV untuk menekuk kurva tertutup, tetapi bagian pertama dari tutorial ini dapat diterapkan untuk membuka kurva.
Lalu saya baru saja membuat beberapa grup untuk menerapkan materi untuk menggunakan atribut roadPreset yang diambil dari kurva saya di Unity.
Selanjutnya kita buat geometri jembatan. Jaringan yang ditunjukkan di bawah ini secara iteratif melewati semua kelompok jembatan yang sebelumnya dibuat dan, tergantung pada ketinggian di atas tanah, panjang dan tortuositas, menyisipkan jembatan massal atau melengkung. Saya akan melihat cara membuat jembatan lengkung dalam tutorial terpisah, dan jembatan massal menggunakan SOP Gamedev Sweep Geometry yang sangat baik dengan kelompok mulai dan akhir yang disertakan untuk menutup geometri jembatan yang sebelumnya dibuat di sepanjang kurva jembatan.
Hasil:
Jaring jembatan ini terdiri dari bagian awal / akhir / tengah yang dimodelkan secara manual, dapat dideformasi dan diduplikasi sepanjang kurva menggunakan Gamedev Sweep Geometry SOP. Seperti apa bentuk geometri dan grup yang dibuat secara manual:
Grup pusat dipilih, dan ujung-ujungnya berada di bridgeStart dan kelompok bridgeEnd, yang digunakan oleh simpul penutupan geometri.
Kami menyelesaikan jembatan dengan mengekstruksinya sedikit untuk membuat tanggul jalan di mana tekstur kerikil akan diterapkan; Beberapa variabel Boolean juga ditetapkan untuk persimpangan jenis jalan tertentu. Misalnya, jika jalan tanah bersilangan dengan jalan raya, maka jalan itu terpotong.
Pada akhirnya, kami menyimpan semua geometri untuk digunakan di Unity dan di alat Houdini tambahan. Kami membagi jerat jalan menjadi fragmen yang lebih kecil dan mengekspornya sebagai FBX, dan juga menyimpan data dalam file .bgeo sehingga dapat digunakan nanti.
Dalam Unity:
Saya harap Anda menikmati deskripsi singkat ini tentang proses pembuatan geometri jalan Houdini kami. Pada posting berikutnya saya akan berbicara tentang membuat marka jalan dan meratakan medan sehingga lebih cocok dengan jalan.