Senin, 09 Juli 2012

Particle Systems : Anatomy of a Particle System and The Particle Data Structure (TRI)


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.