Crea imágenes 3D interactivas con tres.js

Sep 14, 2025
Cómo
[dieciséis]

Este tutorial de WebGL demuestra cómo crear una simulación ambiental en 3D que muestra lo que sucede con el mundo a medida que cambian los niveles de CO2. (Puedes ver más Experimentos de webgl aquí.)

El usuario controla los niveles utilizando un control deslizante de rango de entrada HTML. A medida que el usuario agrega más CO2, aparecerá más smog en la escena, los niveles de agua aumentarán a medida que el aumento de la temperatura se derrite más gorras de hielo polares, entonces los árboles desaparecerán a medida que se sumeran en agua.

Los elementos están animados dentro y fuera con una biblioteca de Tween y arrastrando el control deslizante en la dirección opuesta revertirán los efectos. ¡Si solo fuera tan fácil en la vida real!

01. Mostrar elementos

The basic layout of the page is shown here before the  3D scene has been added. The image is a transparent  PNG at the top of the screen and there is a range slider at the bottom

[dieciséis] El diseño básico de la página se muestra aquí antes de que se haya agregado la escena 3D. La imagen es un PNG transparente en la parte superior de la pantalla y hay un control deslizante de rango en la parte inferior

Para iniciar el proyecto, abra la carpeta 'Inicio' en su Código IDE. Abrir index.html Y verás que hay un andamio básico que ya tiene algún código. En la sección del cuerpo, agregue los elementos de visualización aquí que se utilizarán como la interfaz al contenido 3D.

 & lt; div id = "encabezado" y gt;
  & lt; img src = "img / co2.png" id = "insignia" & gt;
  & lt; / DIV & GT;
  & lt; div id = "interno" & gt;
  & lt; Clase de entrada = "Diapositiva" tipo = "Rango" MIN = "0" MAX = "7" STEP = "1" Value = "0" onInput = "ShowVal (esto.value)" & gt;
  & lt; p & gt; arrastre el control deslizante para cambiar el nivel de CO2 & LT; / P & GT;
  & lt; / DIV & GT; 

02. Vinculando las bibliotecas.

El contenido 3D se muestra a través de tres.js, que se incluye aquí. Un modelo de colada se agregará a la escena más tarde. La biblioteca adicional para cargar esto está incluida, junto con una biblioteca de Tween básica. Todas las siguientes líneas vinculan hasta los efectos de procesamiento posterior a la publicación que agregarán el pulido de acabado.

 & lt; script src = "js / thre thre.min.js" & gt; / lt; / script & gt;
& lt; script src = "js / colladaloader.js" & gt; & lt; / script & gt;
& lt; script src = "js / tween.min.js" & gt; / lt; / script & gt;
& lt; script src = 'js / postprocessing / effcrapser.js' & gt; & lt; / script & gt;
& lt; script src = 'js / postprocessing / renderpass.js' & gt; / lt; / script & gt;
& lt; script src = 'js / postprocessing / shaderpass.js' & gt; & lt; / script & gt;
& lt; script src = 'js / postprocessing / maskass.js' & gt; / lt; / script & gt; 

03. POST PRESENTACIÓN SHASTERS

Después de que la escena haya prestado cada cuadro, se agregarán varios efectos posteriores al proceso. Estas son las bibliotecas que capacitan el efecto de grano de película, un borrón de cambio de inclinación en la parte superior e inferior de la pantalla, finalmente, finalmente, una viñeta se desvanece a los bordes de la pantalla.

04. Añadiendo las variables.

Algunos del Código se han completado para usted. Verá un comentario donde agregar el resto del código del tutorial. Se utilizan varias variables en esta escena 3D, que cuidan la resolución de la pantalla, varios modelos 3D y el procesamiento posterior. Dos variables importantes son las waterht para la altura del agua y la ultramar , que recuerda la última posición del control deslizante.

 var screen_width = window.innerwidth, screen_height = window.innerheight,
 Mousex = 0, Mouseyy = 0, WindowHalfx = Window.InnerWidth / 2, WindowHalfy = Window.InnerHeight / 2, Cámara, Escena, Render, agua, Waterht = 1;
var textureloader = nuevo Three.TexturEoGer ();
VAR compositor, shadetime = 0, película, renderpass, copypass, effVIGnette, grupo, ultral = 0; 

05. Inicialización de la escena.

La función INIT es una gran parte del código, asegurando que la escena esté configurada con el aspecto correcto al principio. Se agrega un contenedor a la página, y aquí es donde se mostrará la escena 3D. Se agrega una cámara y algo de niebla de fondo para desvanecer la distancia.

 FUNCIÓN INIT () {
  VAR Container = Document.CreateElement ('DIV');
  documento.body.appendchild (contenedor);
  cámara = nuevo tres.perspectiveCamera (75, screen_width / screen_height, 1, 10000);
  cámara.posición.sition.set (2000, 100, 0);
  escena = nuevo tres.scene ();
  escena.fog = nuevo tres.fogexp2 (0xb6d9e6, 0.0025);
  Renderer = NUEVO TRES.WEBGLRENDERER ({
  Antialias: verdadero
  }); 

06. Configuración del renderizador

El renderizador recibe un color de fondo y la resolución se establece en el mismo tamaño que la relación píxel de la pantalla. Las sombras están habilitadas en la escena, y se coloca en la página en el elemento del contenedor. Se agrega una luz del hemisferio, que tiene un color cielo y un color.

render.setClearColor (0xADC9D4);
renderer.setpixelratio (ventana.devicepixelratio);
render.setsize (screen_width, screen_height);
renderer.shadowmap.enabled = verdadero;
render.shadowmap.type = three.pcfsoftshadowmap;
contenedor.appendchild (Renderer.Melement);
var luz = new three.hemispherightight (0xa1e2f5, 0x6f4d25, 0.5);
escena.add (luz); 

07. Variables de sombreado

Las variables que controlarán los efectos del proceso de sombreado posteriores se dan sus valores aquí. Estas variables se utilizarán más adelante para agregar valores que controlen el look. Si se ve en la función Params, verá esto ya completado para usted.

 Renderpass = nuevo tres.RenderPass (escena, cámara);
hblur = nuevo tres.shadepass (tres.horizontaltiltshiftshader);
vblur = nuevo tres.shadepass (Three.verticaltiltshiftshader);
pelicular = nuevo tres.shadepass (tres.filmshader);
EffectVIGNETTE = NUEVO TRES.SHAERPASS (TRES.VIGNETHADERADOR);
CopyPass = Nuevo Three.ShadePass (Three.Copyshader); 

08. Componiendo los efectos.

Los efectos deben estar apilados en algo llamado un compositor de efectos. Esto toma cada efecto y aplica el estilo. Luego, todo se muestra como una escena final en la pantalla, que verá cuando se agrega la función Rendering más adelante.

09. Cargando la imagen de la nube

The params() function is called in step 9, which sets  the parameters for the post processing vignette and film grain effect

[dieciséis] La función Params () se llama en el Paso 9, que establece los parámetros para la viñeta Post Processing y el efecto de grano de película

los paramentales Se llama la función y esto establece los parámetros individuales para los efectos posteriores. Se crea un nuevo grupo y esto mantendrá todo el contenido de la escena dentro de ella, para facilitar la rotación del grupo de objetos. Una imagen de PNG transparente se carga como un material de nube que se utiliza como un sprite dentro de la escena.

 Params ();
  grupo = nuevo tres.Group ();
  escena.add (grupo);
  var cloud = textureloader.load ("img / cloud.png");
  Material = nuevo tres.spritematerial ({
  Mapa: Cloud, Opacidad: 0.6, Color: 0x888888, Niebla: VERDADERO
}); 

10. Doble para el bucle

Se crean ocho grupos dentro de la primera. por lazo. Estos ocho grupos han agregado 35 nubes en el segundo para el bucle. Cada nube se coloca en una ubicación al azar sobre la escena. Los grupos se encenderán y apagan con el control deslizante por el usuario para mostrar que el smog que se agrega y se elimine en la visualización.

 para (J = 0; J & LT; 8; J ++) {
  var g = nuevo tres.Group ();
  para (i = 0; i & lt; 35; i ++) {
  var x = 400 * math.random () - 200;
  var y = 60 * math.random () + 60;
  var z = 400 * math.random () - 200;
  sprite = nuevo tres.sPRite (material);
  sprite.position.set (x, y, z); 

11. Escalado de la nube

The first group of clouds can be seen in the scene. The others are hidden and will be visible when controlled from the slider by the user

[dieciséis] El primer grupo de nubes se puede ver en la escena. Los otros están ocultos y serán visibles cuando se controlan desde el control deslizante por el usuario.

La nube se escala hasta un tamaño que le permite ser visible en la escena. Cada grupo de nubes después del primer grupo se reduce hacia abajo para que sean virtualmente invisibles para el renderizador. Así es como se harán visibles más adelante, escalándolos de nuevo a su tamaño completo, ya que esto le dará un buen efecto de presencia.

12. Cargando el modelo.

Ahora el cargador colada está configurado para cargar el escena.dae modelo. Cuando termine de carga, el modelo se escanea y cualquier objeto que suceda para que se haga una malla para lanzar sombras y recibir sombras para dar una profundidad adicional a la escena.

 var cargador = nuevo tres.colladaloader ();
cargador.opciones.convertpaxis = verdadero;
cargador.load ('scene.dae', función (colada) {
  var dae = colada.scene;
  dae.traverse (función (niño) {
  if (niño instancef three.mesh) {
  niño.castshadow = verdadero;
  niño.receiveshadow = verdadero;
  }
}); 

13. Encontrar detalles en la escena.

Como el modelo ya está listo para mostrar, está configurado en el tamaño correcto para adaptarse a la escena. El código debe controlar específicamente la altura del agua para que el modelo de agua se encuentre en la escena y se pase a la variable global. De manera similar, la luz principal debe encontrarse para que pueda establecerse para proyectar sombras.

 dae.scale.x = dae.scale.y = dae.scale.z = 0.5;
dae.updatematrix ();
grupo.add (dae);
agua = escena.getObjectbyName ("agua", verdadero);
agua = agua. Los niños 
; luz = escena.getObjectbyName ("Splight", VERDADERO); luz = luz.children
;

14. Configuraciones de luz

The model has been added with the main light set to emit shadows onto the scene. There is something substantial to look at in the scene so the tilt shift blur effect can be seen at the front and back of the scene

[dieciséis] El modelo se ha agregado con el conjunto de luz principal para emitir sombras en la escena. Hay algo sustancial de mirar en la escena, por lo que el efecto de desenfoque de cambio de inclinación se puede ver en la parte delantera y trasera de la escena.

Ahora, a medida que se encuentra el foco de atención, los detalles que lo hacen fundir sombras en la escena. El desvanecimiento de la luz en los bordes del lugar también se establece aquí. Finalmente, como el modelo es el elemento más grande para cargar, el resto de la escena se configurará antes de que se ejecute este código, por lo tanto, la función de renderizado se puede llamar cada cuadro.

 Light.Target.Position.Set (0, 0, 0);
  luz.castshadow = verdadero;
   luz.shadow = nuevo tres.lightshadow (nuevo tres.perspectiveCamera (90, 1, 90, 5000));
  luz.shadow.bias = 0.0008;
  luz.shadow.mapsize.width = 1024;
  luz.shadow.mapsize.height = 1024;
  luz.penumbra = 1;
  luz.decray = 5;
  hacer();
}); 

15. Último código de inicialización

With the mouse and touch events set up, the scene becomes reactive to the mouse movement, zooming in and out while being able to tilt the scene up and down

[dieciséis] Con el mouse y los eventos táctiles configurados, la escena se vuelve reactiva al movimiento del mouse, zoom hacia adentro y hacia afuera mientras pueda inclinar la escena hacia arriba y hacia abajo

La parte final de la función INIT establece varios ratones y entradas táctiles que moverán la cámara en función de su posición. Un evento también está registrado para escuchar si la pantalla se cambia de tamaño y esto actualizará la pantalla renderizada.

 document.addeventlistener ('mousemove', ondocumentmouseemove, falso);
  document.addeventlistener ('touchstart', ondocumenttouchstart, falso);
  document.addeventlistener ('touchmove', ondocumenttouchmove, falso);
  ventana.addeventlistener ('tamaño de tamaño', onwindowresize, falso);
} 

16. Represando cada marco.

La función de renderización se establece en llamadas tan cerca de 60 cuadros por segundo, ya que el navegador puede administrar. El grupo, que contiene todos los modelos, está configurado para girar por una pequeña cantidad cada cuadro. La posición de la cámara se actualiza desde el mouse o la entrada táctil y continúa mirando el centro de la escena.

17. Actualizando la pantalla

El tiempo de sombreado es una variable que simplemente sube por 0.1 cada cuadro y esto se pasa a la cera para que el grano de la película de ruido se pueda actualizar. El compositor de efectos se actualiza y se presta a la pantalla. Finalmente, el motor Tween también se actualiza.

 ShadeTime + = 0.1;
  Filmpass.uniforms ['Tiempo']. Valor = sombreado;
  compositor.render (0.1);
  Tween.update ();
} 

18. Obtener entrada de usuario

El control deslizante Rango de entrada, agregado en el Paso 1, llama al espectáculo Función, que se define aquí. Cuando el usuario hace clic en esto, simplemente verifica que el control deslizante se haya movido. Si se mueve hacia arriba, el siguiente grupo de nube se amplía con un entre los 0,8 segundos. La altura de agua se actualiza y esto también se interpone hasta la nueva altura.

 Función ShowVal (Val) {
  Si (Val! = Último) {
  if (Val & gt; Último) {
  Nuevo Tween.Toen (Group.Children [Val] .scale) .to ({x: 1, y: 1, z: 1}, 800). Teasing (tween.esing.quadratic.inout) .start ();
  waterht + = 0.07;
  Nuevo Tween.Toen (Water. Scale) .to ({Y: Waterht}, 800). Teasing (tween.Easing.Quadratic.inout) .start (); 

19. Agarrando los árboles.

La variable TEMP encuentra el grupo actual de árboles que debe eliminar de la escena y aquí las escala con una interpolación solo en el eje Y. Se usa una flexibilización elástica para que esto surja fuera de la vista en la pantalla para un efecto agradable. A medida que más agua y nubes están en la escena, los árboles desaparecen.

20. Entrada opuesta

El primer contenido revisó si el control deslizante se deslizó hacia arriba o hacia la derecha. Ahora el código detecta que el usuario se desliza a la izquierda. Las nubes se reducen con un entretenido y así es el nivel del agua para mostrar un efecto de enfriamiento en la tierra.

 Nuevo Tween.Toen (Group.Children [Último] .scale) .to ({x: 0.001, y: 0.001, z: 0.001}, 800). Teasing (tween.esing.quadratic.inout) .start ( )
Waterht - = 0.07;
Nuevo Tween.Toen (Water. Scale) .to ({Y: Waterht}, 800). Teasing (tween.Easing.Quadratic.inout) .start (); 

21. Terminando

With everything working, you can see the background fog clearly as you move the mouse so that the camera gets a higher vantage point on the scene

[dieciséis] Con todo funcionando, puedes ver la niebla de fondo claramente mientras mueves el ratón para que la cámara obtenga un punto de vista más alto en la escena.

El paso final es recuperar los árboles, por lo que se escaman de nuevo a su tamaño original con un entretento elástico.Guarde la escena y vea la página web de un servidor alojado localmente en su propia computadora o en un servidor web.Podrá interactuar con el movimiento del mouse y el control deslizante para cambiar la pantalla de la escena.

Este artículo apareció originalmente en Diseñador web Número 265. Comprarlo aquí .

Artículos relacionados:

  • Cómo codificar un marcador de realidad aumentada
  • 20 Ejemplos increíbles de WebGL en acción.
  • 9 usos brillantes de 3D en diseño web

Cómo - Artículos más populares

Tipografía de marca: una guía completa

Cómo Sep 14, 2025

[dieciséis] Pentagram creó un tipografía a medida para el teatro público. (Crédito de la imagen: Pentagrama para el públic..


Construye una UI controlada por voz

Cómo Sep 14, 2025

Hemos visto muchas API nuevas agregadas a la web en los últimos años que realmente han habilitado el contenido web que tenga el mismo tipo de funcionalidad que las aplicaciones han tenido d..


Cómo codificar efectos de texto inteligentes con CSS

Cómo Sep 14, 2025

[dieciséis] [Imagen: Niño Medio] Los enlaces de reinversión son una excelente manera de llamar la atención de un usuario, ..


Construye diseños adaptativos sin consultas de medios

Cómo Sep 14, 2025

Durante mucho tiempo, estaba tratando de alcanzar una composición visual perfecta en las páginas web. He estado teniendo mucho dolor con los puntos de interrupción de CSS en mi trabajo dia..


Construye terreno en Houdini 17

Cómo Sep 14, 2025

[dieciséis] En Houdini 17, Sidefx introdujo algunas nuevas herramientas y mejoró otros para ampliar la gama de oportunidades para que..


Actualiza tus texturas en Diseñador de sustancias

Cómo Sep 14, 2025

[dieciséis] El artista del entorno principal de Bungie Daniel Thiger nos dirige a través de sus técnicas para producir materiales de..


Cómo prototipo Una aplicación móvil con Adobe XD

Cómo Sep 14, 2025

[dieciséis] Este tutorial, mostrándole cómo hacer un prototipo de aplicación móvil en Adobe XD, se juntó usando ..


Crea un panel de control sensible con Figma

Cómo Sep 14, 2025

Figma es una herramienta de gráficos para los diseñadores de UI. Tiene una interfaz simple y le permite colaborar en el trabajo con sus compañeros de equipo. Si desea trabajar fuera de lí..


Categorías