This project showcases my experiments in simulating smoke effects using both JavaScript and Python. The project utilizes and extends two open-source libraries to demonstrate smoke generation in various contexts, including interactive demos, image augmentation, and video processing. For playground, please visit here.
This project is an educational exploration, and I am not an expert in JavaScript. The implementation builds on the following two projects, which have been modified to suit the goals of this project:
pages/scripts/smoke.js
: Adapted from bijection/smoke.jspages/scripts/processor.js
: Based on processor.jsCredits: A huge thanks to the original authors for their incredible work.
git clone https://github.com/q-viper/SmokeSim.git
cd SmokeSim
pip install .
Please make an issue if it failed.
Playground is available here.
This demo showcases real-time smoke effects on a web-based canvas:
python examples/server.py
(This uses examples/server.py
adapted from this gist.)
This demo uses PyGame to simulate smoke effects with interactive mouse controls:
python particle.py
This project also supports generating smoke effects for use in image augmentation. The smokesim
Python module allows for realistic smoke overlays on static images.
from smokesim.augmentation import Augmentation
import numpy as np
from pathlib import Path
if __name__ == "__main__":
np.random.seed(100)
WIDTH, HEIGHT = 700, 500
augmentation = Augmentation(image_path=None, screen_dim=(WIDTH, HEIGHT))
smoke_machine = augmentation.smoke_machine
augmentation.add_smoke(dict(particle_count=15, sprite_size=25, origin=(250, 500)))
augmentation.add_smoke(dict(particle_count=15, sprite_size=25, origin=(450, 500)))
augmentation.augment(steps=90,history_path=Path('media/smoke_history.mp4'))
for i in range(5):
augmentation.add_smoke(
dict(
color=smoke_machine.color,
particle_count=1,
origin=(np.random.randint(100, WIDTH), np.random.randint(100, HEIGHT)),
lifetime=200,
particle_args={
"min_lifetime": 200,
"max_lifetime": 500,
"min_scale": 10,
"max_scale": 50,
"fade_speed": 50,
"scale": 50,
"smoke_sprite_size": 50,
"color": smoke_machine.color,
},
)
)
augmentation.augment(steps=1)
augmentation.save_as('assets/augmented_smoke_image.jpg')
augmentation.end()
examples/image_augmentation.py
.augment
method also accepts image where we want to put smoke. It should be NumPy array. And returns same image after augmenting it. And we can store the smoke history as well.examples/video_augmentation.py
contains a cool project with MediaPipe (installation is required first: pip install mediapipe==0.10.14
). Where smoke is generated on the forefinger’s position.If you find this project to be interesting and want to add changes, please add your changes and make the push request. Or you can make an issue for that.