Advertisement
here2share

$ JS_rotating_3D_cube.html

Dec 15th, 2022
1,031
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <!doctype html>
  2. <html>
  3.    <body>
  4.       <canvas width = "570" height = "570" id = "my_Canvas"></canvas>
  5.  
  6.       <script>
  7.          /*============= Creating a canvas =================*/
  8.          var canvas = document.getElementById('my_Canvas');
  9.          gl = canvas.getContext('experimental-webgl');
  10.  
  11.          /*============ Defining and storing the geometry =========*/
  12.  
  13.          var vertices = [
  14.             -1,-1,-1, 1,-1,-1, 1, 1,-1, -1, 1,-1,
  15.             -1,-1, 1, 1,-1, 1, 1, 1, 1, -1, 1, 1,
  16.             -1,-1,-1, -1, 1,-1, -1, 1, 1, -1,-1, 1,
  17.             1,-1,-1, 1, 1,-1, 1, 1, 1, 1,-1, 1,
  18.             -1,-1,-1, -1,-1, 1, 1,-1, 1, 1,-1,-1,
  19.             -1, 1,-1, -1, 1, 1, 1, 1, 1, 1, 1,-1,
  20.          ];
  21.  
  22.          var colors = [
  23.             5,3,7, 5,3,7, 5,3,7, 5,3,7,
  24.             1,1,3, 1,1,3, 1,1,3, 1,1,3,
  25.             0,0,1, 0,0,1, 0,0,1, 0,0,1,
  26.             1,0,0, 1,0,0, 1,0,0, 1,0,0,
  27.             1,1,0, 1,1,0, 1,1,0, 1,1,0,
  28.             0,1,0, 0,1,0, 0,1,0, 0,1,0
  29.          ];
  30.  
  31.          var indices = [
  32.             0,1,2, 0,2,3, 4,5,6, 4,6,7,
  33.             8,9,10, 8,10,11, 12,13,14, 12,14,15,
  34.             16,17,18, 16,18,19, 20,21,22, 20,22,23
  35.          ];
  36.  
  37.          // Create and store data into vertex buffer
  38.          var vertex_buffer = gl.createBuffer ();
  39.          gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer);
  40.          gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
  41.  
  42.          // Create and store data into color buffer
  43.          var color_buffer = gl.createBuffer ();
  44.          gl.bindBuffer(gl.ARRAY_BUFFER, color_buffer);
  45.          gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);
  46.  
  47.          // Create and store data into index buffer
  48.          var index_buffer = gl.createBuffer ();
  49.          gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, index_buffer);
  50.          gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);
  51.  
  52.          /*=================== Shaders =========================*/
  53.  
  54.          var vertCode = 'attribute vec3 position;'+
  55.             'uniform mat4 Pmatrix;'+
  56.             'uniform mat4 Vmatrix;'+
  57.             'uniform mat4 Mmatrix;'+
  58.             'attribute vec3 color;'+//the color of the point
  59.             'varying vec3 vColor;'+
  60.  
  61.             'void main(void) { '+//pre-built function
  62.                'gl_Position = Pmatrix*Vmatrix*Mmatrix*vec4(position, 1.);'+
  63.                'vColor = color;'+
  64.             '}';
  65.  
  66.          var fragCode = 'precision mediump float;'+
  67.             'varying vec3 vColor;'+
  68.             'void main(void) {'+
  69.                'gl_FragColor = vec4(vColor, 1.);'+
  70.             '}';
  71.  
  72.          var vertShader = gl.createShader(gl.VERTEX_SHADER);
  73.          gl.shaderSource(vertShader, vertCode);
  74.          gl.compileShader(vertShader);
  75.  
  76.          var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
  77.          gl.shaderSource(fragShader, fragCode);
  78.          gl.compileShader(fragShader);
  79.  
  80.          var shaderProgram = gl.createProgram();
  81.          gl.attachShader(shaderProgram, vertShader);
  82.          gl.attachShader(shaderProgram, fragShader);
  83.          gl.linkProgram(shaderProgram);
  84.  
  85.          /* ====== Associating attributes to vertex shader =====*/
  86.          var Pmatrix = gl.getUniformLocation(shaderProgram, "Pmatrix");
  87.          var Vmatrix = gl.getUniformLocation(shaderProgram, "Vmatrix");
  88.          var Mmatrix = gl.getUniformLocation(shaderProgram, "Mmatrix");
  89.  
  90.          gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer);
  91.          var position = gl.getAttribLocation(shaderProgram, "position");
  92.          gl.vertexAttribPointer(position, 3, gl.FLOAT, false,0,0) ;
  93.  
  94.          // Position
  95.          gl.enableVertexAttribArray(position);
  96.          gl.bindBuffer(gl.ARRAY_BUFFER, color_buffer);
  97.          var color = gl.getAttribLocation(shaderProgram, "color");
  98.          gl.vertexAttribPointer(color, 3, gl.FLOAT, false,0,0) ;
  99.  
  100.          // Color
  101.          gl.enableVertexAttribArray(color);
  102.          gl.useProgram(shaderProgram);
  103.  
  104.          /*==================== MATRIX =====================*/
  105.  
  106.          function get_projection(angle, a, zMin, zMax) {
  107.             var ang = Math.tan((angle*.5)*Math.PI/180);//angle*.5
  108.             return [
  109.                0.5/ang, 0 , 0, 0,
  110.                0, 0.5*a/ang, 0, 0,
  111.                0, 0, -(zMax+zMin)/(zMax-zMin), -1,
  112.                0, 0, (-2*zMax*zMin)/(zMax-zMin), 0
  113.             ];
  114.          }
  115.  
  116.          var proj_matrix = get_projection(40, canvas.width/canvas.height, 1, 100);
  117.  
  118.          var mov_matrix = [1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1];
  119.          var view_matrix = [1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1];
  120.  
  121.          // translating z
  122.          view_matrix[14] = view_matrix[14]-6;//zoom
  123.  
  124.          /*==================== Rotation ====================*/
  125.  
  126.          function rotateZ(m, angle) {
  127.             var c = Math.cos(angle);
  128.             var s = Math.sin(angle);
  129.             var mv0 = m[0], mv4 = m[4], mv8 = m[8];
  130.  
  131.             m[0] = c*m[0]-s*m[1];
  132.             m[4] = c*m[4]-s*m[5];
  133.             m[8] = c*m[8]-s*m[9];
  134.  
  135.             m[1]=c*m[1]+s*mv0;
  136.             m[5]=c*m[5]+s*mv4;
  137.             m[9]=c*m[9]+s*mv8;
  138.          }
  139.  
  140.          function rotateX(m, angle) {
  141.             var c = Math.cos(angle);
  142.             var s = Math.sin(angle);
  143.             var mv1 = m[1], mv5 = m[5], mv9 = m[9];
  144.  
  145.             m[1] = m[1]*c-m[2]*s;
  146.             m[5] = m[5]*c-m[6]*s;
  147.             m[9] = m[9]*c-m[10]*s;
  148.  
  149.             m[2] = m[2]*c+mv1*s;
  150.             m[6] = m[6]*c+mv5*s;
  151.             m[10] = m[10]*c+mv9*s;
  152.          }
  153.  
  154.          function rotateY(m, angle) {
  155.             var c = Math.cos(angle);
  156.             var s = Math.sin(angle);
  157.             var mv0 = m[0], mv4 = m[4], mv8 = m[8];
  158.  
  159.             m[0] = c*m[0]+s*m[2];
  160.             m[4] = c*m[4]+s*m[6];
  161.             m[8] = c*m[8]+s*m[10];
  162.  
  163.             m[2] = c*m[2]-s*mv0;
  164.             m[6] = c*m[6]-s*mv4;
  165.             m[10] = c*m[10]-s*mv8;
  166.          }
  167.  
  168.          /*================= Drawing ===========================*/
  169.          var time_old = 0;
  170.  
  171.          var animate = function(time) {
  172.  
  173.             var dt = time-time_old;
  174.             rotateZ(mov_matrix, dt*0.005);//time
  175.             rotateY(mov_matrix, dt*0.002);
  176.             rotateX(mov_matrix, dt*0.003);
  177.             time_old = time;
  178.  
  179.             gl.enable(gl.DEPTH_TEST);
  180.             gl.depthFunc(gl.LEQUAL);
  181.             gl.clearColor(0.5, 0.5, 0.5, 0.9);
  182.             gl.clearDepth(1.0);
  183.  
  184.             gl.viewport(0.0, 0.0, canvas.width, canvas.height);
  185.             gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
  186.             gl.uniformMatrix4fv(Pmatrix, false, proj_matrix);
  187.             gl.uniformMatrix4fv(Vmatrix, false, view_matrix);
  188.             gl.uniformMatrix4fv(Mmatrix, false, mov_matrix);
  189.             gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, index_buffer);
  190.             gl.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_SHORT, 0);
  191.  
  192.             window.requestAnimationFrame(animate);
  193.          }
  194.          animate(0);
  195.       </script>
  196.    </body>
  197. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement