3D Graphics

Three.js

O Three.js torna o WebGL acessível: um scene graph, câmeras, materiais e luzes permitem que você crie experiências 3D para o navegador em JavaScript puro.

advanced14 min readUpdated 15 de set. de 2026
scene.js
js
// scene.js
import * as THREE from "three";

const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(
  75,
  innerWidth / innerHeight,
  0.1,
  100,
);
camera.position.z = 3;

const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(innerWidth, innerHeight);
document.body.appendChild(renderer.domElement);

const cube = new THREE.Mesh(
  new THREE.BoxGeometry(),
  new THREE.MeshStandardMaterial({ color: 0x22c55e }),
);
scene.add(cube);

renderer.setAnimationLoop(() => {
  cube.rotation.y += 0.01;
  renderer.render(scene, camera);
});
Construído sobre
WebGL
Conceito central
Scene graph
Renderizador
WebGLRenderer
Modelos
glTF / GLTFLoader
React
React Three Fiber
Custo
GPU e peso do bundle

Por que importa

Por que 3D na web

Um scene graph

Adicione objetos a uma cena e o Three.js cuida da matemática, transformações e draw calls para você.

Aceleração por hardware

O WebGL desenha com a GPU, tornando o 3D fluido em dispositivos e celulares modernos.

Sistema rico de materiais

Materiais padrão, físicos e customizados, além de luzes, sombras e pós-processamento, criam visuais convincentes.

O panorama completo

As três partes de um app Three.js

Uma cena armazena seus objetos, uma câmera decide a visualização e um renderizador a desenha usando WebGL.

A cena

Conteúdo

Um grafo de meshes, luzes, câmeras e grupos posicionados no espaço 3D.

A câmera

Visão

Perspectiva ou ortográfica, definindo o que o espectador vê.

O renderizador

Desenho

O WebGLRenderer desenha a cena a cada frame, e a animação a atualiza ao longo do tempo.

Three.js em resumo

O núcleo do Three.js

Geometria e material

Uma mesh é a combinação de uma geometria (forma) e um material (superfície).

Câmera

PerspectiveCamera para profundidade realista, Orthographic para visões planas.

Luzes

Luzes direcionais, ambientais, pontuais e spots moldam a cena.

Texturas e modelos

Carregue imagens e modelos glTF com loaders.

Raycaster

Detecte sobre qual objeto o ponteiro está para criar interações.

Performance

Reutilize geometrias, limite as luzes e descarte recursos não utilizados.

Uma breve historia

Do WebGL bruto ao 3D acessível

  1. 2011

    Lançamento do Three.js

    Ricardo Cabello cria uma biblioteca para tornar o WebGL acessível.

    11
  2. 2013

    WebGL se populariza

    O suporte dos navegadores amadurece e experiências 3D tornam-se comuns.

    13
  3. 2017

    Padrão glTF

    Um formato 3D compacto torna o carregamento de modelos prático.

    17
  4. 2020

    React Three Fiber

    Um renderizador declarativo para React traz o 3D para o código de componentes.

    20
  5. Hoje

    Web imersiva

    Configuradores de produtos, visualização de dados, jogos e experiências WebXR.

    Hoje

O guia completo

Three.js: Tudo que voce precisa saber

O que é 3D na web?

O WebGL permite que o navegador renderize 3D com aceleração de hardware utilizando a GPU. Ele é poderoso, mas a API bruta é verbosa: você precisa gerenciar buffers, escrever shaders e lidar com a matemática por conta própria. O Three.js encapsula o WebGL em um scene graph amigável, permitindo que você descreva objetos, luzes e câmeras enquanto a biblioteca cuida do restante.

O resultado é que o 3D na web tornou-se prático para configuradores de produtos, visualização de dados, storytelling interativo, jogos e experiências imersivas em WebXR. Não é a escolha certa para todo site, mas quando o movimento e o espaço contam a história melhor do que uma página plana, o Three.js é a ferramenta padrão.

Cena, câmera e renderer

Todo app Three.js possui três objetos principais.

// setup.js
import * as THREE from "three";

const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, innerWidth / innerHeight, 0.1, 100);
camera.position.set(0, 0, 3);

const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setPixelRatio(Math.min(devicePixelRatio, 2));
renderer.setSize(innerWidth, innerHeight);
document.body.appendChild(renderer.domElement);

A scene é o container. A camera define a visualização; PerspectiveCamera proporciona profundidade realista, enquanto OrthographicCamera é útil para visualizações planas ou isométricas. O renderer desenha a cena em um canvas. Limitar o pixel ratio evita que telas de alta densidade renderizem mais pixels do que o necessário.

Meshes, geometria e materiais

Um objeto visível é um mesh: uma geometria para a sua forma e um material para a sua superfície.

// mesh.js
const cube = new THREE.Mesh(
  new THREE.BoxGeometry(1, 1, 1),
  new THREE.MeshStandardMaterial({ color: 0x22c55e, roughness: 0.4 }),
);
cube.position.set(0, 0, 0);
scene.add(cube);

O Three.js já vem com diversas geometrias integradas (box, sphere, plane, torus e outras) e materiais para diferentes visuais. MeshStandardMaterial responde a luzes e é uma boa opção padrão; MeshBasicMaterial ignora a iluminação e é mais leve. Meshes podem ser agrupados e aninhados, formando o scene graph através do qual as transformações são herdadas.

Luzes e sombras

Sem luz, a maioria dos materiais é renderizada em preto.

// lights.js
const ambient = new THREE.AmbientLight(0xffffff, 0.4);
const key = new THREE.DirectionalLight(0xffffff, 2.5);
key.position.set(2, 3, 2);

scene.add(ambient, key);

As luzes são objetos na cena, portanto, sua posição e tipo são importantes. As sombras exigem a ativação de renderer.shadowMap e a marcação da luz, do objeto e da superfície; elas são relativamente custosas, então use-as com critério. Cada luz adiciona custo ao processamento, portanto, mantenha a quantidade baixa.

Modelos e texturas

Projetos reais geralmente carregam assets em vez de construir a geometria manualmente. O glTF é o formato 3D padrão para a web.

// load.js
import { GLTFLoader } from "three/addons/loaders/GLTFLoader.js";

const loader = new GLTFLoader();
loader.load("/models/robot.glb", (gltf) => {
  scene.add(gltf.scene);
});

As texturas são carregadas de forma semelhante com TextureLoader, e RGBELoader ou PMREMGenerator podem fornecer mapas de ambiente para reflexos realistas. Mantenha o tamanho dos modelos e das texturas razoável, já que eles dominam o tempo de carregamento e o uso de memória.

O loop de animação

A animação atualiza a cena e a renderiza novamente a cada frame.

// loop.js
const clock = new THREE.Clock();

renderer.setAnimationLoop(() => {
  const delta = clock.getDelta();
  cube.rotation.y += delta;
  renderer.render(scene, camera);
});

Usar delta mantém a velocidade do movimento consistente, independentemente da taxa de quadros (frame rate). Quando a cena estiver estática, renderize sob demanda em vez de continuamente: renderize após uma alteração, uma interação de controle ou uma animação, e pare quando nada estiver acontecendo. Isso economiza bateria e GPU em dispositivos móveis.

Interação

Para tornar objetos clicáveis ou interativos ao passar o mouse (hover), utilize um Raycaster.

// pick.js
const raycaster = new THREE.Raycaster();
const pointer = new THREE.Vector2();

addEventListener("pointerdown", (event) => {
  pointer.x = (event.clientX / innerWidth) * 2 - 1;
  pointer.y = -(event.clientY / innerHeight) * 2 + 1;

  raycaster.setFromCamera(pointer, camera);
  const hit = raycaster.intersectObjects(scene.children)[0];
  if (hit) hit.object.material.color.set(0xf97316);
});

O Raycasting a partir da câmera através do ponteiro retorna os objetos sob ele, o que é suficiente para seleção, destaque e interações simples.

Performance e limpeza

O 3D é a coisa mais cara que a maioria dos sites irá renderizar, por isso a disciplina é fundamental.

  • Descarte (Dispose) geometrias, materiais e texturas ao remover objetos; eles residem na memória da GPU.
  • Reutilize geometrias e materiais entre instâncias em vez de criar novos.
  • Mescle (Merge) geometrias estáticas e utilize instanciamento para objetos repetidos.
  • Limite as luzes e os objetos que projetam sombras.
  • Reduza o pixel ratio em telas de alta densidade.
  • Renderize sob demanda para cenas estáticas.
  • Pause a renderização quando o canvas estiver fora da tela.
// dispose.js
mesh.geometry.dispose();
mesh.material.dispose();
scene.remove(mesh);

Esquecer de fazer o dispose é a causa mais comum de apps Three.js que consomem lentamente toda a memória disponível.

React Three Fiber

Com React, o React Three Fiber renderiza Three.js de forma declarativa, permitindo que a cena seja descrita com componentes e se integre ao estado e ciclo de vida do React.

// Scene.jsx
import { Canvas } from "@react-three/fiber";
import { OrbitControls } from "@react-three/drei";

export function Scene() {
  return (
    <Canvas>
      <ambientLight intensity={0.4} />
      <directionalLight position={[2, 3, 2]} intensity={2.5} />
      <mesh>
        <boxGeometry />
        <meshStandardMaterial color="#22c55e" />
      </mesh>
      <OrbitControls />
    </Canvas>
  );
}

Os helpers do drei fornecem controles, ambientes e abstrações comuns. Esta é a maneira recomendada de utilizar Three.js no React.

Melhores práticas

  • Limite o pixel ratio e redimensione o renderer conforme a janela.
  • Reutilize geometry e materials; utilize instanciamento para objetos repetidos.
  • Libere os recursos da GPU ao remover objetos.
  • Mantenha o número de luzes e shadow casters no mínimo possível.
  • Renderize sob demanda para cenas estáticas.
  • Teste em dispositivos móveis reais de gama média.
  • Forneça um fallback para quando o WebGL não estiver disponível.

Erros comuns

  • Esquecer de fazer o dispose e causar vazamento de memória da GPU.
  • Renderizar continuamente quando nada muda.
  • Criar novas geometrias ou materiais a cada frame.
  • Adicionar muitas luzes e sombras sem realizar medições.
  • Carregar modelos e texturas enormes e não otimizados.
  • Testar apenas em um desktop rápido e publicar para mobile.

Próximos passos

O Three.js abre toda uma nova dimensão para a web. Adicione movimentos coreografados com o guia de Animação Avançada, utilize o React Three Fiber se você usa React, e mantenha a performance sob controle com o guia de Web Performance. Depois, construa a menor cena possível — um cubo iluminado ao redor do qual você possa orbitar — e a expanda conceito por conceito.

Gerenciando recursos da GPU

Geometrias, materiais e texturas residem na memória da GPU. Descarte-os ao remover um objeto, ou a cena terá memory leaks.

Preferir
function remove(mesh) {
  mesh.geometry.dispose();
  mesh.material.dispose();
  mesh.material.map?.dispose();
  scene.remove(mesh);
}
Evitar
scene.remove(mesh);
// geometry and textures
// stay in GPU memory

Renderização de frames

Renderize continuamente apenas quando a cena mudar. Para cenas estáticas, renderize sob demanda para economizar bateria e GPU.

Preferir
// render when needed
controls.addEventListener("change", () => {
  renderer.render(scene, camera);
});
Evitar
renderer.setAnimationLoop(() => {
  renderer.render(scene, camera);
});
// runs at 60fps forever,
// even when nothing moves

Perguntas frequentes

Perguntas frequentes

Keep learning

Related topics from the roadmap.

$ comecar a aprender

Pronto para aprender Three.js / WebGL?

Nosso tutorial interativo te guia por Three.js / WebGL passo a passo — com quizzes e codigo real que voce pode executar no navegador.