Advertisement
Guest User

Untitled

a guest
Jul 17th, 2019
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.65 KB | None | 0 0
  1. <html>
  2. <head>
  3. </head>
  4. <body>
  5. <canvas id='canvas' width='1280' height='640'></canvas>
  6. <script>
  7. let sin = Math.sin;
  8. let cos = Math.cos;
  9. let PI = Math.PI;
  10.  
  11. let canvas = document.getElementById('canvas');
  12. let ctx = canvas.getContext('2d');
  13.  
  14. let scaffolding = [
  15. [[-0.5, +0.5, +0.5, 0], [0x00, 0x00, 0xff]],
  16. [[+0.5, +0.5, +0.5, 0], [0x00, 0xff, 0x00]],
  17. [[+0.5, -0.5, +0.5, 0], [0x00, 0xff, 0xff]],
  18. [[-0.5, -0.5, +0.5, 0], [0xff, 0x00, 0x00]],
  19. [[-0.5, +0.5, -0.5, 0], [0xff, 0x00, 0xff]],
  20. [[+0.5, +0.5, -0.5, 0], [0xff, 0xff, 0x00]],
  21. [[+0.5, -0.5, -0.5, 0], [0x80, 0x00, 0x00]],
  22. [[-0.5, -0.5, -0.5, 0], [0x00, 0x80, 0x00]],
  23. ];
  24.  
  25. function scale(v, s) {
  26. return [v[0] * s, v[1] * s, v[2] * s, v[3] * s];
  27. }
  28.  
  29. function translate(v, x, y) {
  30. return [v[0] + x, v[1] + y, v[2], v[3]];
  31. }
  32.  
  33. function vertex_shader(v, m) {
  34. v = m44v(m, v);
  35. v = scale(v, 350);
  36. v = translate(v, 640, 320);
  37. return v;
  38. }
  39.  
  40. function draw(v) {
  41. ctx.beginPath();
  42. ctx.arc(v[0], v[1], 5, 0, Math.PI * 2);
  43. ctx.fill();
  44. }
  45.  
  46.  
  47.  
  48. let model = [];
  49. let colors = [];
  50. let ppu = 16;
  51. for (let z = 0; z <= ppu; z += 1) for (let y = 0; y <= ppu; y += 1) for (let x = 0; x <= ppu; x += 1) {
  52. let v = [x/ppu - 0.5, y/ppu - 0.5, z/ppu - 0.5, 0];
  53. model.push(v);
  54. colors.push(calc_color(v));
  55. }
  56.  
  57. function dist(a, b) {
  58. let xd = a[0] - b[0];
  59. let yd = a[1] - b[1];
  60. let zd = a[2] - b[2];
  61. return 1 - (xd * xd + yd * yd + zd * zd) / 3;
  62. }
  63.  
  64. function calc_color(v) {
  65. let color_stack = [];
  66. for (let scaff of scaffolding) {
  67. let t = dist(v, scaff[0]);
  68. let c = scaff[1];
  69. color_stack.push([c[0] * t / 3, c[1] * t / 3, c[2] * t / 3]);
  70. }
  71. return color_stack.reduce((a, b) => [a[0] + b[0], a[1] + b[1], a[2] + b[2]]);
  72. }
  73.  
  74. requestAnimationFrame(render);
  75.  
  76. //let t = 0;
  77.  
  78. function render(time) {
  79. let Ax = 30 / 180 * PI;
  80. // let Ay = 45 / 180 * PI;
  81. let t = (time % 15000) / 15000;
  82. let Ay = t * PI;
  83.  
  84. let Rx = [
  85. 1, 0, 0, 0,
  86. 0, cos(Ax), -sin(Ax), 0,
  87. 0, sin(Ax), cos(Ax), 0,
  88. 0, 0, 0, 1,
  89. ];
  90.  
  91. let Ry = [
  92. cos(Ay), 0, sin(Ay), 0,
  93. 0, 1, 0, 0,
  94. -sin(Ay), 0, cos(Ay), 0,
  95. 0, 0, 0, 1,
  96. ];
  97.  
  98. let m = m44(Ry, Rx);
  99.  
  100. let verts = [];
  101. for (let v of model) {
  102. verts.push(vertex_shader(v, m));
  103. }
  104.  
  105. // console.log(verts);
  106.  
  107. ctx.clearRect(0, 0, 1280, 640);
  108. for (let idx = 0; idx < verts.length; idx += 1) {
  109. ctx.fillStyle = col_to_str(colors[idx]);
  110. draw(verts[idx]);
  111. } // model.sort(a, b => a < b)
  112.  
  113. requestAnimationFrame(render);
  114. }
  115.  
  116. function col_to_str(c) {
  117. return '#' + ((c[0] << 16) | (c[1] << 8) | (c[2])).toString(16);
  118. }
  119.  
  120. //function multiplyMatrices(matrixA, matrixB) {
  121. function m44(matrixA, matrixB) {
  122. // Slice the second matrix up into columns
  123. var column0 = [matrixB[0], matrixB[4], matrixB[8], matrixB[12]];
  124. var column1 = [matrixB[1], matrixB[5], matrixB[9], matrixB[13]];
  125. var column2 = [matrixB[2], matrixB[6], matrixB[10], matrixB[14]];
  126. var column3 = [matrixB[3], matrixB[7], matrixB[11], matrixB[15]];
  127.  
  128. // Multiply each column by the matrix
  129. var result0 = m44v(matrixA, column0);
  130. var result1 = m44v(matrixA, column1);
  131. var result2 = m44v(matrixA, column2);
  132. var result3 = m44v(matrixA, column3);
  133.  
  134. // Turn the result columns back into a single matrix
  135. return [
  136. result0[0], result1[0], result2[0], result3[0],
  137. result0[1], result1[1], result2[1], result3[1],
  138. result0[2], result1[2], result2[2], result3[2],
  139. result0[3], result1[3], result2[3], result3[3]
  140. ];
  141. }
  142.  
  143.  
  144. //function multiplyMatrixAndPoint(matrix, point) {
  145. function m44v(matrix, point) {
  146. //Give a simple variable name to each part of the matrix, a column and row number
  147. var c0r0 = matrix[ 0], c1r0 = matrix[ 1], c2r0 = matrix[ 2], c3r0 = matrix[ 3];
  148. var c0r1 = matrix[ 4], c1r1 = matrix[ 5], c2r1 = matrix[ 6], c3r1 = matrix[ 7];
  149. var c0r2 = matrix[ 8], c1r2 = matrix[ 9], c2r2 = matrix[10], c3r2 = matrix[11];
  150. var c0r3 = matrix[12], c1r3 = matrix[13], c2r3 = matrix[14], c3r3 = matrix[15];
  151.  
  152. //Now set some simple names for the point
  153. var x = point[0];
  154. var y = point[1];
  155. var z = point[2];
  156. var w = point[3];
  157.  
  158. //Multiply the point against each part of the 1st column, then add together
  159. var resultX = (x * c0r0) + (y * c0r1) + (z * c0r2) + (w * c0r3);
  160.  
  161. //Multiply the point against each part of the 2nd column, then add together
  162. var resultY = (x * c1r0) + (y * c1r1) + (z * c1r2) + (w * c1r3);
  163.  
  164. //Multiply the point against each part of the 3rd column, then add together
  165. var resultZ = (x * c2r0) + (y * c2r1) + (z * c2r2) + (w * c2r3);
  166.  
  167. //Multiply the point against each part of the 4th column, then add together
  168. var resultW = (x * c3r0) + (y * c3r1) + (z * c3r2) + (w * c3r3);
  169.  
  170. return [resultX, resultY, resultZ, resultW];
  171. }
  172. </script>
  173. </body>
  174. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement