Rauch
(Daniel Kliewer, Dominik Jülich)
Anders als bei dem Feuer haben wir uns entschieden den Rauch mithilfe von Partikeln darzustellen. Die Animation des Rauches ist nicht besonders komplex und wir verwenden nur 28 Partikel pro Rauchsäule, somit hat diese nicht viel Einfluss auf die Performance des Spieles.
Da das Feuer verschiedene Größen annehmen kann, muss der Rauch auch entsprechend mit dem Feuer skalieren. Dazu wird die Größe der Partikel abhängig von der Größe der Flamme gesetzt. Des weiteren muss noch die gesamte Rauchsäule ihre Höhe und Breite verändern können, was durch die richtige Positionierung der Partikel erreicht wird.
for (i = 0; i < NUM_OF_PARTICLE; i++) {
position[i * 3 + 0] = THREE.Math.randFloat(-0.5 * (fireWidth / 1.5), 0.5 * (fireWidth / 1.5));
position[i * 3 + 1] = THREE.Math.randFloat(y, y + (2 * fireHeight));
position[i * 3 + 3] = THREE.Math.randFloat(-0.5 * (fireDepth / 1.5), 0.5 * (fireDepth / 1.5));
shift[i] = Math.random() * 3;
}
Bei unserem Standardfeuer (Breite in X- und Z-Richtung jeweils 1.5) hatten die Rauchpartikel X und Z Werte zwischen -0.5 und 0.5. Diese Werte werden nun mit dem Verhältnis zwischen den Breiten des zu platzierenden Feuers und den Breiten des Standartfeuers multipliziert. Die Y Werte der Rauchpartikel werden so gesetzt, dass die Rauchsäule doppelt so hoch ist wie die Flamme.
Als wir dann die fertigen Feuer in ein Level platzierten merkten wir, dass der Rauch des Feuers durch den Nebel nicht verdeckt wurde.
Um dieses Problem zu beheben mussten wir den Fragmentshader des Rauches anpassen und die Farbe des Rauches abhängig von der Dichte des Nebels setzen. Nun wird der Rauch von dem Nebel korrekt verdeckt, solange der Spieler weit genug von Feuer entfernt ist.