Advertisement
  1. Web Design
  2. HTML/CSS
  3. SVG

Guía de un Principiante para Dibujar Gráficos en 2D Con Two.js

Scroll to top
Read Time: 11 min

() translation by (you can also view the original English article)

Two.js una API que facilita la creación de formas 2D con código. Siga a lo largo de y usted aprenderá cómo crear y animar formas de JavaScript.

Two.js es independiente del procesador, por lo que puede confiar en la misma API para dibujar con Canvas, SVG o WebGL. La biblioteca tiene muchos métodos que puede utilizar para controlar cómo diferentes formas aparecen en la pantalla o cómo están animados.

Instalación

La versión sin comprimir de la biblioteca tiene un tamaño de alrededor de 128 KB, mientras que la versión comprimida es de 50 KB. Si usas la última versión, puede reducir aún más el tamaño de la biblioteca utilizando una estructura de encargo.

Puede descargar la versión miniaturizada de la biblioteca de GitHub o puede vincular directamente a la versión CDN alojado. Una vez que haya agregado a la biblioteca a su página web, puede empezar dibujar y animar formas u objetos.

Creación de Formas Básicas

En primer lugar, usted necesita a Two.js sobre el elemento que desea dibujar y animar las formas. Puede pasar algunos parámetros al constructor Two para configurar cosas.

Establecer el tipo de procesador utiliza la propiedad type. Se pueden especificar un valor como svg, webgl, lona, etcetera. El type se establece en svg por defecto. La anchura y la altura del espacio de dibujo se pueden especificar utilizando los parámetros width y height. También puede establecer el espacio de dibujo en la pantalla completa disponible mediante el parámetro de fullscreen. Cuando fullscreen se establece en true, los valores de width and height carecerá.

Por último, puede decir Two.js que una animación se inicie automáticamente con la ayuda del parámetro booleano autostart.

Después de pasar todos los parámetros deseados para el constructor, puede iniciar el dibujo de líneas, rectángulos, círculos y elipses.

Se puede dibujar una línea usando two.makeLine (x1, y1, x2, y2). Aquí, (x 1, y1) son las coordenadas del primer punto final y (x2, y2) son las coordenadas del segundo punto final. Esta función devuelve un objeto Two.Line, que puede ser almacenado en una variable para manipular aún más en un momento posterior.

De manera similar, puede dibujar rectángulos redondeados y normales usando two.makeRectangle(x, y, width, height) y two.makeRoundedRectangle(x, y, width, height, radius) respectivamente. Recuerde que x y y determinar el centro del rectángulo, en vez de su parte superior izquierda coordenadas como muchas otras bibliotecas. Los parámetros width y height determina el tamaño del rectángulo. El parámetro radius se utiliza para especificar el valor del radio de la esquina redondeada.

También pueden hacer círculos y elipses en una página web usando two.makeCircle(x, y, radius) y two.makeEllipse(x, y, width, height) respectivamente. Los rectángulos, x e y como parámetros especifican el centro del círculo o elipse. Ajuste de la width y height con el mismo valor en el caso de una elipse se representará como un círculo.

Un método útil en Two.js que se usan con frecuencia es two.makeGroup(objects). Puede pasar una lista de diferentes objetos o pasar una matriz de objetos, trayectorias o grupos como parámetro a este método. También devuelve un objeto Two.Group.

Manipulación de Objetos en un Grupo

Después de haber creado un grupo, puede manipular a todos sus hijos a la vez utilizando propiedades que el grupo pone a su disposición.

Las propiedades de stroke y fill pueden utilizarse para establecer el color de trazo y relleno para todos los niños en un grupo. Se aceptan todas las formas válidas en las que puede representar un color en CSS. Esto significa que usted es libre de usar la notación hexadecimal, RGB y HSL. También simplemente puede utilizar el nombre del color, como orangered, o blue. Del mismo modo, puede definir valores para todas las otras propiedades como linewidthopacitymiter, y cap. Es posible quitar el relleno y el trazo de todos los niños de un grupo utilizando los métodos noFill() y noStroke().

También puede aplicar otras transformaciones físicas como la scalerotation, and translation. Estas transformaciones se aplica sobre objetos individuales. Agregar nuevos objetos a un grupo y quitarlas es fácil con métodos como add(), remove().

Definición de Gradientes y Escribir Texto

Puede definir gradientes lineales y radiales en Two.js. Definir un gradiente no significa que se mostrará automáticamente en la pantalla, pero estará disponible para su uso cuando los valores de fill o stroke de varios objetos.

Se puede definir un degradado lineal con two.makeLinearGradient(x1, y1, x2, y2, stops). Los valores x1 y y1 determinan las coordenadas de inicio del degradado. Del mismo modo, los valores x2 y y2 determinan las coordenadas del extremo de la gradiente. El parámetro de stops es una matriz de instancias de Two.Stop. Definen los colores de cada parte de la matriz y donde las transiciones de cada color en el siguiente. Puede definir mediante new Two.Stop(offset, color, opacity), donde el offset determina el punto en el gradiente donde ese color particular tiene que ser totalmente rendido. El parámetro de color determina el color del degradado en el punto particular. Puede utilizar cualquier representaciones de color válidas de CSS como su valor. Por último, el parámetro opacity determina la opacidad del color. La opacidad es opcional, y puede tener cualquier valor entre 0 y 1.

Gradientes radiales se pueden definir de una manera similar usando two.makeRadialGradient(x, y, radius, stops, fx, fy). En este caso, los valores de x y y determinar el centro del degradado. El parámetro radius especifica hasta dónde debe extenderse el gradiente. También puede pasar una matriz de paradas a este método para fijar la composición de color de los degradados. Los parámetros fx y fy son opcionales, y pueden ser utilizados para especificar la posición focal para el gradiente.

Revisa algunos de los tipos de degradado y su código en el CodePen abajo.

Recuerde que x e y la posición de los gradientes son con respecto al origen de la forma están tratando de llenar. Por ejemplo, siempre tendrá un degradado radial que tiene que para llenar una forma del centro x e y en cero.

Two.js también le permite escribir texto en el área de dibujo y actualizarlo más adelante según sus necesidades. Esto requiere el uso del método two.makeText(message, x, y, styles). Puede ser evidente en el nombre de los parámetros de este message es el texto que desea escribir. Los parámetros x e y son las coordenadas del punto que actuará como centro para escribir el texto. El parámetro de styles es un objeto que puede utilizarse para establecer los valores de un conjunto grande de propiedades.

Puede utilizar estilos para definir los valores de propiedades como familysize, y alignment. También puede especificar el valor de las propiedades como fillstrokeopacityrotationscale, y translation.

Creación de un Proyecto de Two.js

Después de aprender sobre todos estos métodos y propiedades, es hora de aplicarlos a un proyecto. En este tutorial, les mostraré cómo usar Two.js para representar los diez primeros elementos de la tabla periódica con los electrones girando alrededor del núcleo. El núcleo también tendrá algún leve movimiento para mejorar el atractivo visual de nuestra representación.

Empezaremos por definir algunas variables y funciones que se utilizará más adelante.

1
var centerX = window.innerWidth / 2;
2
var centerY = window.innerHeight / 2;
3
4
var elem = document.getElementById("atoms");
5
6
var elementNames = [
7
  "",
8
  "Hydrogen",
9
  "Helium",
10
  "Lithium",
11
  "Beryllium",
12
  "Boron",
13
  "Carbon",
14
  "Nitrogen",
15
  "Oxygen",
16
  "Fluorine",
17
  "Neon"
18
];
19
20
var styles = {
21
  alignment: "center",
22
  size: 36,
23
  family: "Lato"
24
};
25
26
var nucleusCount = 10;
27
var nucleusArray = Array();
28
29
var electronCount = 10;
30
var electronArray = Array();
31
32
function intRange(min, max) {
33
  return Math.random() * (max - min) + min;
34
}

El código anterior almacena las coordenadas del centro de la ventana en la variables centerX y centerY. Estos se utilizarán más adelante para colocar nuestro átomo en el centro. El array elementNames contiene los nombres de los diez primeros elementos de la tabla periódica. El índice de cada nombre corresponde al número de electrones y protones de ese elemento, y comienza con una cadena vacía. El objeto de styles contiene las propiedades de estilo del objeto de texto.

También hemos definido una función intRange() para obtener un valor entero aleatorio dentro da extremos.

1
var two = new Two({ fullscreen: true }).appendTo(elem);
2
3
var protonColor = two.makeRadialGradient(
4
  0,
5
  0,
6
  15,
7
  new Two.Stop(0, "red", 1),
8
  new Two.Stop(1, "black", 1)
9
);
10
11
var neutronColor = two.makeRadialGradient(
12
  0,
13
  0,
14
  15,
15
  new Two.Stop(0, "blue", 1),
16
  new Two.Stop(1, "black", 1)
17
);
18
19
for (i = 0; i < nucleusCount; i++) {
20
  nucleusArray.push(two.makeCircle(intRange(-10, 10), intRange(-10, 10), 8));
21
}
22
23
nucleusArray.forEach(function(nucleus, index) {
24
  if (index % 2 == 0) {
25
    nucleus.fill = protonColor;
26
  }
27
  if (index % 2 == 1) {
28
    nucleus.fill = neutronColor;
29
  }
30
  nucleus.noStroke();
31
});

Esto crea una instancia de dos y define dos gradientes radiales. Los gradientes radiales de rojo/negro representará protones y neutrones representará a degradados de azul/negro.

Hemos utilizado la función intRange() para colocar todos estos neutrones y protones dentro de 20 píxeles de cada uno. El método makeCircle() establece también el radio de estos protones y neutrones en 10 píxeles. Después de eso, iterar sobre nucleusArray y rellenar cada círculo con un diverso gradiente alternativamente.

1
for (var i = 0; i < 10; i++) {
2
  if (i < 2) {
3
    var shellRadius = 50;
4
    var angle = i * Math.PI;
5
    electronArray.push(
6
      two.makeCircle(
7
        Math.cos(angle) * shellRadius,
8
        Math.sin(angle) * shellRadius,
9
        5
10
      )
11
    );
12
  }
13
  if (i >= 2 && i < 10) {
14
    var shellRadius = 80;
15
    var angle = (i - 2) * Math.PI / 4;
16
    electronArray.push(
17
      two.makeCircle(
18
        Math.cos(angle) * shellRadius,
19
        Math.sin(angle) * shellRadius,
20
        5
21
      )
22
    );
23
  }
24
}

Colocación de neutrones y protones dentro del núcleo fue fácil. Sin embargo, colocar correctamente los electrones en una distancia uniforme requiere matemáticas un poco. Utilizamos la variable shellRadius para especificar la distancia de cáscaras de electrones distintos del núcleo. Un círculo entero cubre un ángulo igual a 2 radianes de PI. Podemos colocar diferentes electrones uniformemente distribuyendo igualmente las 2 radianes de PI entre ellos.

Las funciones Math.cos() y Math.sin() se utilizan para separar los componentes horizontales y verticales del vector de posición de electrones diferentes basado en su ángulo.

1
var orbitA = two.makeCircle(centerX, centerY, 50);
2
orbitA.fill = "transparent";
3
orbitA.linewidth = 2;
4
orbitA.stroke = "rgba(0, 0, 0, 0.1)";
5
6
var orbitB = two.makeCircle(centerX, centerY, 80);
7
orbitB.fill = "transparent";
8
orbitB.linewidth = 2;
9
orbitB.stroke = "rgba(0, 0, 0, 0.1)";
10
11
var groupElectronA = two.makeGroup(electronArray.slice(0, 2));
12
groupElectronA.translation.set(centerX, centerY);
13
groupElectronA.fill = "orange";
14
groupElectronA.linewidth = 1;
15
16
var groupElectronB = two.makeGroup(electronArray.slice(2, 10));
17
groupElectronB.translation.set(centerX, centerY);
18
groupElectronB.fill = "yellow";
19
groupElectronB.linewidth = 1;
20
21
var groupNucleus = two.makeGroup(nucleusArray);
22
groupNucleus.translation.set(centerX, centerY);

Esta parte del código pone electrones de diferentes así como neutrones y protones en sus propios grupos separan. También establece los colores de relleno para todos los electrones en una órbita concreta a la vez.

1
two
2
  .bind("update", function(frameCount) {
3
    groupElectronA.rotation += 0.025 * Math.PI;
4
    groupElectronB.rotation += 0.005 * Math.PI;
5
    groupNucleus.rotation -= 0.05;
6
  })
7
  .play();
8
9
var text = two.makeText("", centerX, 100, styles);
10
11
nucleusArray.forEach(function(nucleus, index) {
12
  nucleus.opacity = 0;
13
});
14
15
electronArray.forEach(function(electron, index) {
16
  electron.opacity = 0;
17
});

Esta parte del código define la opacidad de los electrones y protones a cero. También se dice Two.js para girar los electrones y protones a velocidades específicas.

1
visible = 0;
2
3
document.addEventListener("click", function(event) {
4
  if (visible < nucleusArray.length) {
5
    nucleusArray[visible].opacity = 1;
6
    electronArray[visible].opacity = 1;
7
    visible++;
8
    text.value = elementNames[visible];
9
  }
10
  else {
11
    nucleusArray.forEach(el => el.opacity=0);
12
    electronArray.forEach(el => el.opacity=0);
13
    visible = 0;
14
    text.value = elementNames[0];
15
  }
16
});         
17

La parte final del código nos permite recorrer en iteración los elementos haciendo clic en el ratón o tapping. Para cargar el siguiente elemento, hacemos visible un electrón y un protón o neutrón más y actualizamos el nombre del elemento. Después de hacer clic en el último elemento, todas las partículas se ocultan nuevamente para que podamos comenzar de nuevo. La variable visible realiza un seguimiento de la cantidad de partículas atómicas que están disponibles para que pueda mostrarlas u ocultarlas en consecuencia.

Intente hacer clic o tocar en la próxima demostración de CodePen para ver los primeros diez elementos de la tabla periódica.

Pensamientos Finales

Comenzamos este tutorial con una breve introducción a la biblioteca Two.js y cómo se puede usar para dibujar formas como rectángulos, círculos y elipses. Después de eso, discutimos cómo podemos agrupar diferentes objetos para manipularlos todos a la vez. Usamos esta capacidad para agrupar elementos para traducirlos y rotarlos en sincronización. Todas estas herramientas se combinaron en nuestra animación de los átomos de los primeros diez elementos en la tabla periódica.

Como puede ver, crear gráficos 2D animados es muy fácil usando Two.js. El objetivo de esta publicación fue ayudarlo a comenzar rápidamente, por lo que solo cubrimos los conceptos básicos. Sin embargo, ¡leer la documentación oficial para aprender más sobre la biblioteca!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Web Design tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.