¿Cómo crear un cubo 3D usando lienzo en HTML5?

En este artículo, veremos cómo crear un cubo 3D usando lienzo en HTML5. 

Enfoque: Usaremos el elemento canvas. El elemento HTML Canvas se usa para dibujar gráficos con la ayuda de javascript. Se puede utilizar para dibujar diferentes tipos de formas, gráficos o crear animaciones simples y complejas. Tenga en cuenta que el lienzo no es más que un contenedor de gráficos. Para dibujar los gráficos, debe usar javascript. El tamaño predeterminado del lienzo es de 300 x 150 píxeles (ancho x alto). Los tamaños personalizados, por otro lado, se pueden especificar utilizando la propiedad HTML de alto y ancho.

Sintaxis: 

<canvas width="200" 
        height="100" 
        style="border:4px solid #000;">
</canvas>  

Ejemplo: A continuación se muestra la implementación paso a paso del cubo 3D usando lienzo.

índice.html

HTML

<!DOCTYPE html>
<html lang="en">
  
<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content=
        "width=device-width, initial-scale=1.0" />
  
    <title>3D Cube</title>
  
    <style>
        body {
            margin: 0;
        }
  
        canvas {
            display: block;
        }
    </style>
</head>
  
<body>
    <canvas> </canvas>
    <script>
  
        // Constants
        const BACKGROUND_COLOR = "black";
        const CUBE_COLOR = "yellow";
        const POINT_2D = function (x, y) {
            this.x = x;
            this.y = y;
        };
        const POINT_3D = function (x, y, z) {
            this.x = x;
            this.y = y;
            this.z = z;
        };
  
        // Set up the canvas and context
        var canvas = document.querySelector("canvas");
        var context = canvas.getContext("2d");
  
        // Dimensions
        var h = document.documentElement.clientHeight;
        var w = document.documentElement.clientWidth;
        canvas.height = h;
        canvas.width = w;
  
        // Colors and lines
        context.fillStyle = BACKGROUND_COLOR;
        context.strokeStyle = CUBE_COLOR;
        context.lineWidth = w / 100;
        context.lineCap = "round";
  
        // Cube parameters
        var cube_x = 0;
        var cube_y = 0;
        var cube_z = 250;
  
        var cube_size = 100;
        var cube_vertices = [
  
            // Back 4 vertices
            new POINT_3D(
                cube_x - cube_size,
                cube_y - cube_size,
                cube_z - cube_size
            ),
            new POINT_3D(
                cube_x + cube_size,
                cube_y - cube_size,
                cube_z - cube_size
            ),
            new POINT_3D(
                cube_x + cube_size,
                cube_y + cube_size,
                cube_z - cube_size
            ),
            new POINT_3D(
                cube_x - cube_size,
                cube_y + cube_size,
                cube_z - cube_size
            ),
  
            // Front 4 vertices
            new POINT_3D(
                cube_x - cube_size,
                cube_y - cube_size,
                cube_z + cube_size
            ),
            new POINT_3D(
                cube_x + cube_size,
                cube_y - cube_size,
                cube_z + cube_size
            ),
            new POINT_3D(
                cube_x + cube_size,
                cube_y + cube_size,
                cube_z + cube_size
            ),
            new POINT_3D(
                cube_x - cube_size,
                cube_y + cube_size,
                cube_z + cube_size
            ),
        ];
  
        var cube_edges = [
            [0, 1],
            [1, 2],
            [2, 3],
            [3, 0], // Back face
            [4, 5],
            [5, 6],
            [6, 7],
            [7, 4], // Front face
            [0, 4],
            [1, 5],
            [2, 6],
            [3, 7], // Connecting sides
        ];
  
        function project(points3d, w, h) {
  
            // Creating 2d point for every 3d point
            var points2d = new Array(points3d.length);
  
            var focal_length = 200;
  
            for (let index = points3d.length - 1; 
                            index > -1; --index) {
                let p = points3d[index];
  
                let x = p.x * (focal_length / p.z) + w * 0.5;
                let y = p.y * (focal_length / p.z) + h * 0.5;
  
                points2d[index] = new POINT_2D(x, y);
            }
  
            return points2d;
        }
  
        // Set up the animation loop
        var timeDifference,
            timeLast = 0;
        requestAnimationFrame(loop);
  
        function loop(currentTime) {
            timeDifference = currentTime - timeLast;
            timeLast = currentTime;
  
            // Background
            context.fillRect(0, 0, w, h);
  
            // Draw each edge
            var vertices = project(cube_vertices, w, h);
            for (let edge of cube_edges) {
                context.beginPath();
                context.moveTo(
                    vertices[edge[0]].x, 
                    vertices[edge[0]].y
                );
                  
                context.lineTo(
                    vertices[edge[1]].x, 
                    vertices[edge[1]].y
                );
                  
                context.stroke();
            }
  
            // Call the next frame
            requestAnimationFrame(loop);
        }
    </script>
</body>
  
</html>

Producción:

Publicación traducida automáticamente

Artículo escrito por vishalkumar98765432 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *