title: Cargar Modelos description: Carga modelos 3D en tus escenas de Tres. author: alvarosabu thumbnail: /recipes/gltf-model.png
Todos los modelos utilizados en esta guía son de Alvaro Saburido.
Los modelos 3D están disponibles en cientos de formatos de archivo, cada uno con diferentes propósitos, características variadas y complejidad variable.
Para esta guía, nos vamos a centrar en cargar modelos gLTF (GL Transmission Format), que son el formato más común para modelos 3D en la web.
Hay varias formas de cargar modelos en TresJS:
::: warning Por favor, ten en cuenta que en los ejemplos anteriores utilizamos el await de nivel superior, asegúrate de envolverlo con un componente Suspense. Consulta Suspense para obtener más información. :::
useLoader
El composable useLoader
te permite pasar cualquier tipo de cargador de three.js y una URL para cargar el recurso. Devuelve una Promise
con el recurso cargado.
Para obtener una explicación detallada de cómo usar useLoader
, consulta la documentación de useLoader.
import { useLoader } from '@tresjs/core'
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader'
const { scene } = await useLoader(GLTFLoader, '/models/AkuAku.gltf')
Luego puedes pasar la escena del modelo a un componente primitive
de TresJS para renderizarlo:
<TresCanvas>
<primitive :object="scene" />
</TresCanvas>
El componente
<primitive />
no es un componente independiente en el código fuente de Tres. En su lugar, es parte de la funcionalidad principal de Tres. Cuando usas<primitive>
, se traduce a una llamada acreateElement
, que crea el objeto three.js adecuado según la propiedad "object" proporcionada.
Observa en el ejemplo anterior que estamos utilizando el componente Suspense
para envolver el componente TresCanvas
. Esto se debe a que useLoader
devuelve una Promise
y necesitamos esperar a que se resuelva antes de renderizar la escena.
useGLTF
Una forma más conveniente de cargar modelos es utilizando el composable useGLTF
disponible en el paquete @tresjs/cientos.
import { useGLTF } from '@tresjs/cientos'
const { scene, nodes, animations, materials } = await useGLTF('/models/AkuAku.gltf')
Una ventaja de usar useGLTF
es que puedes pasar una propiedad draco
para habilitar la compresión Draco para el modelo. Esto reducirá el tamaño del modelo y mejorará el rendimiento.
import { useGLTF } from '@tresjs/cientos'
const { scene, nodes, animations, materials } = await useGLTF('/models/AkuAku.gltf', { draco: true })
Alternativamente, puedes seleccionar fácilmente objetos dentro del modelo utilizando la propiedad nodes
.
<script setup lang="ts">
import { useGLTF } from '@tresjs/cientos'
const { scene, nodes, animations, materials } = await useGLTF('/models/AkuAku.gltf', { draco: true })
</script>
<template>
<TresCanvas
clear-color="#82DBC5"
shadows
alpha
>
<TresPerspectiveCamera :position="[11, 11, 11]" />
<OrbitControls />
<primitive :object="nodes.MyModel" /> // please note that "MyModel" here is just a placeholder
</TresCanvas>
</template>
GLTFModel
El componente GLTFModel
es un envoltorio alrededor de useGLTF
que está disponible en el paquete @tresjs/cientos.
<script setup lang="ts">
import { OrbitControls, GLTFModel } from '@tresjs/cientos'
</script>
<template>
<TresCanvas clear-color="#82DBC5" shadows alpha>
<TresPerspectiveCamera :position="[11, 11, 11]" />
<OrbitControls />
<Suspense>
<GLTFModel path="/models/AkuAku.gltf" draco />
</Suspense>
<TresDirectionalLight :position="[-4, 8, 4]" :intensity="1.5" cast-shadow />
</TresCanvas>
</template>
Este enfoque en particular es más sencillo pero te brinda menos control sobre el modelo.
El composable useFBX
está disponible en el paquete @tresjs/cientos.
import { useFBX } from '@tresjs/cientos'
const model = await useFBX('/models/AkuAku.fbx')
Entonces, es tan sencillo como agregar la escena a tu escena:
<TresCanvas shadows alpha>
<primitive :object="scene" />
</TresCanvas>
El componente FBXModel
es un envoltorio alrededor de useFBX
que está disponible en el paquete @tresjs/cientos. Su uso es similar al de GLTFModel
:
<script setup lang="ts">
import { OrbitControls, FBXModel } from '@tresjs/cientos'
</script>
<template>
<TresCanvas clear-color="#82DBC5" shadows alpha>
<TresPerspectiveCamera :position="[11, 11, 11]" />
<OrbitControls />
<Suspense>
<FBXModel path="/models/AkuAku.fbx" />
</Suspense>
<TresDirectionalLight :position="[-4, 8, 4]" :intensity="1.5" cast-shadow />
</TresCanvas>
</template>