Membuat Rumput Interaktif di Mesin Unreal


Sampai baru-baru ini, rumput dalam permainan biasanya ditunjukkan oleh tekstur di tanah, bukan oleh rendering batang individu. Tetapi dengan peningkatan kekuatan besi, menjadi mungkin untuk membuat rumput. Contoh-contoh hebat dari rendering ini dapat dilihat di game-game seperti Horizon Zero Dawn dan The Legend of Zelda: Breath of the Wild . Dalam permainan ini, pemain dapat berkeliaran di padang rumput, dan, yang lebih penting, rumput merespons tindakan pemain.

Untungnya, menciptakan sistem seperti itu tidak terlalu sulit. Bahkan, artikel itu akan mengajarkan Anda hal itu! Dalam tutorial ini Anda akan mempelajari hal-hal berikut:

  • Buat bidang vektor menggunakan tangkapan adegan dan sistem partikel
  • Tekuk rumput dari pemain berdasarkan bidang vektor
Catatan: tutorial ini mengasumsikan bahwa Anda sudah mengetahui dasar-dasar bekerja dengan Unreal Engine. Jika Anda baru mengenal Unreal Engine, lihat seri sepuluh bagian tutorial Unreal Engine kami untuk pemula . Secara khusus, lihat tutorial Sistem Partikel untuk mengetahui cara menggunakan Cascade dalam tutorial ini.
Catatan: tutorial ini adalah bagian dari serangkaian tiga tutorial tentang cara bekerja dengan render target:

Mulai bekerja


Mari kita mulai dengan mengunduh materi untuk tutorial ini (Anda dapat mengunduhnya dari sini ). Unzip mereka, pergi ke InteractiveGrassStarter dan buka InteractiveGrass.uproject . Anda akan melihat bidang kecil rumput yang akan menjadi tema tutorial ini. Saya juga membuat widget untuk menampilkan target render tangkapan adegan.



Sebelum Anda mulai, Anda harus mempelajari tutorial membuat jejak kaki di salju , karena saya akan melewatkan beberapa informasi. Layak untuk mempertimbangkan bahwa penangkapan dan proyeksi juga digunakan dalam tutorial ini. Untuk menghemat waktu, saya menyiapkan tangkapan cetak biru, mirip dengan cetak biru dari tutorial di trek di salju.

Untuk memulai, mari kita lihat cara lain untuk membuat rumput interaktif. Cara yang paling umum adalah mentransfer koordinat pemain ke material rumput dan menggunakan topeng bola untuk menekuk rumput dalam radius tertentu dari pemain.

Meskipun pendekatan ini cukup baik, itu tidak skala dengan baik ketika kita ingin menambahkan lebih banyak aktor ke rumput. Untuk setiap aktor yang Anda tambahkan, Anda harus menambahkan parameter koordinat lain dan masker bulat ke materi. Metode yang lebih scalable adalah dengan menggunakan bidang vektor .

Apa itu bidang vektor?


Bidang vektor hanyalah tekstur, masing-masing piksel sesuai dengan arah. Jika Anda dulu bekerja dengan stream map, maka mereka serupa. Tetapi alih-alih memindahkan UV, kita akan menggunakan kontak Offset Posisi Dunia untuk memindahkan simpul. Berbeda dengan solusi dengan topeng bola, untuk mendapatkan arah lentur, cukup untuk bahan untuk sampel bidang vektor hanya sekali .

Mari cari tahu bagaimana Anda dapat menyimpan arah dalam suatu tekstur. Lihatlah kotak ini:


Katakanlah titik merah adalah objek yang ingin kita pindahkan. Jika kita memindahkannya ke sudut kanan bawah, maka vektor mana yang akan menunjukkan gerakan ini? Jika Anda menjawab (1, 1) , maka Anda benar! Seperti yang mungkin Anda ketahui, Anda juga dapat mewakili vektor sebagai bunga, dan dengan demikian menyimpannya dalam tekstur. Mari kita masukkan vektor ini ke dalam color picker Unreal dan lihat apa warnanya.


Seperti yang Anda lihat, arah (1, 1) kembali berwarna kuning. Ini berarti bahwa jika kita ingin menekuk rumput ke arah sumbu XY positif, maka kita harus menggunakan warna tekstur ini. Sekarang mari kita lihat warna semua vektor.


Kotak kanan bawah terlihat cukup bagus karena memiliki gradien pada kedua sumbu. Ini berarti bahwa kita dapat menyimpan vektor apa pun di kuadran ini sebagai warna, karena setiap vektor memiliki warna yang unik.

Namun ada masalah dengan tiga kuadran lainnya. Kami hanya memiliki gradien sepanjang satu sumbu, atau tidak ada gradien sama sekali. Ini berarti bahwa beberapa vektor akan memiliki warna yang sama. Misalnya, kita tidak dapat membedakan antara vektor (-1, 1) dan (0, 1) .

Ketiga kuadran ini tidak memiliki warna unik untuk setiap vektor karena kami hanya dapat mewakili warna menggunakan nilai dari 0 hingga 1. Namun, ketiga kuadran ini menggunakan nilai negatif di luar rentang ini.

Solusinya adalah mendistribusikan ulang vektor-vektor tersebut agar sesuai dengan interval dari 0 hingga 1. Ini dapat dilakukan dengan mengalikan vektor dengan 0,5 dan menambahkan 0,5 . Berikut ini visualisasi dari apa yang kita dapatkan:


Sekarang setiap vektor memiliki warna yang unik. Ketika kita perlu menggunakannya untuk perhitungan, kita cukup mendistribusikannya kembali ke interval dari -1 ke 1. Berikut adalah beberapa warna, dan arah yang sesuai setelah redistribusi:

  • (0, 0): negatif X dan Y
  • (0,5, 0,5): tidak ada gerakan
  • (0, 1): negatif X dan positif Y
  • (1, 0): positif X dan negatif Y

Sekarang mari kita belajar cara membuat bidang vektor di Unreal.

Membuat bidang vektor


Tidak seperti membuat jejak di salju, kami tidak akan melakukan penangkapan bentuk benda. Sebagai gantinya, kami akan melukis target render dengan kuas. Ini hanya akan menjadi gambar bidang vektor yang dipilih. Saya akan menyebutnya sikat arah .

Alih-alih menggambar target render dengan tumpul, kita bisa menggunakan partikel . Partikel akan menampilkan kuas arah dan dipancarkan dari pemain. Untuk membuat bidang vektor, kita hanya perlu menggunakan adegan dan hanya menangkap partikel. Keuntungan dari metode ini adalah membuat jejak sangat sederhana. Selain itu, ini memungkinkan Anda untuk dengan mudah mengelola properti seperti durasi penyimpanan trek dan ukurannya. Selain itu, partikel membuat jejak sementara sementara, karena mereka ada setelah meninggalkan area penangkapan dan kembali ke sana.

Di bawah ini adalah beberapa contoh sikat arah yang dapat kita gunakan, serta efeknya pada rumput. Perhatikan bahwa dalam contoh di bawah ini, partikelnya tidak terlihat.


Untuk memulai, mari kita buat bahan yang akan menampilkan sikat arah.

Membuat Bahan untuk Arahan


Ada dua cara untuk membuat sikat arah:

  1. Matematika: arah dan bentuk diatur di dalam materi. Keuntungannya adalah tidak memerlukan perangkat lunak pihak ketiga dan nyaman untuk bentuk sederhana.
  2. Konversi Peta Normal: Buat peta normal dari arah dan bentuk yang diinginkan. Untuk mengonversi peta menjadi bidang vektor yang sesuai, cukup bagi kami untuk menghapus saluran biru. Keuntungan dari metode ini adalah Anda dapat dengan mudah membuat bentuk yang rumit. Di bawah ini adalah contoh kuas yang akan sulit dibuat secara matematis.


Untuk tutorial ini kita akan membuat sikat secara matematis. Buka folder Bahan dan buka M_Direction . Perhatikan bahwa model naungan Unlit dipilih untuk bahan ini. Ini penting karena memungkinkan penangkapan adegan untuk menangkap partikel tanpa mempengaruhi mereka.

Agar tidak menyulitkan, kami akan membuat bahan yang akan menyebabkan rumput menjauh dari pusat partikel. Untuk melakukan ini, buat skema berikut:


Sekarang kita perlu mendistribusikan ulang. Untuk melakukan ini, tambahkan node yang dipilih dan hubungkan semuanya sebagai berikut:


Sekarang mari kita beri kuas bentuk bulat. Untuk melakukan ini, tambahkan node yang dipilih:


RadialGradientExponential mengontrol ukuran dan ketajaman keliling lingkaran. Mengalikannya dengan Particle Color memungkinkan Anda untuk mengontrol opacity partikel dari sistem partikel. Saya akan membahas ini secara lebih rinci di bagian selanjutnya.

Begini tampilannya:


Klik Terapkan dan tutup materi. Sekarang kita telah menciptakan materi, sekarang saatnya untuk memulai sistem jejak partikel.

Menciptakan sistem jejak partikel


Buka folder ParticleSystems dan buka PS_GrassTrail . Untuk menghemat waktu, saya telah membuat semua modul yang diperlukan.


Inilah cara setiap modul memengaruhi jejak rumput:

  • Spawn: frekuensi penciptaan memengaruhi kelancaran trek. Jika trek terlihat terputus-putus, maka Anda harus meningkatkan frekuensi pembuatan. Dalam tutorial ini kita akan meninggalkan nilai default (20).
  • Seumur hidup: masa jalan setapak sampai rumput kembali ke keadaan semula
  • Ukuran Awal: ukuran jejak
  • Color Over Life: karena kami menggunakan Warna Partikel dalam materi, Anda dapat mengontrol opacity di sini. Anda juga dapat mengubah kurva alfa untuk mengontrol hilangnya trek. Misalnya, Anda dapat memilih penghilangan linier, pelonggaran masuk dan / atau pelonggaran. Dalam tutorial ini, kita akan meninggalkan pengaturan default, mis. Kehilangan linear.
  • Kunci Sumbu: Digunakan untuk mengarahkan partikel ke arah pengambilan adegan
  • Rotasi Awal: digunakan untuk memastikan bahwa partikel berorientasi sepanjang sumbu yang benar (lebih lanjut tentang ini di bawah)

Pertama kita perlu mengatur materi. Pilih modul yang diperlukan dan atur Material ke M_Direction . Juga atur Mode Urut ke Usia PSORTMODE Terbaru Pertama .


Mode penyortiran ini memungkinkan Anda untuk membuat partikel baru di atas yang lama. Jika ini tidak dilakukan, maka bukan baru, tetapi partikel lama akan mempengaruhi rumput.

Berikutnya adalah durasi jejak. Pilih modul Lifetime dan atur Constant ke 5 . Berkat ini, jejaknya akan hilang dalam lima detik.


Sekarang mari kita lanjutkan ke ukuran jejak. Pilih modul Initial Size dan atur Constant ke (150, 150, 0) . Karena ini, setiap partikel akan mencakup area seluas 150 × 150.


Sekarang kita perlu membuatnya terlihat ke arah menangkap adegan. Karena adegan ditangkap dari atas, partikel harus melihat ke arah sumbu Z positif. Untuk melakukan ini, pilih modul Kunci Sumbu dan atur Bendera Kunci Sumbu ke Z.


Akhirnya, kita perlu mengatur rotasi partikel. Saat ini, warna kuas tidak selaras dengan arah yang diwakilinya. Ini terjadi karena secara default sistem partikel diterapkan dengan rotasi 90 derajat. Untuk memperbaikinya, pilih modul Rotasi Awal dan setel nilai Konstan ke -0,25 . Ini akan memutar partikel 90 derajat berlawanan arah jarum jam.


Dan hanya itu yang kita butuhkan untuk sistem partikel, jadi mari kita tutup.

Selanjutnya, kita perlu melampirkan sistem partikel pada apa yang seharusnya membuat jejak. Dalam kasus kami, kami harus melampirkannya ke karakter pemain.

Memasang Sistem Partikel


Pergi ke Karakter \ Manekin dan buka BP_Manekin . Selanjutnya, buat komponen Sistem Partice dan beri nama GrassParticles .


Selanjutnya kita perlu mendefinisikan sistem partikel. Buka panel Detail dan atur Particles \ Template ke PS_GrassTrail .


Akan aneh jika pemain bisa melihat trek di dalam gim, jadi ada baiknya menyembunyikannya. Untuk melakukan ini, nyalakan Rendering \ Owner No See .


Karena sistem partikel melekat pada pemain (pemilik), pemain tidak akan melihatnya, tetapi akan terlihat oleh yang lainnya.

Klik Kompilasi , lalu klik Mainkan . Perhatikan bahwa partikel tidak muncul untuk kamera pemain, tetapi ditampilkan pada target render.


Sejauh ini, pengambilan adegan diatur untuk menangkap semuanya . Jelas, ini tidak cocok untuk kita, karena hanya partikel yang mempengaruhi rumput. Di bagian selanjutnya, kita akan belajar cara menangkap partikel saja.

Penangkapan partikel


Jika kita menangkap partikel sekarang, kita akan melakukan pembengkokan yang tidak perlu di area tanpa partikel. Ini karena warna latar belakang target render adalah hitam. Bending terjadi karena hitam menunjukkan gerakan ke arah sumbu XY negatif (setelah redistribusi). Agar area kosong tidak mengandung gerakan, kita perlu membuat target latar belakang di-render (0,5, 0,5, 0) . Cara termudah untuk melakukan ini adalah membuat pesawat besar dan melampirkannya ke pemain.

Pertama, buat bahan untuk latar belakang. Kembali ke Browser Konten dan buka Materi \ M_Background . Kemudian hubungkan konstanta (0,5, 0,5, 0) dengan Warna Emissive .


Catatan: seperti halnya material partikel, materi apa pun yang kami tangkap harus memiliki model shader yang tidak menyala .

Klik Terapkan dan tutup materi. Kembali ke BP_Mannequin , lalu buat komponen Pesawat baru. Beri nama Background .


Selanjutnya, atur properti berikut:

  • Lokasi: (0, 0, -5000). Kami menempatkan pesawat sangat rendah sehingga tidak tumpang tindih dengan partikel apa pun.
  • Skala: (100, 100, 1). Jadi kami skala ke ukuran yang cukup untuk menutupi seluruh area tangkapan.
  • Bahan: M_Background


Seperti halnya partikel, akan aneh jika pemain melihat pesawat kuning besar di bawahnya. Untuk menyembunyikannya, nyalakan Rendering \ Owner No See .


Sekarang kita telah mengatur latar belakang, saatnya untuk menangkap partikel. Kita bisa melakukan ini dengan menambahkan sistem partikel ke daftar hanya menangkap adegan. Ini adalah daftar komponen yang akan menangkap tangkapan adegan.

Menggunakan Daftar Tampilkan Saja


Sebelum kita dapat menambahkan ke daftar acara saja, kita perlu cara untuk mendapatkan semua aktor yang mempengaruhi rumput. Salah satu cara untuk mendapatkannya adalah dengan menggunakan tag . Tag adalah string sederhana yang dapat ditetapkan untuk aktor dan komponen. Kemudian Anda bisa menggunakan node Dapatkan Semua Aktor Dengan Tag untuk mendapatkan semua aktor dengan tag yang sesuai.

Karena aktor pemain harus memengaruhi rumput, ia membutuhkan tanda. Untuk menambahkan tag, klik tombol Class Defaults . Kemudian buat tag baru di Actor \ Tag dan beri nama GrassAffector .


Karena hanya komponen yang dapat ditransfer ke daftar hanya-tunjukkan, kami perlu menambahkan tag ke komponen yang memengaruhi rumput. Pilih komponen GrassParticles dan tambahkan tag baru yang terletak di bagian Tag . Beri nama GrassAffector juga ( tidak perlu menggunakan tag ini). Ulangi hal yang sama untuk komponen Background .


Sekarang kita perlu menambahkan komponen yang mempengaruhi rumput ke daftar hanya menangkap adegan. Klik Kompilasi dan tutup BP_Mannequin . Kemudian buka Cetak Biru \ BP_Capture . Pergi ke Event BeginPlay dan tambahkan node yang disorot. Pastikan juga pin yang ditandai terhubung.


Sirkuit ini akan diulang melalui semua aktor dengan tag GrassAffector . Setelah itu dia akan memeriksa apakah aktor memiliki komponen dengan tag ini dan menambahkannya ke daftar hanya-tunjukkan.

Selanjutnya kita perlu memberitahu menangkap adegan untuk menggunakan hanya daftar hanya-tunjukkan. Pilih komponen SceneCapture dan pergi ke bagian Scene Capture . Setel Mode Render Primitif untuk Menggunakan Daftar ShowOnly .


Klik Kompilasi dan tutup cetak biru. Jika Anda mengklik Play , Anda akan melihat bahwa target render sekarang hanya menangkap partikel dan bidang latar belakang.


Di bagian selanjutnya, kita mencapai apa yang kita harapkan. Sudah waktunya untuk mengajarkan rumput menekuk!

Tekuk rumput


Pertama kita perlu memproyeksikan target render di atas rumput. Buka folder Bahan dan buka M_Grass . Kemudian buat node yang ditunjukkan di bawah ini. Setel tekstur menjadi RT_Capture .


Karena kami mendistribusikan ulang warna dalam interval dari 0 hingga 1, sebelum menggunakannya, kami perlu mendistribusikan kembali warna dalam interval dari -1 hingga 1. Untuk melakukan ini, tambahkan node yang disorot:


Sekarang kita memiliki arah lengkung, kita perlu beberapa cara untuk memutar rumput ke arah itu. Untungnya, ada simpul bernama RotateAboutAxis untuk ini. Mari kita ciptakan.


Mari kita mulai dengan kontak NormalizedRotationAxis . Seperti namanya, ini adalah sumbu di mana simpul akan berputar. Untuk menghitung, kita hanya perlu produk vektor dari arah lentur dengan (0, 0, -1) . Untuk melakukan ini, kita perlu menambahkan node yang dipilih:


Kita juga perlu menentukan RotationAngle , yaitu jumlah rotasi vertex relatif terhadap titik rotasi. Secara default, nilainya harus antara 0 dan 1, di mana 0 adalah 0 derajat dan 1 adalah 360 derajat. Untuk mendapatkan sudut rotasi, kita bisa menggunakan panjang arah lentur, dikalikan dengan rotasi maksimum.


Mengalikan dengan rotasi maksimum 0,2 akan berarti bahwa sudut rotasi maksimum adalah 72 derajat.

Menghitung PivotPoint sedikit lebih sulit, karena satu jala rumput berisi beberapa batang. Ini berarti bahwa kita tidak dapat menggunakan sesuatu seperti simpul Posisi Objek , karena itu akan mengembalikan satu titik untuk semua batang rumput.

Idealnya, Anda harus menggunakan editor 3D pihak ketiga untuk menyimpan titik pivot di dalam saluran UV. Tetapi untuk tutorial ini, kami hanya memperkirakan titik pivot. Ini dapat dilakukan dengan memindahkan dari atas ke bawah ke offset tertentu.


Untuk melakukan ini, tambahkan node yang dipilih:


Dalam tutorial ini, rumput sekitar 80 unit tinggi, jadi saya menetapkan nilai ini untuk PivotOffset .

Selanjutnya, kita perlu melakukan dua topeng. Topeng pertama memastikan bahwa akar batang tidak akan bergerak. Topeng kedua memastikan bahwa tidak ada bidang vektor yang bekerja pada rumput di luar area tangkapan.

Masking


Untuk tutorial ini, saya mengatur warna puncak rumput sehingga simpul bawah berwarna hitam dan simpul atas berwarna putih.


Untuk menutupi root, kita cukup gandakan hasil RotateAboutAxis dengan simpul Warna Vertex .


Untuk menutupi rumput di luar area tangkapan, kami gandakan hasil sebelumnya dengan simpul yang dipilih:


Klik Terapkan dan tutup materi. Klik Mainkan dan jalankan melalui rumput untuk meninggalkan jejak kaki di atasnya!


Ke mana harus pergi selanjutnya?


Proyek yang sudah selesai dapat diunduh dari sini .

Meskipun metode yang ditunjukkan dalam tutorial berfungsi baik untuk objek sederhana seperti rumput, itu tidak cukup ketika menggunakan objek yang membutuhkan lebih banyak dinamika. Solusi parsial untuk masalah ini adalah dengan menggunakan versi fisik dedaunan. Lihat posting ini tentang dedaunan interaktif untuk informasi lebih lanjut.

Akhirnya, saya ingin berterima kasih kepada Deathrey dari komunitas Unreal Engine atas tip dari metode partikel ini!

Source: https://habr.com/ru/post/id420079/


All Articles