Anatomi Sistem Partikel
Sebuah sistem partikel pada dasarnya adalah
sebuah formalisme matematika yang digunakan untuk menggambarkan fenomena seperti
- Dinamis dan waktu
tergantung
- Sangat paralel dengan
komponen individu kecil
- Kompleks
Contoh perilaku tersebut termasuk asap dari
cerobong asap, api, burung terbang pada sekelompok ternak, kepingan salju, dan ratusan fenomena lainnya. Sistem partikel adalah
konteks sensitif, yang berarti mereka dapat digunakan untuk model yang sangat berbeda situasi. Sistem
partikel adalah alat, tapi tidak berarti menggunakan kasus spesifik itu sendiri. Dengan mengubah beberapa komponen
bagian, bisa disesuaikan dengan masalah, asalkan mengikuti filsafat global yang diuraikan sebelumnya.
Sistem partikel diperkenalkan pada awal tahun
1980 oleh Pixar (kemudian bagian dari efek Lucasfilm khusus kelompok) untuk film Star Trek II: The Wrath of
Kahn. Secara khusus, sistem partikel digunakan untuk mewakili ledakan reaksi berantai di permukaan planet,
sehingga planet ini berubah dari melihat, mati tandus kepenuh hidup ekosistem.
Sebuah sistem partikel fundamental terdiri dari
berbagai partikel, masing-masing berubah secara dinamis sesuai beberapa didirikan rutinitas. Anda dapat model
hujan individu bereaksi terhadap gravitasi dan angin, burung
melaksanakan rutinitas AI sederhana, dan
sebagainya. Semua partikel telah parameter yang sama mengendalikan tampilan dan perilaku. Tapi karena mereka berkembang dalam
ekosistemnya, masing-masing mengikuti evolusi sedikit berbeda, dan yang diinginkan kompleksitas muncul secara alami.
Lokal Versus global Partikel Sistem
Sistem partikel secara luas dapat dibagi menjadi
dua kelompok besar, yang disebut sebagai lokal dan global. Sebuah sistem lokal terdiri dari sekelompok partikel yang berperilaku seolah-olah
masing-masing sendirian. Dengan demikian, interaksi antara partikel tidak dipertimbangkan, dan semua
perhitungan lokal untuk partikel saat ini. Pada ujung lain dari spektrum, sistem partikel global
yang melibatkan partikel yang berinteraksi dan bereaksi terhadap setiap lainnya. Dalam sistem partikel, perilaku setiap
partikel individual tergantung sebagian pada sendiri karakteristik, tetapi juga pada interaksi dengan
anggota kelompok lainnya.
Banyak kali sistem lokal tidak lain adalah
sebuah penyederhanaan dari sistem global. Sebagai contoh, perhatikan kelompok daun jatuh dari pohon, ditiup angin. Jika Anda
ingin model dengan akurat, Anda perlu mempertimbangkan perubahan lintasan jika dua atau lebih daun
bertabrakan, membuat perilaku daun tunggal tergantung pada sisanya. Jelas, ini akan menghasilkan sistem
partikel global. Tapi banyak permainan lebih memilih untuk mengabaikan tumbukan
daun dan, dengan menyederhanakan simulasi,
menerapkannya sebagai sistem partikel lokal.
Ketika Anda akan segera menemukan, kedua
kelompok memiliki kelebihan yang berbeda dan masalah, dan memerlukan spesifik pemrograman teknik. Jelas, sistem partikel
global yang menghasilkan jauh lebih kompleks dan menarik
perilaku. Tetapi kekayaan tidak datang secara
gratis. Menghitung pengaruh partikel lain biasanya akan meningkatkan biaya komputasi kami secara
signifikan. Jadi, sistem partikel global harus ditangani dengan benar.
Struktur Partikel data
Mendefinisikan struktur data partikel berarti
menjawab "apa" pertanyaan: Apa yang kita pemodelan? Apakah akan
menjadi api, asap, atau air? Jelas, fenomena yang berbeda akan membutuhkan
parameter partikel yang berbeda.
Ketika memilih struktur data partikel, penting untuk
membuat satu set parameter yang bersifat cukup tapi tidak kembung. Mengingat
sifat paralel dari sistem partikel, memiliki parameter berlebihan akan
meningkatkan
jejak memori, sedangkan memiliki parameter
kontrol terlalu sedikit akan menurunkan kualitas visual sistem.
Sistem partikel secara tradisional ditangani
dengan barang-barang bergerak cepat tanpa interaksi di antara mereka. baik itu Ledakan
bunga api, hujan, atau air, struktur yang mendasari hampir identik. Berikut
adalah partikel asli struktur diambil dari Kertas SIGGRAPH mani Reeves (lihat
referensi di Lampiran E, "Lebih lanjut Membaca"):
- posisi
- Kecepatan (vectorial)
- Ukuran
- Warna
- Transparansi
- Bentuk
- Lifetime
Struktur ini digunakan untuk membuat beberapa efek agak maju dalam Star
Trek II: The Wrath of Kahn. kita bisa membagi menjadi dua kelompok parameter
yang berbeda:
- Parameter yang
berhubungan dengan perilaku partikel
- Parameter yang
berhubungan dengan tampilan partikel
Parameter perilaku harus cukup untuk
mengimplementasikan simulator partikel menarik. Dengan demikian, adalah penting
untuk menganalisis jenis perilaku kita mencoba untuk mensimulasikan, untuk
memahami parameter yang diperlukan. Tempat terbaik untuk mengumpulkan informasi
ini dari buku pegangan fisika, terutama yang berurusan dengan dinamika untuk partikel
atau badan kaku. Mempelajari kekuatan Anda akan berlaku untuk partikel. Apakah
Anda perlu gesekan? Kecepatan?Percepatan? Cobalah untuk memahami peran
global-lingkup konstanta. Misalnya, tidak masuk akal untuk memiliki setiap
partikel menyimpan gravitasi konstan. Bahwa nilai akan sama dalam semua mereka.
Di sisi lain, berat setiap partikel mungkin berguna dalam beberapa keadaan.
Begitu Anda telah menentukan parameter yang perilaku simulator Anda
membutuhkan, Anda akan perlu menentukan mereka parameter berurusan dengan
tampilan partikel. Berikut kemungkinan hampir tak terbatas. Anda pasti akan membutuhkan
warna partikel, pencampuran mode, ukuran, dan tekstur pengenal, tetapi
kebanyakan sistem partikel perlu banyak lebih parameter. Untuk partikel padat,
Anda mungkin perlu untuk menentukan jala akan Anda gunakan untuk melukis
partikel animasi counter, lingkaran cahaya, dan puluhan fitur lainnya. Berikut
saran yang terbaik adalah untuk memisahkan partikel render dari loop simulasi,
sehingga Anda dapat menguji melukis satu partikel dalam program yang terpisah. Ini
cara ini Anda dapat menyempurnakan hasil visual dan memutuskan mana parameter
Anda partikel penyaji perlu menyampaikan tampilan yang tepat.
Sistem Generik Partikel
Sekarang kami memiliki pemahaman global apa sistem partikel, mari kita
melihat lebih dekat bagaimana kita bisa menerapkannya. Perhatikan definisi
kelas berikut untuk sistem partikel dasar:
class
particlesystem
{
particle
*data;
int
numparticles;
public:
void
create(int); // creates a system of n particles
void
recalc();
void
render();
private:
void
spawn(int); // spawns particle n
void
affect(int) // affect particle n by outside forces
};
Perhatikan bagaimana kita perlu spawn and affect rutinitas secara partikel. Kedua rutinitas menerapkan inti sistem:
bagaimana partikel yang lahir dan apa proses simulasi mereka menjalani. Kedua
rutinitas bisa benar-benar menjadi bagian dari sebuah kelas partikel, jika
diperlukan, untuk lebih memperjelas kode.
Pemijahan Partikel
Partikel dibuat pada beberapa jenis emitor, yang menginisialisasi
parameter mereka. Jika kita ingin sistem kami untuk berperilaku dengan cara
yang menarik, kuncinya adalah untuk menghasilkan partikel masing-masing dengan
nilai awal yang sedikit berbeda, sehingga aturan perilaku (yang dimiliki oleh
semua partikel) membuat setiap melihat seorang seperti unsur unik.
Berbagai emitter telah sering digunakan. Yang paling terkenal adalah
emitor titik, yang menghasilkan semua partikel pada suatu titik dalam ruang,
seperti dalam ledakan. Namun ledakan tidak dilahirkan di satu titik dalam
ruang. Bahkan, hanya Big Bang terjadi seperti ini, dan kami bahkan tidak yakin
tentang itu. Ledakan di dunia nyata memiliki volume dan bentuk, sebagai
partikel api muncul dari objek meledak. Jadi, kadang-kadang kita akan
mengacaukan titik, sehingga partikel yang lahir di daerah sekitarnya,
tetapi tidak cukup pada titik. Ini adalah sangat pendekatan umum dalam
penciptaan sistem partikel: menambahkan jumlah keacakan sehingga hasil tidak
terlihat terlalu teratur dan algoritmik. Misalnya, untuk titik emitor kami,
kami akan menggunakan sesuatu seperti ini:
point
pos(3,5,4); // particles are born in 3,5,4
pos.x
+= ((float)rand()%2000-1000)/1000;
pos.y
+= ((float)rand()%2000-1000)/1000;
pos.z += ((float)rand()%2000-1000)/1000;
Tiga baris terakhir menerapkan distorsi dari satu ke segala arah, positif
atau negatif. Jadi sebenarnya Volume partikel muncul dari satu sisi kubus
berpusat pada 3,5,4. Filosofi ini sangat berakar dalam disiplin ini yang bahkan
memiliki nama: jittering, yang menggambarkan penambahan jumlah terkontrol kebisingan
untuk mengurangi tampilan algoritmik simulasi.
Ada juga bentuk lain dari emitter. Untuk mensimulasikan salju atau
hujan, misalnya, Anda mungkin akan menggunakan 2D poligon selaras dalam pesawat
XZ. Berikut adalah kode sumber untuk menghitung seperti poligon:
point
pos(3,5,4); // particles are born in 3,5,4
pos.x
+= ((float)rand()%2000-1000)/1000;
pos.z += ((float)rand()%2000-1000)/1000;
Dalam hal ini saya telah membuat sebuah persegi, yang sangat umum.
Bentuk 2D lain dapat diterapkan juga. Jenis ketiga emitor direferensikan dalam
hal posisi pemain. Bayangkan bahwa Anda perlu untuk mensimulasikan hujan.
Sangat mungkin, Anda tidak akan mengisi tingkat seluruh permainan dengan
ratusan ribu hujan individu. Ini hanya tidak masuk akal karena tetesan air
hujan jauh tidak akan terlihat. Dalam skenario ini, akan menjadi besar untuk menghasilkan
hujan tepat di mana pengguna dapat melihat paling, yang langsung di depannya.
Jadi, kita menghasilkan hujan di koordinat reguler kami, dan kemudian
menerjemahkan dan memutar ke posisi akhir sistem partikel dan rotasi. Berikut
adalah contoh bagaimana untuk menghasilkan partikel ini. Saya berasumsi fov
adalah bukaan horizontal kamera, dan distnear and distfar adalah
berbagai jarak kita ingin mengisi dengan partikel:
float
dist=distnear+(distfar-distnear)*((float)rand()%1000)/1000;
float
angle=fov*(((float)rand()%2000)-1000)/1000;
point
p(dist*cos(angle),0,dist*sin(angle));
p.rotatey(camera_yaw);
p.translate(camera_position);
Kode ini menghasilkan partikel tepat di depan kamera, sehingga mereka
memenuhi layar tetapi tidak pergi ke mana saja lain. Hanya partikel kita
benar-benar perlu dipertimbangkan. Tipe lain dari emitor adalah emitor layar
berbasis, yang digunakan untuk efek partikel yang dihitung layar ruang, seperti
jejak air yang ditinggalkan oleh hujan di permukaan kamera. Partikel ini lahir mana
saja, tapi selalu direferensikan ke kamera viewport. Jadi, mereka menghasilkan
sedikit berbeda. Sebuah 2D sistem partikel diberikan dengan pipa 3D dimatikan,
seperti mesin sprite dari masa lalu.
Generasi dari partikel tidak terlalu kompleks, itu hanya partikel pada
persegi panjang 2D. Berikut adalah kode:
pos.x
+= SCREENX*((float)rand()%2000-1000)/1000;
pos.y +=
SCREENY*((float)rand()%2000-1000)/1000;
Kode ini mengasumsikan bahwa SCREENX, SCREENY memegang resolusi dalam
pixel di layar. Jelas, sebagian besar kompleksitas sistem ini tidak dalam
pemijahan partikel, tetapi dalam rendering yang sebenarnya. Anda dapat melihat berbagai
jenis emitter pada Gambar 19.1.
Gambar 19.1. Emitter untuk efek yang berbeda.
Setelah kita memiliki emitor, sekarang saatnya untuk beralih ke
parameter berikutnya. Kecepatan awal harus ditentukan. Beberapa pilihan populer
di sini adalah kecepatan arah (semua partikel bergerak dalam arah yang sama), kecepatan
radial (partikel bergerak menjauh dari pusat), rotasi (seperti dalam tornado),
atau acak. Masing-masing harus dilaksanakan dengan tingkat tertentu dari
jitter, partikel sangat berbeda memiliki sedikit berbeda parameter dan
karenanya evolusi.
Parameter lainnya dapat disetel sebagai ini: Warna, alpha (sangat
penting jika partikel memudar saat mereka mati), texturing koordinat, dan
sebagainya semua harus diatur. Selain itu, kita perlu menetapkan usia partikel siklus
hidup dan parameter. Ini dapat diimplementasikan dengan dua cara: Anda dapat
mengatur usia partikel ke nol dan memiliki parameter kedua itu adalah waktu
untuk hidup partikel. Pada setiap tick simulasi, Anda meningkatkan usia sampai
waktu untuk hidup (yang tidak lain adalah counter) tercapai, dan partikel yang
tewas dan respawned di tempat lain. Karena kutu simulasi biasanya tetap
panjang, kita mendapatkan perangkat-independen kecepatan.
Alternatif adalah untuk membangun bukan usia, tetapi instan di mana
partikel itu melahirkan. Anda akan mendapatkan yang dari sistem dengan
panggilan untuk timeGetTime (), menyimpannya, dan kemudian menggunakannya untuk
perhitungan usia. Pada dasarnya, pada setiap loop Anda akan recompute waktu
saat ini dengan timeGetTime (), kurangi waktu lahir dari nilai kedua (dengan
demikian menghitung usia dalam milidetik partikel), dan membandingkannya dengan
waktu untuk hidup, yang juga merupakan periode waktu yang tidak hanya loop
counter seperti dalam kasus sebelumnya. Seperti biasa,programmer yang berbeda
lebih memilih satu pendekatan atau yang lain karena alasan pribadi.
Partikel Perilaku
Jika struktur partikel mencoba untuk mendefinisikan apa yang kita akan
mensimulasikan, mesin perilaku harus berusaha untukmeniru bagaimana fenomena
tertentu berkembang dari waktu ke waktu. Apakah ini akan menjadi simulasi
berbasis fisik, atau akan itu stokastik? Pilihan yang paling umum adalah untuk
menerapkan beberapa jenis dinamika pada partikel sehingga mereka meniru
fenomena dunia nyata.
Mari kita lihat beberapa contoh meningkatnya kompleksitas. Untuk mulai
dengan, bayangkan bahwa kita harus membuat partikel hujan sistem, mencoba untuk
mendapatkan efek hujan meyakinkan berat. Air hujan bergerak dengan kecepatan
yang sangat tinggi sebagai mereka jatuh ke tanah, sehingga kita bisa membuat
asumsi bahwa mereka tidak terpengaruh oleh angin atau lainnya eksternal kekuatan.
Membuat objek cepat mengubah arah sulit, karena kekuatan yang kita butuhkan
untuk memasok untuk itu meningkatkan dengan kecepatan. Dengan demikian, air
hujan kami yang melahirkan dengan algoritma yang sama dengan yang dijelaskan
dalam sebelumnya bagian, dan kita hanya perlu recompute posisi mereka.
Sekarang, dari fisika yang sangat dasar Anda tahu bahwa
Position = initial position +
velocity*time
Mengambil ini sebagai persamaan diferensial untuk jangka waktu singkat,
kita dapat menulis ulang untuk membentuk
dPosition = Velocity*dt
Dimana dPosition adalah perubahan posisi, Velocity adalah kecepatan
sesaat pada titik waktu tertentu, dan dt adalah diferensial waktu kita ingin
mengevaluasi perbedaan posisi masuk Berikut kita mengasumsikan bahwa Kecepatan
ini berlaku sepanjang detik dt, yang umumnya palsu. Kami mengambil satu sampel
dan generalisasi untuk interval waktu. Hal ini membuat jenis simulator, yang
disebut Euler Integrator, sangat labil sistem yang lebih kompleks. Tapi untuk
sistem partikel, ini adalah cara untuk pergi karena kesederhanaan mereka dan keanggunan.
Jadi bagaimana kita mengubahnya ke dalam menjalankan kode? Kita mengganti dt
bagi perbedaan di antara kutu simulasi berturut-turut dan menggunakan kecepatan
arus sebagai parameter kecepatan. Sekarang, kita dapat menggabungkan dasar
fisika Newtonian ke dalam persamaan. Mari kita tinjau bagaimana ini bisa
bekerja, dimulai dengan persamaan
F=m*a
Akan menjadi
a=F/m
Tapi tetap percepatan adalah derivatif kedua posisi, seperti dalam
a=d2x/dt2
Jadi sekarang kita memiliki hubungan dasar antara cinematics (akselerasi)
dan dinamika (pasukan). dasarhukum cinematics kemudian dapat ditulis kembali
sebagai
v=dx/dt
a=dv/dt
Dan dengan demikian harus kita lakukan adalah mewakili kekuatan dan
menghitung percepatan yang didasarkan pada mereka. Ambil, Misalnya, gravitasi,
sebagaimana diatur dalam ekspresi
f=m*g
dimana g = (0, -9.8,0). Lain, pasukan yang lebih menarik dapat diwakili
juga. Berikut adalah ekspresi untuk tarik kental, yang disebabkan oleh
proyektil mencoba menyeberang media yang menawarkan perlawanan. Tarik kental
sebanding dengan kecepatan, sehingga objek lebih cepat memiliki kekuatan yang
lebih besar menentang mereka. Dalam persamaan, kd adalah media yang tergantung
konstan disebut koefisien drag:
F = -kd * (dx/dt) = -kd * v
Sebuah hukum, ketiga menarik mengatur perilaku partikel dihubungkan oleh
pegas elastis. Setiap musim semi memiliki panjang ideal, jadi jika kita kompres
dengan menggerakkan dua partikel ini lebih dekat dengan panjang istirahat,
kekuatan akan mencoba untuk memisahkan mereka. Jika kita mencoba untuk
memisahkan mereka di luar panjang istirahat, gaya akan menentang itu juga. Ini hukum
disebut Hooks Hukum Semi dan sangat menarik karena merupakan titik awal menarik
fisika simulasi teknik. Berikut adalah persamaan lengkap:
Ini adalah sepotong mengesankan matematika, tapi jangan ditunda olehnya.
Prosedur kami akan selalu sama. Beberapa jenis pasukan digambarkan pada Gambar
19.2. Berikut adalah algoritma untuk menghitung keseluruhan fisika berbasis
partikel sistem:
1. Hitung jumlah dari pasukan berinteraksi dengan partikel pada suatu
titik waktu tertentu.
2. Turunkan percepatan dari pasukan.
3. Gunakan perbedaan waktu untuk menghitung perubahan posisi dan
kecepatan menggunakan integrasi Euler.
Gambar 19.2. Beberapa kemungkinan kekuatan yang dapat bertindak pada
partikel.
Berikut ini, misalnya, kode yang diperlukan untuk menerapkan perilaku
mesin yang mengambil gravitasi dan konstanta lateral yang berlaku (seperti
vektor angin) menjadi pertimbangan. Ini dapat digunakan untuk membuat semacam
air mancur panas efek:
for
(i=0;i<num_particles;i++)
{
elapsed_time=(timeGetTime()-time_last_call)/1000.0;
// in seconds
//
first, compute forces
point
gravity_force=particle[i].weight*gravity;
point
wind_force=(...) // compute wind
point
total_force=gravity_force+wind_force; // resulting force on particle
// second,
derive accelerations
point
accel=total_force/particle[i].weight;
//
third, integrate
particle[i].velocity+=accel*elapsed_time;
particle[i].position+=particle[i].velocity*elapsed_time;
}
Jadi sebenarnya cukup mudah untuk membuat partikel berbasis simulasi fisik.
Namun, banyak perilaku yang didefinisikan estetis, tidak secara fisik. Perlu
diingat bahwa ketika Anda membuat sistem partikel Anda. Ambil, Misalnya, kolom
asap. Lintasan asap benar-benar sulit untuk mensimulasikan fisik. Asap itu arah
tergantung pada temperatur, angin, bahan kimia yang terkandung dalam asap, dan
sejumlah faktor kita hanya tidak dapat mempertimbangkan dalam permainan
real-time. Jadi, asap biasanya simulasi estetis, tidak secara fisik. Jika Anda
berpikir tentang hal itu, segumpal asap pada dasarnya adalah serangkaian
partikel asap (masing-masing diberikan baik dengan quad asap tekstur).
Partikel-partikel ini memancarkan dari satu titik dengan kecepatan di positif vertikal
arah. Ketika mereka naik, mereka dipengaruhi oleh kekuatan-kekuatan yang kompleks,
yang membuat bentuk kolom entah bagaimana menarik tetapi juga sulit untuk mensimulasikan.
Berikut adalah simulator asap cukup populer:
for
(i=0;i<num_particles;i++)
{
elapsed_time=(timeGetTime()-time_last_call)/1000.0;
// in seconds
//
first, compute forces
point
wind_force=noise(particle[i].position);
point
raise_force(0,1,0); // due to temperature smoke always rises
point
total_force=wind_force; // resulting force on particle
//
second, derive accelerations
point
accel=total_force/particle[i].weight;
//
third, integrate
particle[i].velocity+=accel*elapsed_time;
particle[i].position+=particle[i].velocity*elapsed_time;
}
Dalam simulator ini, kebisingan () adalah panggilan ke rutinitas
kebisingan populer Perlin, yang menghasilkan kebisingan terus menerus dalam ruang
3D. Kebisingan memungkinkan kita untuk membuat pola-pola gerakan, yang entah
bagaimana terlihat seperti asap, berputar dan naik dari tanah. Jelas,
pendekatan ini adalah murni estetika didorong, tetapi setelah semua, permainan
merupakan estetika-driven industri pada intinya.
Partikel Kepunahan
Partikel dalam suatu sistem tidak dimaksudkan untuk hidup sangat lama. Setelah
siklus hidup mereka habis, mereka akan dihapus dan respawned di emitor. Hal ini
biasanya berarti partikel telah melintasi layar atau melakukan siklus penuh dan
dengan demikian dapat masuk kembali dalam satu lingkaran. Beberapa sistem
partikel, dengan ledakan menjadi contoh nyata, akan nonlooping. Partikel
diciptakan, hidup, mati, dan kemudian sistem partikel secara keseluruhan
dimatikan.
Meskipun demikian, kita sekarang akan fokus pada sistem-sistem di mana
partikel harus dibuat ulang untuk memahami kode dibutuhkan untuk melakukan itu.
Umumnya, sebuah partikel meninggal setelah umurnya melampaui waktu untuk
hidup. Ketika saat ini tiba, yang harus kita lakukan adalah memanggil rutin
bertelur lagi, melewati ini identifier partikel sebagai parameter. Dengan demikian,
kita mendapatkan baru partikel dengan parameter segar di mana kami harus yang
lama. Jadi, tidak ada penghapusan memori atau realokasi adalah benar-benar
diperlukan. Yang kami lakukan adalah mendaur ulang posisi dalam array untuk
elemen baru.
Dari sudut pandang estetika, sangat penting memudar partikel keluar
entah bagaimana ketika mereka mendekati mereka kematian. Kegagalan untuk
melakukannya akan membuat partikel melihat hilangnya menjengkelkan karena
partikel cerah akan tiba-tiba menghilang. Sejumlah teknik dapat digunakan untuk
menangani situasi ini dengan benar. Dalam sebuah partikel hujan sistem,
misalnya, tetes hujan tidak dibunuh oleh usia, tetapi dibunuh setiap kali
mereka melewati bidang tanah.
Dengan demikian, tidak ada kemungkinan partikel "bermunculan"
dari tempat kejadian, karena mereka akan menyeberangi lantai dasar dalam
kerangka tepat sebelum kehancuran mereka. Ambil kolom asap, misalnya. Di sini,
kita perlu cerdik menggunakan nilai alpha memudar partikel masuk dan keluar.
Partikel akan buram di masa kejayaan mereka dan kemudian akan lahir dan
mati hampir transparan. Perhatikan bahwa perawatan yang sama kita dengan
kematian partikel harus diambil dengan kelahiran mereka. Kami tidak ingin partikel
untuk mampir tiba-tiba entah dari mana. Sebuah trik yang bagus untuk memastikan
bahwa campuran partikel alfa dengan baik bila mereka memasuki dan meninggalkan
panggung adalah untuk memodulasi alfa mereka sebagai fungsi dosa, seperti
alpha=sin(PI*age/maxage);
Argumen ke panggilan dosa mengembalikan nilai floating-point dalam
kisaran dari 0 ke Pi. Kemudian, fungsi dosa mengevaluasi ke nol (dengan
demikian, benar-benar transparan) pada kedua nilai, dan naik mulus ke 1 di
antara untuk mewakili opacity di tengah partikel kehidupan.
Rendering Partikel
Believability dari sistem partikel tergantung pada render sebanyak itu
tergantung pada simulasi yang sebenarnya perilaku. Kita dapat mengubah massa
orang untuk mengalir air dengan hanya menyesuaikan render partikel kami mesin.
Mengingat sejumlah besar fenomena yang dapat dimodelkan menggunakan
partikel, tidak mengherankan bahwa pendekatan render yang berbeda ada. Tapi ada
beberapa tips umum untuk mengikuti, yang dibahas dalam bagian berikut.
Hitung Partikel murah
Partikel Rendering dapat menjadi bermasalah, terutama ketika berhadapan
dengan sejumlah besar elemen. Jangan lupa kita harus memutar dan menerjemahkan
setiap partikel individu sehingga menghadapi penonton dan memberikan tepat
ilusi. Rotating memiliki biaya, terutama bila Anda melakukannya berkali-kali. Kita
bisa memilih untuk membuat partikel satu per satu, berputar satu masing-masing
dengan tumpukan yang terdiri dari matriks rotasi dan terjemahan. Tapi karena
transformasi hanya bisa dilakukan di luar porsi rendering, kita perlu untuk
membuat partikel secara terpisah, dan dengan demikian menghilangkan pilihan
untuk mengirim mereka dalam batch, yang selalu lebih efisien. Dengan demikian, metode
yang berbeda akan digunakan. Pendekatan pertama adalah untuk meluruskannya
dengan kamera sendiri dengan merancang hak dan sampai vektor, dan kemudian
mendefinisikan partikel berdasarkan pada mereka. Di dunia dengan yaw saja,
vektor kanan (dengan menganggap ke kamera dan layar) dapat didefinisikan sebagai
point right(cos(yaw+pi/2),0,
sin(yaw+pi/2));
Dan vektor up yang hanya
point up(0,1,0);
Kemudian, layar-blok billboard ukuran S di pos posisi dapat
didefinisikan sebagai
P1=pos-right*S-up*S;
P2=pos+right*S-up*S;
P3=pos+right*S+up*S;
P4=pos-right*S+up*S;
Skema sebelumnya digambarkan pada Gambar 19.3.
Gambar 19.3. Menghitung vektor dan tepat untuk partikel.
Metode ini dapat dengan mudah diperluas untuk kamera penuh dengan roll,
pitch yaw, dan. Dalam hal ini, menghitung vektor diri sendiri adalah bukan ide
yang baik, karena Anda bisa mendapatkannya dari matriks modelview, seperti yang
disajikan dalam kode berikut:
glGetFloatv(GL_MODELVIEW_MATRIX,
mat)
right.create(mat[0],
mat[4], mat[8]);
up.create(mat[1], mat[5], mat[9]);
Sebuah alternatif yang lebih baik adalah membiarkan API menyelaraskan
billboard menggunakan fungsi perangkat keras. paling modern kartu video dapat
menangani billboard internal, sehingga semua kita melewati bus adalah partikel
koordinat dan tidak banyak lagi. Kartu ini juga menangani membangun paha depan
dan membuat mereka ke layar. Ini memberikan hasil yang jauh lebih baik karena
kita menghemat sumber daya bus dan menghindari transformasi. Fungsi ini ditemukan
pada kedua OpenGL dan DirectX bawah bentuk Sprite Point. Dalam OpenGL itu adalah
bagian dari perpanjangan, dan dalam DirectX itu sudah tertanam ke API inti.
Gunakan Mode Blending Tepat
Kekuatan ekspresif yang besar tersedia jika Anda belajar bagaimana untuk
melepaskan itu. Mode blending banyak tersedia untuk Anda bereksperimen dengan
dan menciptakan sistem mencari unik. Dua mode dasar yang disaring dan aditif
campuran. Campuran disaring didefinisikan oleh nilai-nilai alpha:
SRC_ALPHA, ONE_MINUS_SRC_ALPHA
Ini memberikan tampilan sebuah partikel semitransparan, seperti hujan.
Partikel ini tidak menerangi diri, sehingga menambahkan lapisan semakin banyak
tidak akan membuat cerah melihat adegan. Yang dapat dicapai melalui blending
aditif, seperti
SRC_ALPHA, ONE
Animasi Textures
Sistem partikel banyak membutuhkan Anda untuk pergi satu langkah lebih
hanya partikel menjiwai menggunakan berkualitas tinggi simulator. Bayangkan
bola api, misalnya. Dinamikanya terlalu cepat dan kompleks untuk membuat setiap
partikel sebagai quad statis. Jadi, kita perlu mengkombinasikan simulator yang
baik dengan partikel tingkat animasi, sehingga setiap partikel memiliki
beberapa frame animasi, biasanya disimpan dalam tekstur yang sama seperti ubin.
Kemudian, partikel akan siklus melalui frame animasi selama siklus hidupnya, membuat
tampilan keseluruhan jauh lebih dinamis. Jika Anda memilih untuk mengikuti
jalan ini, hanya membuat partikel yakin tidak sinkron dalam loop animasi
mereka, atau efek akan benar-benar hancur. Partikel yang berbeda harus berada
pada frame yang berbeda dalam animasi pada setiap diberikan dalam waktu.
Chained / hirarkis Sistem
Dinamika dunia nyata sering menggabungkan beberapa tahap untuk membuat
ilusi komposit kompleks. Mengambil ledakan itu dibuat oleh penembakan roket,
misalnya. Api muncul dari knalpot, dan kemudian awan besar asap dan uap air
yang dihasilkan. Selain itu, partikel kecil es terpisah dari bangunan utama, mengikuti
lintasan yang berbeda. Bagaimana kita bisa mencirikan itu? Apakah sistem
partikel? Jelas tidak, karena ada beberapa jenis partikel, masing-masing diatur
oleh simulator berbeda dengan rendering yang berbeda mesin. Tetapi sistem dapat
dilihat sebagai keseluruhan: sistem sistem partikel. Jadi, kita harus merancang
kami sistem partikel sehingga kami dapat agregat dan rantai mereka ke dalam
kelompok. Kita perlu array dari sistem dan pesan-passing kebijakan yang
memungkinkan chaining untuk mengambil tempat. Sebagai contoh, adalah ide yang
baik untuk menambahkan "Memadamkan perilaku" untuk partikel, yang
mendefinisikan tindakan apa yang dilakukan setiap kali kita perlu respawn
partikel. Perilaku ini akan kosong secara default, tapi kita bisa memutuskan untuk
menciptakan partikel dari berbeda dari satu ini memadamkan. Pikirkan elemen api
yang, setelah kehancuran, memicu merokok sistem. Jenis arsitektur secara
keseluruhan diperlukan untuk menciptakan efek lebih kaya.
Visual Parameter sebagai Fungsi Waktu
Semua parameter visual fungsi waktu. Lihatlah kebakaran, misalnya. Nyala
api inti biasanya biru, dan ketika bergerak menjauh, ternyata kuning, lalu
putih, dan perlahan-lahan lenyap. Sistem partikel Realistis perlu timevarying parameter.
Warna dan alpha yang jelas, tetapi ada orang lain. Spin (kecepatan rotasi),
maka bingkai dalam tekstur animasi, dan sebagainya membuat pengaruh yang jauh
lebih meyakinkan jika waktu dimasukkan ke dalam persamaan. Jika setiap partikel
memiliki kurva waktu respon yang sedikit berbeda, efek akan benar-benar
membaik.