Inspiration
For this project, I want to create an interactive digital art piece that explores the true scale of reality by gradually zooming from large, natural environments down to microscopic and atomic levels.
Visual Elements
Flower Screen
-
Add a tree, birds, more flowers, a grass field, and the sun for a fuller composition.
-
Include animations such as swaying grass, apples falling from the tree, and birds flying across the screen to make it feel alive.
Leaf Screen
-
Add details like insects, the stem, and a more zoomed-in view of the leaf.
-
Animate insects crawling across the surface to bring a sense of realism.
Cell Screen
-
Show multiple plant cells floating in a jelly-like substance.
-
Design them to resemble real plant cells, with more detail and fluid animation.
Atom Screen
-
Illustrate atoms with orbiting ellipses that cross over each other.
-
Show the nucleus clearly, with protons and neutrons on display.
Interaction: Zoom Functionality
-
Replace the two-finger pinch with a two-hand gesture for zooming, making it more intuitive and reducing accidental zooms.
-
Add smooth zoom animations between levels instead of abrupt page changes, to create a more immersive transition.
Sound Design
-
Integrate sounds that complement each environment:
-
Flower screen: natural ambient sounds (e.g., wind, birds).
-
Leaf screen: subtle insect sounds.
-
Cell screen: soft “jelly-like” sounds.
-
Atom screen: buzzing or electrical sounds.
-
-
Add a “zoom-in” sound effect to enhance transitions
(All sounds are sourced from Pixabay.com.)
Machine Learning
To enhance user interactivity, I incorporated machine learning using the ml5 library, which integrates well with p5.js and is relatively simple to implement. I set two thresholds, “close” and “far”, based on the distance of the user’s hands. These thresholds determine when the zooming action is triggered, making the interaction feel more natural and responsive.
Extra details and screenshots
I added a home page to show users the hand gestures and extra button functionalities.
Screen Recording 2025-10-07 at 00.17.22
Challenges
Coming up with creative ideas for this project was challenging, and implementing the zooming feature was especially difficult since I had never attempted it before. Getting it to work smoothly took a lot of trial and error.
This link from p5 was helpful – https://editor.p5js.org/mimimimimi/sketches/SOkckqY_r https://editor.p5js.org/Luxapodular/sketches/rk__bPdcm but also just experimenting with the ease in and out values to make the zoom as natural as possible.
// ===== TRANSITIONS ===== // initiate zoom transition between scenes function startZoomTransition() { isTransitioning = true; // flag to indicate transition is active transitionProgress = 0; // reset // Play zoom sound for every transition at 50% volume (if not muted) if (zoomSound && !isMuted) { zoomSound.setVolume(0.5); zoomSound.play(); } } // update for each frame function updateTransition() { if (!isTransitioning) return; transitionProgress += 0.03; // increment by 3% each frame //check if 100% (1) if (transitionProgress >= 1) { isTransitioning = false; // stop transition transitionProgress = 0; // reset currentPage = currentPage === SCENES.length - 1 ? 1 : currentPage + 1; playSceneSound(); // Play sound for the new scene } } // applies visual zoom effect during transitions function applyCameraTransform() { // create smooth easing curve: slow start, fast middle, slow end const easeT = transitionProgress < 0.5 ? 4 * transitionProgress ** 3 // first half: cubic ease-in : 1 - (-2 * transitionProgress + 2) ** 3 / 2; // Second half: cubic ease-out // calculate zoom level: smoothly interpolate from 1x to 100x zoom const zoom = lerp(1, 100, easeT); // get the target point to zoom into for current scene const [x, y] = SCENES[currentPage].zoomTarget; // apply camera transformation: translate(x, y); // move to zoom target point scale(zoom); // apply zoom scaling translate(-x, -y); // move back to keep target centered }
final code – https://editor.p5js.org/kk4827/sketches/9CleTb6y1