Draft of new post: proximity structures
This commit is contained in:
parent
71f6822904
commit
da634dde04
75
_posts/2017-08-07-proximity-structures.html
Normal file
75
_posts/2017-08-07-proximity-structures.html
Normal file
@ -0,0 +1,75 @@
|
||||
---
|
||||
title: Proximity Structures: Playing around with PixiJS
|
||||
layout: post
|
||||
image: /img/blog/proximity-structures.png
|
||||
hidden: true
|
||||
---
|
||||
|
||||
I've been messing around with a library called [PixiJS](http://www.pixijs.com/)
|
||||
which allows you to create WebGL animations which will fall back to HTML5 canvas
|
||||
if WebGL is not available in the browser. I mostly like it because the API is
|
||||
similar to HTML5 canvas which [I was already familiar
|
||||
with](https://github.com/thallada/thallada.github.io/blob/master/js/magic.js). I
|
||||
can't say that I like the PixiJS API and documentation that much, though. For
|
||||
this project, I mostly just used a small portion of it to create [WebGL (GPU
|
||||
accelerated) primitive
|
||||
shapes](http://www.goodboydigital.com/pixi-webgl-primitives/) (lines and
|
||||
circles).
|
||||
|
||||
Play with it here: [http://proximity.hallada.net](http://proximity.hallada.net)
|
||||
Read/clone the code here: [https://github.com/thallada/proximity-structures](https://github.com/thallada/proximity-structures)
|
||||
|
||||
![The animation in action](/img/blog/proximity-structures.gif)
|
||||
|
||||
The idea was inspired by
|
||||
[all](https://thumb9.shutterstock.com/display_pic_with_logo/3217643/418838422/stock-vector-abstract-technology-futuristic-network-418838422.jpg)
|
||||
[those](https://ak5.picdn.net/shutterstock/videos/27007555/thumb/10.jpg)
|
||||
[countless](https://ak9.picdn.net/shutterstock/videos/10477484/thumb/1.jpg)
|
||||
[node](https://ak3.picdn.net/shutterstock/videos/25825727/thumb/1.jpg)
|
||||
[network](https://t4.ftcdn.net/jpg/00/93/24/21/500_F_93242102_mqtDljufY7CNY0wMxunSbyDi23yNs1DU.jpg)
|
||||
[graphics](https://ak6.picdn.net/shutterstock/videos/12997085/thumb/1.jpg) that
|
||||
I see all the time as stock graphics on generic tech articles.
|
||||
|
||||
This was really fun to program. I didn't care much about perfect code, I just
|
||||
kept hacking one thing onto another while watching the instantaneous feedback of
|
||||
the points and lines responding to my changes until I had something worth
|
||||
sharing.
|
||||
|
||||
### Details
|
||||
|
||||
The majority of the animation you see is based on
|
||||
[tweening](https://en.wikipedia.org/wiki/Inbetweening). Each point has an origin
|
||||
and destination stored in memory. Every clock tick (orchestrated by the
|
||||
almighty
|
||||
[requestAnimationFrame](https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame)),
|
||||
the main loop calculates where each point should be in the path between its
|
||||
origin and destination based on how long it is until it completes its "cycle".
|
||||
There is a global `cycleDuration`, defaulted to 60. Every frame increments the cycle
|
||||
counter by 1 until it reaches 60, at which point it folds over back to 0. Every
|
||||
point is assigned a number between 1 and 60. This is its start cycle. When the
|
||||
global cycle counter equals a point's start cycle number, the point has reached
|
||||
its destination and a new target destination is randomly chosen.
|
||||
|
||||
Each point is also randomly assigned a color. When a point is within
|
||||
`connectionDistance` of another point in the canvas, a line is drawn between the
|
||||
two points, their colors are averaged, and the points' colors become the average
|
||||
color weighted by the distance between the points. You can see clusters of
|
||||
points converging on a color in the animation.
|
||||
|
||||
Click interaction is implemented by modifying point target destinations within a
|
||||
radius around the click. Initially, a mouse hover will push points away.
|
||||
Clicking and holding will draw points in, progressively growing the effect
|
||||
radius in the process to capture more and more points.
|
||||
|
||||
I thought it was really neat that without integrating any physics engine
|
||||
whatsoever, I ended up with something that looked sort of physics based thanks
|
||||
to the tweening functions. Changing the tweening functions that the points use
|
||||
seems to change the physical properties and interactions of the points. The
|
||||
elastic tweening function makes the connections between the points snap like
|
||||
rubber bands. And, while I am not drawing any explicit polygons, just points and
|
||||
lines based on proximity, it sometimes looks like the points are coalescing into
|
||||
some three-dimensional structure.
|
||||
|
||||
I'll probably make another procedural animation like this in the future since it
|
||||
was so fun. Next time, I'll probably start from the get-go in ES2015 (or ES7,
|
||||
or ES8??) and proper data structures.
|
BIN
img/blog/proximity-structures.gif
Normal file
BIN
img/blog/proximity-structures.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 7.6 MiB |
BIN
img/blog/proximity-structures.png
Normal file
BIN
img/blog/proximity-structures.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 26 KiB |
Loading…
Reference in New Issue
Block a user