A procedurally generated and interactive animation created with PixiJS

index.html 8.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. <html lang="en">
  2. <head>
  3. <title>Proximity Structures</title>
  4. <link rel="stylesheet" href="css/style.css">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta charset="utf-8" />
  7. <!-- open graph tags -->
  8. <meta property="og:title" content="Proximity Structures" />
  9. <meta property="og:url" content="http://proximity.hallada.net/" />
  10. <meta property="og:image" content="http://proximity.hallada.net/img/proximity-300-zoomed.png" />
  11. <meta property="og:image:type" content="image/png" />
  12. <meta property="og:image:width" content="300" />
  13. <meta property="og:image:height" content="300" />
  14. <meta property="og:image:alt" content="Screenshot of the animation in action" />
  15. <meta property="og:description" content="A procedurally generated and interactive animation created with PixiJS" />
  16. </head>
  17. <body>
  18. <div id="options">
  19. <button id="toggle-help">Help</button>
  20. <button id="toggle-controls">Settings</button>
  21. </div>
  22. <div id="help" class="panel" style="display: none;">
  23. <button type="button" id="close-help">x</button>
  24. <h2>Help</h2>
  25. <table>
  26. <tr>
  27. <th>Interaction</th>
  28. <th>Action</th>
  29. </tr>
  30. <tr>
  31. <td>mouse hover</td>
  32. <td>push points away from cursor</td>
  33. </tr>
  34. <tr>
  35. <td>mouse/touch click and hold</td>
  36. <td>attract points to cursor, then explode outwards</td>
  37. </tr>
  38. <tr>
  39. <td>mouse wheel scroll down</td>
  40. <td>slow down time</td>
  41. </tr>
  42. <tr>
  43. <td>mouse wheel scroll up</td>
  44. <td>speed up time</td>
  45. </tr>
  46. <tr>
  47. <td><code>&larr;</code> (left)</td>
  48. <td>hold to restrict points to the left of the screen</td>
  49. </tr>
  50. <tr>
  51. <td><code>&rarr;</code> (right)</td>
  52. <td>hold to restrict points to the right of the screen</td>
  53. </tr>
  54. <tr>
  55. <td><code>&uarr;</code> (up)</td>
  56. <td>hold to restrict points to the top of the screen</td>
  57. </tr>
  58. <tr>
  59. <td><code>&darr;</code> (down)</td>
  60. <td>hold to restrict points to the bottom of the screen</td>
  61. </tr>
  62. <tr>
  63. <td><code>1</code></td>
  64. <td>makes points move linearly</td>
  65. </tr>
  66. <tr>
  67. <td><code>2</code></td>
  68. <td>makes points meander</td>
  69. </tr>
  70. <tr>
  71. <td><code>3</code></td>
  72. <td>makes points snappy</td>
  73. </tr>
  74. <tr>
  75. <td><code>4</code></td>
  76. <td>makes points bouncy</td>
  77. </tr>
  78. <tr>
  79. <td><code>5</code></td>
  80. <td>makes points elastic</td>
  81. </tr>
  82. <tr>
  83. <td><code>6</code></td>
  84. <td>makes points overshoot</td>
  85. </tr>
  86. <tr>
  87. <td><code>f</code></td>
  88. <td>toggle FPS counter</td>
  89. </tr>
  90. <tr>
  91. <td><code>d</code></td>
  92. <td>toggles debug mode (including FPS counter)</td>
  93. </tr>
  94. <tr>
  95. <td><code>n</code></td>
  96. <td>toggles display of nodes</td>
  97. </tr>
  98. <tr>
  99. <td><code>l</code></td>
  100. <td>toggles display of lines</td>
  101. </tr>
  102. <tr>
  103. <td><code>?</code></td>
  104. <td>toggles this help modal</td>
  105. </tr>
  106. </table>
  107. <a href="https://github.com/thallada/proximity-structures">Fork on Github</a>
  108. </div>
  109. <div id="controls" class="panel" style="display: none;">
  110. <button type="button" id="close-controls">x</button>
  111. <h2>Settings</h2>
  112. <p class="warning">WARNING: Certain combinations of settings can crash your browser or tab.</p>
  113. <form action="">
  114. <label><strong>Points Count:</strong>
  115. <input type="range" name="pointsNumRange" min="0" max="5000" value="0" oninput="this.form.pointsNumInput.value=this.value" />
  116. <input type="number" name="pointsNumInput" min="0" max="5000" value="0" oninput="this.form.pointsNumRange.value=this.value" />
  117. <button type="button" id="reset">Reset Points</button>
  118. </label><br />
  119. <label><strong>Connection Distance:</strong>
  120. <input type="range" name="connectDistRange" min="0" max="1000" value="0" oninput="this.form.connectDistInput.value=this.value" />
  121. <input type="number" name="connectDistInput" min="0" max="1000" value="0" oninput="this.form.connectDistRange.value=this.value" />
  122. </label><br />
  123. <label><strong>Connection Limit:</strong>
  124. <input type="range" name="connectLimitRange" min="0" max="100" value="10" oninput="this.form.connectLimitInput.value=this.value" />
  125. <input type="number" name="connectLimitInput" min="0" max="100" value="10" oninput="this.form.connectLimitRange.value=this.value" />
  126. </label><br />
  127. <label><strong>Max Travel Distance:</strong>
  128. <input type="range" name="maxTravelRange" min="0" max="1000" value="0" oninput="this.form.maxTravelInput.value=this.value" />
  129. <input type="number" name="maxTravelInput" min="0" max="1000" value="0" oninput="this.form.maxTravelRange.value=this.value" />
  130. </label><br />
  131. <label><strong>Cycle Duration:</strong>
  132. <input type="range" name="timeRange" min="1" max="360" value="60" oninput="this.form.timeInput.value=this.value" />
  133. <input type="number" name="timeInput" min="1" max="360" value="60" oninput="this.form.timeRange.value=this.value" />
  134. <button type="button" id="synchronize-cycles">Synchronize Point Cycles</button>
  135. <button type="button" id="randomize-cycles">Randomize Point Cycles</button>
  136. </label><br />
  137. <label><strong>Point Size:</strong>
  138. <input type="range" name="pointSizeRange" min="0" max="50" value="3" oninput="this.form.pointSizeInput.value=this.value" />
  139. <input type="number" name="pointSizeInput" min="0" max="50" value="3" oninput="this.form.pointSizeRange.value=this.value" />
  140. </label><br />
  141. <label><strong>Line Size:</strong>
  142. <input type="range" name="lineSizeRange" min="1" max="50" value="1" oninput="this.form.lineSizeInput.value=this.value" />
  143. <input type="number" name="lineSizeInput" min="1" max="50" value="1" oninput="this.form.lineSizeRange.value=this.value" />
  144. </label><br />
  145. <label><strong>Color Shift:</strong>
  146. <input type="range" name="colorShiftRange" min="0" max="85" value="10" oninput="this.form.colorShiftInput.value=this.value" />
  147. <input type="number" name="colorShiftInput" min="0" max="85" value="10" oninput="this.form.colorShiftRange.value=this.value" />
  148. </label><br />
  149. <label><strong>Point tweening:</strong>
  150. <label><input type="radio" name="tweening" value="linear" /> Linear</label>
  151. <label><input type="radio" name="tweening" value="meandering" /> Meandering</label>
  152. <label><input type="radio" name="tweening" value="snappy" /> Snappy</label>
  153. <label><input type="radio" name="tweening" value="bouncy" /> Bouncy</label>
  154. <label><input type="radio" name="tweening" value="elastic" /> Elastic</label>
  155. <label><input type="radio" name="tweening" value="back" checked /> Overshoot</label>
  156. </label><br />
  157. <label><strong>Drawing:</strong>
  158. <label><input type="checkbox" name="debugToggle"> Debugging</label>
  159. <label><input type="checkbox" name="fpsCounterToggle"> FPS Counter</label>
  160. <label><input type="checkbox" name="nodesToggle" checked> Points</label>
  161. <label><input type="checkbox" name="linesToggle" checked> Lines</label>
  162. <label>
  163. </form>
  164. </div>
  165. <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/pixi.js/4.2.2/pixi.min.js"></script>
  166. <script type="text/javascript" src="js/proximity.js"></script>
  167. </body>
  168. <!-- Google Analytics -->
  169. <script>
  170. window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
  171. ga('create', 'UA-39880341-1', 'auto');
  172. ga('send', 'pageview');
  173. </script>
  174. <script async src='https://www.google-analytics.com/analytics.js'></script>
  175. <!-- End Google Analytics -->
  176. </html>