Wawa Sensei logo
LoginEnroll now

HTML

Starter pack

Hasta ahora, las experiencias 3D que hemos construido conten铆an solo un canvas elemento HTML donde se renderizaban nuestras escenas 3D de Three.js.

Hay dos maneras de hacer nuestras experiencias m谩s interactivas:

  • Construir tu p谩gina HTML como lo haces habitualmente y a帽adir tu escena 3D como fondo en un canvas a pantalla completa. Luego int茅grala bien conect谩ndolas a trav茅s de eventos de rat贸n o desplazamiento de p谩gina. Veremos c贸mo lograr esto en la secci贸n de scroll en la lecci贸n de animaciones.
  • Agregar elementos HTML como si fueran objetos 3D en nuestras escenas 3D. Esto es lo que veremos en esta lecci贸n.

Esas dos aproximaciones no son mutuamente exclusivas. Puedes combinarlas para crear experiencias inmersivas.

Showroom online de Ikea

Para esta lecci贸n, imaginemos que queremos crear un showroom online para Ikea. El paquete de inicio contiene varios modelos 3D de mobiliario de cocina (Todos provenientes de Quaternius en Poly Pizza, gracias 馃檹).

3D Kitchen

Esto es lo que tenemos hasta ahora. Una cocina de estilo japon茅s.

Intentaremos a帽adir etiquetas en los muebles de la cocina para mostrar el nombre y precio de cada art铆culo.

Antes de hacerlo, perm铆teme explicar algunas partes del paquete de inicio.

Para hacer el c贸digo gen茅rico, en vez de declarar cada art铆culo manualmente y reescribir la l贸gica de carga y posicionamiento, cre茅 un array de items.

const sceneItems = [
  {
    model: "Japanese Door.glb",
    position: [0, -0.88, -1.2],
    scale: 1.8,
  },
  {
    model: "Counter Sink.glb",
    position: [1.3, 0, -2.8],
  },
  {
    model: "Chopping board.glb",
    position: [2.8, 1.9, -2.8],
    scale: 0.5,
  },
  {
    model: "Fridge.glb",
    position: [-2.1, 0, -3],
  },
  {
    model: "Table.glb",
    position: [-1, 0, 2],
    scale: [1, 1, 1],
  },
  {
    model: "Dango.glb",
    position: [-1.4, 1.64, 2],
    scale: 0.72,
    rotation: [0, Math.PI / 6, 0],
  },
];

Luego cre茅 un componente gen茅rico llamado Item que toma la ruta del modelo y otros props de transformaci贸n (position, rotation, scale...):

const Item = ({ model, position, rotation, ...props }) => {
  const gltf = useGLTF(`models/${model}`);

  return (
    <group position={position} rotation={rotation}>
      <primitive object={gltf.scene} {...props} />
    </group>
  );
};

El componente se encarga de cargar el modelo 3D y posicionarlo en la escena. Eleg铆 un grupo como elemento ra铆z para poder agregar posteriormente elementos HTML como hijos.

Luego recorremos el array de items y renderizamos un componente Item para cada art铆culo:

export const Experience = () => {
  return (
    <>
      {sceneItems.map((item, index) => {
        return <Item key={index} {...item} />;
      })}
    </>
  );
};

Elementos HTML en 3D

Ahora que tenemos un componente gen茅rico que puede renderizar cualquier modelo 3D y posicionarlo en la escena, podemos enfocarnos en nuestras etiquetas de muebles.

Vamos a a帽adir m谩s informaci贸n a nuestro array de items agregando las propiedades label y price:

const sceneItems = [
  {
    model: "Japanese Door.glb",
    position: [0, -0.88, -1.2],
    scale: 1.8,
    name: "Hemnes",
    price: 300,
  },
  {
    model: "Counter Sink.glb",
    position: [1.3, 0, -2.8],
    name: "Lill氓ngen",
    price: 450,
  },
  {
    model: "Chopping board.glb",
    position: [2.8, 1.9, -2.8],
    scale: 0.5,
    name: "Skogsta",
    price: 25,
  },
  {
    model: "Fridge.glb",
    position: [-2.1, 0, -3],
    name: "Lagan",
    price: 600,
  },
  {
    model: "Table.glb",
    position: [-1, 0, 2],
    scale: [1, 1, 1],
    name: "Lerhamn",
    price: 80,
  },
  {
    model: "Dango.glb",
    position: [-1.4, 1.64, 2],
    scale: 0.72,
    rotation: [0, Math.PI / 6, 0],
    name: "Dango",
    price: 4,
  },
];

No te ofendas por los nombres y precios, los gener贸 GitHub Copilot...

Ahora podemos actualizar nuestro componente Item para obtener los props name y price y renderizarlos como elementos HTML:

End of lesson preview

To get access to the entire lesson, you need to purchase the course.