Skip to main content

🎨 Cargar un Modelo en Three.js con React Three Fiber

🛠️ useLoader y GLTFLoader

Para cargar un modelo GLTF en React Three Fiber usamos el hook useLoader junto con GLTFLoader de Three.js.

📌 Ejemplo básico:

import { Canvas, useLoader } from "@react-three/fiber";
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";

function Model() {
const model = useLoader(GLTFLoader, "/path/to/model.glb");

return <primitive object={model.scene} scale={1} />;
}

export default function App() {
return (
<Canvas>
<ambientLight />
<Model />
</Canvas>
);
}

🔹 primitive object={model.scene} permite renderizar el modelo en la escena.


🚀 Optimización con Draco

Draco es una tecnología de compresión de Google que reduce el tamaño de los archivos GLTF.

📌 Ejemplo con DRACOLoader

import { useLoader } from "@react-three/fiber";
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";
import { DRACOLoader } from "three/examples/jsm/loaders/DRACOLoader";

function Model() {
const model = useLoader(GLTFLoader, "/path/to/model.glb", (loader) => {
const dracoLoader = new DRACOLoader();
dracoLoader.setDecoderPath("/path/to/draco/");
loader.setDRACOLoader(dracoLoader);
});

return <primitive object={model.scene} scale={1} />;
}

🔹 setDecoderPath() define la ruta de los archivos de decodificación Draco.


Lazy Load con Suspense

Para evitar cargar el modelo inmediatamente, usamos React Suspense, lo que retrasa la carga hasta que el modelo esté listo.

📌 Ejemplo con Suspense y fallback

import { Canvas } from "@react-three/fiber";
import { Suspense } from "react";

function Model() {
const model = useLoader(GLTFLoader, "/path/to/model.glb");
return <primitive object={model.scene} scale={1} />;
}

export default function App() {
return (
<Canvas>
<ambientLight />
<Suspense fallback={<mesh><boxGeometry /><meshStandardMaterial color="gray" /></mesh>}>
<Model />
</Suspense>
</Canvas>
);
}

🔹 fallback muestra un elemento mientras el modelo carga.


🏎️ useGLTF de Drei

Drei ofrece useGLTF, un loader más optimizado que automáticamente carga Draco si es necesario.

📌 Ejemplo con useGLTF

import { useGLTF } from "@react-three/drei";

function Model() {
const { scene } = useGLTF("/path/to/model.glb");
return <primitive object={scene} />;
}

🔹 useGLTF.preload("/path/to/model.glb") se usa al final del componente para precargar el modelo.


🏗️ Cargar Modelos como Componentes

Podemos encapsular la carga de un modelo en un componente reutilizable.

📌 Ejemplo: Crear un componente GltfModel

import { useGLTF } from "@react-three/drei";

export default function GltfModel({ path, scale = 1, position = [0, 0, 0] }) {
const { scene } = useGLTF(path);
return <primitive object={scene} scale={scale} position={position} />;
}

📌 Uso del componente en la escena

import { Canvas } from "@react-three/fiber";
import { Suspense } from "react";
import GltfModel from "./GltfModel";

export default function App() {
return (
<Canvas>
<ambientLight />
<Suspense fallback={<mesh><boxGeometry /><meshStandardMaterial color="gray" /></mesh>}>
<GltfModel path="/model.glb" scale={1.5} position={[0, -1, 0]} />
</Suspense>
</Canvas>
);
}

🔹 GltfModel encapsula la lógica de carga y renderizado. 🔹 Reutilizable para cualquier modelo GLTF. 🚀

🎨 Uso de useGLTF de Drei

📌 Descripción

useGLTF de Drei simplifica la carga de modelos, integrando optimizaciones automáticas.

📌 Ejemplo

import { useGLTF } from "@react-three/drei";

function Model() {
const { scene } = useGLTF("/model.glb");
return <primitive object={scene} />;
}

📌 Recomendación: Usa useGLTF.preload("/model.glb") para precargar modelos y mejorar el rendimiento.


🏗️ Cargar Modelos como Componentes

📌 Descripción

Encapsular modelos en un componente reutilizable mejora la modularidad del código.

📌 Ejemplo

import { useGLTF } from "@react-three/drei";

export default function GltfModel({ path, scale = 1, position = [0, 0, 0] }) {
const { scene } = useGLTF(path);
return <primitive object={scene} scale={scale} position={position} />;
}

📌 Uso del Componente

import { Canvas } from "@react-three/fiber";
import { Suspense } from "react";
import GltfModel from "./GltfModel";

export default function App() {
return (
<Canvas>
<ambientLight />
<Suspense fallback={<mesh><boxGeometry /><meshStandardMaterial color="gray" /></mesh>}>
<GltfModel path="/model.glb" scale={1.5} position={[0, -1, 0]} />
</Suspense>
</Canvas>
);
}

GltfModel encapsula la lógica de carga y renderizado, haciéndolo reutilizable. 🚀


📦 Uso de gltfjsx para Conversión Automática

📌 Descripción

gltfjsx convierte modelos GLTF en componentes JSX reutilizables, optimizando su estructura y rendimiento.

📌 Ejemplo de Conversión

npx gltfjsx model.glb --transform

Esto generará un archivo Model.jsx optimizado.

📌 Ejemplo de Componente Generado

import { useGLTF } from "@react-three/drei";

export function Model(props) {
const { nodes, materials } = useGLTF("/model-transformed.glb");
return (
<group {...props} dispose={null}>
<mesh geometry={nodes.robot.geometry} material={materials.metal} />
<mesh geometry={nodes.rocket.geometry} material={materials.wood} />
</group>
);
}

useGLTF.preload("/model.glb");

📌 Recomendaciones

  • Usar --transform para generar versiones optimizadas de los modelos.
  • Precargar los modelos con useGLTF.preload para mejorar el tiempo de carga.
  • Modificar el material dinámicamente:
    <mesh geometry={nodes.robot.geometry} material={materials.metal} material-color="green" />

gltfjsx facilita la integración y optimización de modelos en React Three Fiber. 🚀