---
title: useGraph
description: useGraph generates a reactive map of named nodes, materials, and meshes from a Three.js object hierarchy.
---
The `useGraph` composable provides a convenient way to extract and reactively access all named nodes, materials, and meshes from a Three.js object or scene. This is especially useful when working with loaded models or complex object hierarchies, allowing you to reference and manipulate specific parts of your 3D scene by name.
## Usage
```ts
import { useGraph } from '@tresjs/core'
import { BoxGeometry, Group, Mesh, MeshStandardMaterial } from 'three'
// Create a group and add a mesh with a named material
const group = new Group()
const box = new Mesh(
new BoxGeometry(1, 1, 1),
new MeshStandardMaterial({ name: 'FancyMaterial', color: 'red' })
)
box.name = 'Box'
group.add(box)
// Use useGraph to extract nodes and materials
const { nodes, materials } = useGraph(group)
// Change the position of the box by name
nodes.Box.position.set(1, 0, 0)
// Change the color of the material by name
materials.FancyMaterial.color.set('blue')
```
::tip
`useGraph` is especially useful for working with loaded GLTF/FBX models, where you want to access specific meshes or materials by their names as defined in the 3D modeling tool.
::
### Example
When loading a GLTF model, you can use `useGraph` to easily access and manipulate specific parts of the model:
```vue [Model.vue]
```
::note
**Best Practice:** Always assign unique names to important nodes and materials in your 3D models for easier access in code.
::
## API
The `useGraph` composable returns a computed ref containing a `TresObjectMap` with the following structure:
:::field-group
::::field{name="nodes" type="Record"}
All named nodes in the object hierarchy, indexed by their `name` property.
::::
::::field{name="materials" type="Record"}
All unique materials, indexed by their `name` property. Only the first material with a given name is included.
::::
::::field{name="meshes" type="Record"}
All unique meshes, indexed by their `name` property. Only the first mesh with a given name is included.
::::
::::field{name="scene" type="Scene | undefined"}
The root scene object, if available.
::::
:::
### Type Signature
```ts [Signature]
function useGraph(object: MaybeRef): ComputedRef
interface TresObjectMap {
nodes: { [name: string]: TresObject }
materials: { [name: string]: TresMaterial }
meshes: { [name: string]: Mesh }
scene?: Scene
}
```
## Edge Cases & Notes
- Only the first material or mesh with a given name is included in the map. Duplicate names are ignored after the first occurrence.
- Unnamed objects are not included in the `nodes` map.
- If the input object is `null` or `undefined`, all maps will be empty.