Frontends com Vibecoding · Capítulo 31 de 33 · 28 min
Construir as cenas do orquestrador, do paralelismo e do robô
Capítulo bônus com três cenas que mostram a máquina trabalhando: o orquestrador com harness em React Flow, mil tarefas em Web Workers e a corrida de tokens em GSAP, e um braço robótico com física e botão de realidade virtual em Three.js.
Este capítulo faz parte do curso gratuito Frontends com Vibecoding. Para marcar como concluído e salvar o progresso, abra este capítulo na página do curso.
Um orquestrador de modelos de IA se explica melhor como um fluxo que a pessoa dispara e vê andar do que como um parágrafo. Orquestrador é o programa que recebe um pedido, parte em tarefas e entrega cada uma ao modelo mais barato que dá conta. Quem vê as tarefas correndo lado a lado entende em dez segundos o que uma página inteira de texto não entrega.
A metáfora que funciona é o balcão de despacho de uma transportadora, e a que atrapalha é o maestro. O maestro sugere harmonia contínua. O despacho mostra o que interessa: alguém classifica o pedido, escolhe quem atende, cobra o retorno e decide o que fazer quando uma resposta volta incompleta.
O harness é a segunda peça, e a mais esquecida. Harness é a armação que envolve o modelo e organiza o trabalho dele, como o arreio de um cavalo de tração. Na prática, é o ciclo em que o modelo pede uma ferramenta, a ferramenta executa, um portão confere e só então a resposta segue.
O artigo da freeCodeCamp sobre o tema, de 2026, resume a divisão: o harness é tudo o que roda em volta do modelo, e o modelo é só a parte que prevê texto.

Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
A animação que ensina errado é a fila reta. Se as cinco tarefas aparecem uma atrás da outra, a pessoa aprende que o orquestrador é uma esteira. O ponto central se perde: no modo paralelo, o tempo de parede é o da tarefa mais lenta, e a soma de todas só aparece no modo sequencial.
Esconder a reprovação é o segundo erro. Um laço que acerta de primeira ensina que agente (o programa que executa o pedido com as ferramentas que recebeu) é sinônimo de acerto. Mostre a verificação devolvendo um resultado ao orquestrador, porque essa volta separa um harness de uma chamada solta ao modelo.
Addy Osmani registra, no texto sobre engenharia de harness de 2026, uma frase de Boris Cherny, criador do Claude Code: a verificação é a coisa mais importante para a qualidade.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Um caso real calibra a cena. Em 25 de setembro de 2026, o geo-orchestrator da Brasil GEO, orquestrador de código aberto que roda cinco modelos de fornecedores diferentes, respondeu a uma pergunta de pesquisa deste capítulo em modo paralelo. O mais rápido levou 18,2 s e o mais lento 221 s, com uma nova tentativa por tempo esgotado.
No relógio de parede, a rodada durou 221 s, e a soma das cinco durações daria 360 s, por US$ 0,48 no total. Esses números viram os parâmetros da cena: ao alternar para o modo sequencial, a barra cresce até 360 s; ao voltar ao paralelo, cai para 221 s. A diferença de 139 s é o argumento inteiro do paralelismo em um gesto.
A medição real de 25/09/2026 que alimenta a cena
| Papel no board | Modelo | Duração | Custo |
|---|---|---|---|
| Desempenho e custo | Gemini 3.8 Flash | 18,2 s | US$ 0,03 |
| Recuperação e contexto | Gemini 3.1 Pro | 34,2 s | US$ 0,05 |
| Pesquisa com fontes vivas | Perplexity sonar-pro | 39,3 s | US$ 0,01 |
| Arquitetura de agentes | GPT-5.5 | 47,7 s | US$ 0,13 |
| Estratégia e revisão | Claude Opus 5 | 221 s, com nova tentativa | US$ 0,25 |
| Tempo de parede em paralelo | os cinco juntos | 221 s | US$ 0,48 |
| Soma em sequência | um após o outro | 360 s | US$ 0,48 |
O custo é o mesmo nos dois modos; o que muda é o tempo de parede, e é isso que a cena mostra.
Fonte: geo-orchestrator, board de 25 de setembro de 2026, arquivo 5llm_board_analysis.json
O laboratório abaixo monta esse grafo com o React Flow, a biblioteca de nós e conexões que os editores de fluxo usam. Dispare o pedido e veja as cinco tarefas correrem; ligue a verificação e repare na volta; troque para o modo sequencial e compare o tempo de parede. Com movimento reduzido ativo no aparelho, nada anda sozinho e a cena avança por botão.
Disparar um pedido e ver o orquestrador distribuir, conferir e responder
Alterne paralelo e sequencial, ligue e desligue a verificação e use a medição real; observe o tempo de parede em cada combinação.
Demonstração com o React Flow de um orquestrador com harness: um pedido entra, o roteador parte em cinco tarefas que correm em paralelo ou em sequência, a verificação pode reprovar um resultado e devolvê-lo ao orquestrador, e a resposta sai no fim. As leituras mostram o tempo de parede, a soma das durações, quantas voltas a verificação pediu e o custo. Um interruptor troca as durações fictícias pela medição real do geo-orchestrator de 25 de setembro de 2026. Com movimento reduzido ativo, a cena avança por botão e nenhuma conexão se move sozinha.
A demonstração interativa carrega quando este trecho entra na tela.
O React Flow entra porque o grafo tem estado: cada nó guarda se está aguardando, executando, concluído ou reprovado. A biblioteca, ou seja, o pacote de código pronto que a página baixa, cuida de posição, conexão, zoom e toque. Um grafo desenhado à mão em SVG resolve a figura estática desta aula, e é a alternativa certa para quem lê sem JavaScript.
Quando a máquina de estados vem do designer, o Rive cabe melhor. O arquivo .riv carrega a lógica de estados e o código só dispara entradas, ao custo de um runtime de cerca de 200 kB em WebAssembly. O dotLottie ganhou máquinas de estado no fim de 2025, mas segue controlando a reprodução de fora, e a lógica continua no seu código.
As ferramentas de agente mostram o mesmo cuidado. Em junho e julho de 2026, o Claude Code passou a exibir a árvore de subagentes crescendo e estados coloridos por linha, e o LangGraph Studio mostra etapas e estados intermediários. A animação comprovada nesses produtos é a do indicador de atividade; as conexões não se movem, e isso basta para o operador.
Que ferramenta para que cena de orquestrador
| Cena | Ferramenta | Por quê | Custo |
|---|---|---|---|
| Grafo com estado por nó, zoom e toque | React Flow 12 | Nó, conexão e viewport prontos; estado vira atributo | Pacote de cerca de 45 kB comprimido, mais CSS |
| Figura estática do fluxo | SVG à mão | Conta a história sem JavaScript; entra na figura da aula | Zero |
| Personagem ou máquina de estados desenhada pelo designer | Rive | A lógica de estados mora no arquivo .riv | Runtime de cerca de 200 kB em WebAssembly |
| Vetor exportado do After Effects | dotLottie | Máquinas de estado desde o fim de 2025, controle de fora | 40% a 70% menor que o Lottie em JSON |
| Destacar uma etapa por vez em React | Motion 13 | Troca de estado com mola e saída coordenada | Um pacote, já instalado no curso |
Comece pelo SVG; suba para o React Flow quando o grafo precisar de estado e interação; Rive só quando o arquivo vier do designer.
Antes de publicar a cena, faça o teste das três leituras. Com o script desligado, a figura estática precisa contar a mesma história. Com movimento reduzido, cada estado precisa se distinguir com a tela parada. E uma pessoa leiga precisa dizer em uma frase, ao fim da narração, o que o orquestrador fez. Se alguma das três falhar, a cena está decorando, e sai antes de ir ao ar.
O trecho abaixo é o coração do laboratório. Um nó do React Flow carrega o próprio estado, e a aresta só anda enquanto a etapa executa e a pessoa não pediu movimento reduzido. O código completo, com o roteiro dos eventos e a medição real, está no arquivo para download logo depois.
import "@xyflow/react/dist/style.css";
import { BaseEdge, Handle, Position, ReactFlow, getSmoothStepPath,
type Edge, type EdgeProps, type Node, type NodeProps } from "@xyflow/react";
type Estado = "aguardando" | "executando" | "concluido" | "reprovado";
type DadosNo = { titulo: string; papel: string; estado: Estado; duracao?: string };
function NoEtapa({ data }: NodeProps<Node<DadosNo, "etapa">>) {
return (
<div className={estilos.no} data-estado={data.estado}>
<Handle type="target" position={Position.Top} />
<strong>{data.titulo}</strong>
<span>{data.papel}</span>
<em>{data.estado}{data.duracao ? ` (${data.duracao})` : ""}</em>
<Handle type="source" position={Position.Bottom} />
</div>
);
}
function ArestaFluxo({ data, ...p }: EdgeProps<Edge<{ ativa: boolean; volta?: boolean }>>) {
const [caminho] = getSmoothStepPath(p);
return <BaseEdge path={caminho} className={data?.volta ? estilos.volta : undefined}
style={{ strokeDasharray: data?.ativa && !movimentoReduzido ? "6 6" : undefined }} />;
}
// <ReactFlow nodes={nos} edges={arestas} nodeTypes={{ etapa: NoEtapa }} edgeTypes={{ fluxo: ArestaFluxo }}
// fitView fitViewOptions={{ padding: 0.08, maxZoom: 1, minZoom: 0.6 }} nodesDraggable={false} zoomOnScroll={false} />Fazer milhares de tarefas e a velocidade caberem numa cena
O orquestrador já aparece distribuindo e conferindo, e a cena seguinte precisa provar o paralelismo com trabalho de verdade e separar a espera inicial do ritmo de geração.
Paralelismo se demonstra com trabalho de verdade dividido entre os núcleos do aparelho. Velocidade se demonstra com duas medidas separadas: a espera pela primeira palavra e o ritmo em que as demais chegam. Uma barra que anda mais depressa prova pouco. Mil ladrilhos pintados por oito trabalhadores ao mesmo tempo provam o mecanismo.
Computação paralela é dividir um trabalho grande em pedaços iguais e independentes e executá-los no mesmo instante, em processadores diferentes. A metáfora certa é o porto com dezenas de guindastes iguais, e a errada é o caminhão mais veloz: o guindaste não anda mais depressa, há mais deles.
A escala de hoje foge da intuição. O Colossus, da xAI, em Memphis, chegou a 555 mil GPUs anunciadas em janeiro de 2026. GPU é a placa gráfica que virou o processador padrão da IA, porque faz milhares de contas iguais de uma vez. Um único rack Blackwell Ultra da NVIDIA reúne 72 chips, segundo o anúncio de 18 de março de 2025.

Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
O navegador tem a versão doméstica desse porto. Web Workers (fios de execução separados da tela, que rodam sem travar a página) usam os núcleos do aparelho, e um notebook comum informa de quatro a 16. Quando a cena divide 1.024 tarefas iguais entre oito trabalhadores, o tempo cai perto de oito vezes, e para de cair quando os trabalhadores passam dos núcleos.
O que não cai é a soma no fim. Juntar os 1.024 resultados numa resposta só roda em um lugar, e essa fila de saída é o gargalo que nenhum paralelismo elimina. Gene Amdahl deu nome ao limite em 1967: a parte do trabalho que não se divide manda no tempo total quando a parte divisível já encolheu.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Velocidade tem duas medidas, e a cena precisa separá-las. A primeira é a espera até a primeira palavra, o tempo entre apertar enviar e ver algo na tela, como o intervalo até alguém atender o telefone. A segunda é o ritmo de geração, em tokens por segundo. Token é o pedaço de palavra que o modelo produz de cada vez, cerca de três quartos de uma palavra em português.
Os números de hoje dão a escala da corrida. Uma pessoa lê em silêncio cerca de 238 palavras por minuto, na meta-análise de Brysbaert publicada em 2019. Uma GPU especializada da Groq produz cerca de 480 tokens por segundo no modelo gpt-oss-120B.
O chip do tamanho de um wafer da Cerebras produz cerca de 1.700 tokens por segundo no mesmo modelo, nas medições da Artificial Analysis consultadas em 25 de setembro de 2026. O fabricante anuncia 3.000, e a cena usa o número medido.
As três pistas da corrida e a fonte de cada número
| Pista | Ritmo | Resposta de 300 tokens | Fonte e data |
|---|---|---|---|
| Leitura humana em silêncio | 238 palavras/min, cerca de 5 tokens/s | cerca de 60 s | Brysbaert, Journal of Memory and Language, 2019 |
| GPU especializada (Groq LPU, gpt-oss-120B) | cerca de 480 tokens/s | cerca de 0,6 s | Artificial Analysis, consulta em 25/09/2026 |
| Chip do tamanho de um wafer (Cerebras, gpt-oss-120B) | cerca de 1.700 tokens/s medidos; 3.000 anunciados | cerca de 0,2 s | Artificial Analysis e Cerebras, consulta em 25/09/2026 |
A espera pela primeira palavra é outra medida e aparece na cena como cenário ilustrativo, separada do ritmo.
O laboratório abaixo faz as duas coisas. No primeiro painel, os trabalhadores são Web Workers reais: escolha quantos, execute e veja os ladrilhos pintados por cada um, com o tempo medido no seu aparelho.
No segundo painel, a corrida de tokens usa o GSAP, a biblioteca de linha do tempo, para animar as três pistas, e o number-flow para os contadores. Percorra a linha do tempo pelo controle deslizante e compare a espera inicial com o ritmo.
Dividir mil tarefas entre trabalhadores reais e correr três ritmos de geração
Execute com um trabalhador, depois com quatro e oito, e compare o tempo; em seguida percorra a corrida e separe a espera inicial do ritmo.
Demonstração em dois painéis. No primeiro, 1.024 tarefas de cálculo iguais são distribuídas entre Web Workers de verdade, de um até o número de núcleos do aparelho; um canvas pinta cada ladrilho com a cor do trabalhador que o concluiu, e as leituras mostram o tempo total, tarefas por segundo e a aceleração em relação a um trabalhador. No segundo, uma linha do tempo do GSAP corre três pistas de uma resposta de 300 tokens: leitura humana, GPU especializada e chip do tamanho de um wafer, com contadores em number-flow e a espera pela primeira palavra separada do ritmo. Com movimento reduzido ativo, a corrida não anda sozinha e o controle deslizante percorre a linha do tempo.
A demonstração interativa carrega quando este trecho entra na tela.
O GSAP entra aqui porque a animação é o produto da cena, o quarto degrau da escada da trilha de movimento. Uma linha do tempo com três pistas, pausa, percurso pelo controle e escala de tempo pede um sequenciador. O pacote ficou gratuito em 2025, sob a Webflow, e a versão 3.15 saiu em 13 de abril de 2026.
Já o Canvas 2D desenha os 1.024 ladrilhos porque mil elementos no DOM travam a página, e o number-flow entra porque o contador muda dezenas de vezes na sessão. Para milhares de partículas com interação, o PixiJS 8 é o degrau seguinte. Para milhões, a placa de vídeo pela WebGPU, que o Safari 26 passou a entregar em 2025 e o Chrome entrega desde 2023.
Antes de publicar, meça no celular mais fraco da equipe, porque o painel de trabalhadores usa o processador de quem visita. Se o tempo com um trabalhador passar de dez segundos, reduza as tarefas para 256. E mantenha as duas medidas de velocidade separadas na tela: quem mistura espera inicial com ritmo publica um cronômetro que não explica nada.
O trecho abaixo mostra as duas peças que o laboratório usa de verdade. A primeira é o trabalhador criado a partir de um Blob, sem configuração de empacotador. A segunda é a linha do tempo do GSAP, pausada, que o controle deslizante percorre. O arquivo para download traz o componente inteiro, com a fila dinâmica e os três ritmos.
// 1. Trabalhadores de verdade: um Worker por linha de execução, nascido de um Blob.
const CODIGO_WORKER = `self.onmessage = (e) => {
const { indice, limite } = e.data; let primos = 0;
for (let n = 2 + (indice % 7); n < limite; n++) { let eh = true;
for (let d = 2; d * d <= n; d++) if (n % d === 0) { eh = false; break; } if (eh) primos++; }
self.postMessage({ indice, primos });
};`;
const url = URL.createObjectURL(new Blob([CODIGO_WORKER], { type: "text/javascript" }));
const trabalhadores = Array.from({ length: quantos }, () => new Worker(url));
let proximoIndice = 0;
for (const w of trabalhadores) {
w.onmessage = ({ data }) => { pintar(data.indice); // fila dinâmica: quem termina pede o próximo
if (proximoIndice < TOTAL) w.postMessage({ indice: proximoIndice++, limite: 48000 }); };
if (proximoIndice < TOTAL) w.postMessage({ indice: proximoIndice++, limite: 48000 });
}
// 2. A corrida: linha do tempo pausada, três pistas, controle deslizante que percorre.
import { gsap } from "gsap";
const tl = gsap.timeline({ paused: true });
for (const pista of PISTAS) { // { taxa: 5 | 480 | 1700 tokens/s, espera: 0,6 | 0,3 | 0,2 s }
tl.to(pista.contador, { tokens: 300, duration: 300 / pista.taxa, ease: "none", onUpdate: pintarContador }, pista.espera);
tl.to(pista.barra, { scaleX: 1, duration: 300 / pista.taxa, ease: "none" }, pista.espera);
}
tl.timeScale(janelaSegundos / 12); // a corrida inteira cabe em 12 s de tela
range.oninput = (e) => tl.pause((Number(e.target.value) / 1000) * janelaSegundos);Colocar um robô simulado e uma cena imersiva na página
Com o paralelismo e a velocidade medidos no próprio aparelho, resta a cena que a pessoa toca: o robô que obedece à física e a imersão oferecida só a quem tem o visor.
Um robô simulado convence quando obedece à física e a um alvo, e uma cena imersiva convence quando a pessoa entra nela pelo próprio visor. As duas nascem do mesmo lugar, a janela do navegador, e custam a mesma coisa: peso de código que só deve descer depois de um pedido explícito de quem visita.
Simulação de robô é o ensaio numa réplica digital antes de mover a máquina de verdade. A cena desta aula é um braço de três juntas que pega cubos numa posição e empilha em outra. A garra não segue um roteiro gravado: o código calcula, a cada quadro, os ângulos que as juntas precisam ter para a ponta chegar ao alvo. Esse cálculo se chama cinemática inversa.
A física dá o resto da credibilidade. Quando a garra solta o cubo, ele cai, bate e se acomoda na pilha, porque um motor de física governa os objetos. Motor de física é o programa que calcula gravidade, colisão e atrito, como o de um jogo. O Rapier, escrito em Rust e compilado para o navegador, é o motor padrão do ecossistema React Three Fiber.

Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
A pilha é a mesma do herói deste curso. Three.js é a biblioteca de 3D do navegador, o pacote de código que desenha a cena, com a r186 anunciada em 8 de setembro de 2026. O React Three Fiber a traduz em componentes React. O drei traz câmera orbital, sombra de contato e grade prontas, e o Rapier entra pelo pacote @react-three/rapier 2.2.
O custo é conhecido antes de começar. O arquivo do Three.js tem cerca de 640 kB antes de minificar e comprimir, e o motor de física traz 1,4 MB de WebAssembly. Por isso a cena não carrega com a página: a pessoa vê um desenho estático e um botão que declara o peso, e só então o código desce. Quem lê sem JavaScript fica com o desenho, que conta a mesma história.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Quatro decisões mantêm o celular frio. Limite a densidade de pixels a 1,5, porque renderizar em 3x numa tela de retina triplica o trabalho sem ganho visível. Rode o laço de quadros só enquanto a cena se move, e pare quando a aba se esconde ou a cena sai da tela.
Dispense sombras dinâmicas, porque a sombra de contato do drei entrega a leitura de apoio por uma fração do custo. Mantenha a física com poucos corpos: quatro cubos e um chão bastam para ensinar gravidade.
Com movimento reduzido ativo no aparelho, a cena abre parada e avança um ciclo por botão. Nada gira sozinho, e a pessoa ainda pode orbitar a câmera com o dedo, porque orbitar é ação dela, e não movimento disparado pela página.
Imersão no navegador é a WebXR, a interface que entrega a cena a um visor de realidade virtual sem instalar aplicativo. O botão de entrar só aparece quando o aparelho responde que oferece a sessão imersiva. Num celular ou notebook comum ele não existe, e a cena continua navegável com o dedo ou o mouse.
O cenário de setembro de 2026 tem dois caminhos. No Safari 27 do visionOS, o elemento model e a Immersive API deixam um site oferecer um ambiente imersivo a partir de um arquivo USDZ, com poucas linhas de código. Esse caminho é distinto da WebXR. No Quest Browser, a WebXR segue o caminho padrão, com renderização foveada por WebGPU em fase experimental desde a versão 150.1, de 28 de agosto de 2026.
Um vídeo em 360 graus não é imersão. A perspectiva precisa responder ao movimento da cabeça, e a mão precisa tocar o objeto; sem essas duas respostas, a pessoa assiste, e a cena vira filme.
Cena 3D, vídeo, imagem ou vetor animado: o que entra em cada caso
| Quando | Entra | Peso que desce | Alternativa sem JavaScript |
|---|---|---|---|
| A pessoa precisa mexer, orbitar ou entrar na cena | Three.js com React Three Fiber, física e XR | Cerca de 2,5 MB, só depois do botão | Desenho estático em SVG com a mesma história |
| Mostrar um produto ou modelo pronto em 3D | model-viewer 4.3 com arquivo GLB ou USDZ | Componente mais o modelo, muitas vezes maior que o código | Imagem do modelo em WebP |
| Mostrar um robô real trabalhando | Vídeo curto no Vidstack, com legenda e som só ao toque | Alguns MB, em streaming | Pôster do vídeo com legenda |
| Ilustrar o conceito sem interação | Imagem gerada, sem número, marca ou texto legível | Até 90 kB em WebP | A própria imagem |
| Personagem ou ícone que reage ao toque | Rive ou dotLottie | Runtime de 60 a 200 kB mais o arquivo | Imagem estática do primeiro quadro |
Suba para o 3D interativo só quando a interação for o que ensina; um vídeo com legenda resolve a maior parte das páginas de venda.
O laboratório abaixo é a cena completa. Carregue o 3D pelo botão, inicie o ciclo e orbite a câmera. Mostre os ângulos das juntas para ver a cinemática inversa trabalhando, troque a velocidade e repare que a física continua coerente. Se um visor compatível estiver conectado, o botão de realidade virtual aparece ao lado dos controles.
Carregar o braço robótico, ver a física trabalhar e entrar na cena com o visor
Carregue a cena pelo botão, inicie o ciclo, mostre os ângulos das juntas, troque a câmera e a velocidade; com visor, entre em realidade virtual.
Demonstração com Three.js, React Three Fiber, drei, Rapier e XR: um desenho estático e um botão que declara o peso; ao carregar, um braço robótico de três juntas pega quatro cubos e empilha em outra posição, com cinemática inversa calculada a cada quadro e física real na queda dos cubos. Controles de iniciar, pausar, avançar um ciclo, velocidade, ângulos das juntas e três posições de câmera; o botão de entrar em realidade virtual só aparece quando o aparelho oferece a sessão imersiva. Sem WebGL, fica o desenho. Com movimento reduzido ativo, a cena abre parada e avança por botão.
A demonstração interativa carrega quando este trecho entra na tela.
Antes de aprovar uma cena 3D, cobre três provas de quem a entregou. A primeira é o peso declarado antes do clique. A segunda é a nota de velocidade da página sem a cena carregada. A terceira é um vídeo de trinta segundos do celular mais fraco da equipe rodando o ciclo.
Se a resposta for uma cena que abre sozinha e aquece o aparelho, peça o degrau de baixo: um vídeo curto do robô com legenda resolve a maior parte das páginas de venda.
O trecho abaixo reúne o que a cena faz de mais específico. A física do Rapier entra com o chão e os cubos. A cinemática inversa de dois elos sai da lei dos cossenos. E o cubo troca de corpo cinemático para dinâmico na hora de soltar. O componente inteiro, com a câmera, o botão de peso e o visor, está no arquivo para download.
import { Canvas } from "@react-three/fiber";
import { OrbitControls } from "@react-three/drei";
import { CuboidCollider, Physics, RigidBody, useRapier, type RapierRigidBody } from "@react-three/rapier";
import { XR, createXRStore } from "@react-three/xr";
const L1 = 1.0, L2 = 0.8; // ombro e antebraço, em metros
function cinematicaInversa(alvo: { x: number; y: number; z: number }) {
const base = Math.atan2(alvo.x, alvo.z); // giro da base
const r = Math.hypot(alvo.x, alvo.z), h = alvo.y - 0.35;
const d = Math.min(Math.hypot(r, h), L1 + L2 - 0.01); // alcance travado
const cotovelo = Math.acos((L1 * L1 + L2 * L2 - d * d) / (2 * L1 * L2)); // lei dos cossenos
const ombro = Math.atan2(h, r) + Math.acos((L1 * L1 + d * d - L2 * L2) / (2 * L1 * d));
return { base, ombro, cotovelo: Math.PI - cotovelo };
}
function Garra({ cubo }: { cubo: RapierRigidBody }) {
const { rapier } = useRapier();
const pegar = () => cubo.setBodyType(rapier.RigidBodyType.KinematicPositionBased, true); // segue a garra
const soltar = () => cubo.setBodyType(rapier.RigidBodyType.Dynamic, true); // volta a cair
/* ... a cada quadro: cinematicaInversa(alvo) vira rotação das juntas; pegar() e soltar() nas fases */
}
export const store = createXRStore({ hand: false, controller: true, emulate: false });
export function Cena({ rodando }: { rodando: boolean }) {
return (
<Canvas dpr={[1, 1.5]} frameloop={rodando ? "always" : "demand"} gl={{ alpha: true, powerPreference: "low-power" }}>
<XR store={store}><Physics gravity={[0, -9.81, 0]} paused={!rodando}>
<RigidBody type="fixed"><CuboidCollider args={[2, 0.1, 2]} position={[0, -0.1, 0]} /></RigidBody>
</Physics><OrbitControls makeDefault enablePan={false} minDistance={2} maxDistance={7} /></XR>
</Canvas>
);
}Seu caderno neste capítulo
Abrir o caderno completoSelecione um trecho do capítulo para destacar ou anotar. Nos vídeos e áudios, use Anotar este momento. No teclado, selecione com Shift e as setas e use Alt+Shift+D para destacar ou Alt+Shift+N para anotar.
Salvo neste navegador. Entre na sua conta para levar o caderno a outros aparelhos.
Entre na sua conta para compartilhar o que aprendeu e convidar alguém para estudar com você.
Conexões deste capítulo
Explore os conceitos e compare abordagens em outros cursos. As conexões indicam assuntos relacionados; a sequência de estudo continua no índice do curso.
Conceitos deste capítulo
O mesmo assunto em outros cursos
- Claude Code CLI: Programação com IARevisar o plano antes de agir e ligar suas ferramentasExaminar conexões de Revisar o plano antes de agir e ligar suas ferramentas
- Do Agile ao Agentic Operating ModelGastar modelo caro só onde ele paga e isolar agentes paralelosExaminar conexões de Gastar modelo caro só onde ele paga e isolar agentes paralelos
- RLM 2027Guardar o acervo numa variável e deixar o modelo programar a leituraExaminar conexões de Guardar o acervo numa variável e deixar o modelo programar a leitura
- Prompt Engineering para ExecutivosEscolher a técnica para fluxos que rodam por horasExaminar conexões de Escolher a técnica para fluxos que rodam por horas
Voltar ao capítulo anterior: Produzir apresentações e PDF com critérios de entrega
Laboratórios ao vivo deste curso
Cada laboratório monta a biblioteca real dentro da aula, com controles para você mexer e o código do exemplo para copiar. O texto de reserva descreve a demonstração para quem lê sem JavaScript. O link abre o capítulo já no ponto do laboratório.
Base UI
Prenda o foco num diálogo sem escrever o comportamento
Abra a janela Agendar visita, percorra os campos com Tab, feche com Esc e acompanhe no painel onde o foco está e para onde ele volta.
Pacote
Abrir no capítuloConstruir componentes, usar o registro e publicar o catálogo@base-ui/reactLucide e Iconify
Mantenha uma família de ícones coerente e nomeie cada botão
Mude tamanho, traço e cor da barra, veja o símbolo do Iconify acompanhar o Lucide e rode a auditoria de nomes acessíveis.
Pacote
Abrir no capítuloProjetar uma linguagem de ícones e ilustraçãolucide-react, @iconify/reactMotion
Testar os três sinais que autorizam o terceiro degrau
Reproduza a entrada em sequência, aperte o botão com mola e arraste o cartão; ajuste rigidez e amortecimento e veja o que muda.
Pacote
Abrir no capítuloProjetar movimento, assinatura e narrativas por rolagemmotionVidstack
Ver o que separa um player de um vídeo cru
Dê o play, troque a velocidade e ligue a legenda; o painel ao lado mostra o estado que o player publica e que a etiqueta crua esconde.
Pacote
Abrir no capítuloProjetar movimento, assinatura e narrativas por rolagem@vidstack/reactcmdk
Achar um destino entre quarenta digitando três letras
Abra a paleta, digite fat e escolha um item só pelo teclado; o painel embaixo conta o que o filtro deixou passar e quanto tempo levou.
Pacote
Abrir no capítuloConstruir formulários e estados de interaçãocmdknumber-flow
Animar indicadores que mudam ao vivo com formato pt-BR
Veja três indicadores fictícios rolarem a cada troca e compare com o número em texto puro. Pause, reinicie e observe o separador de milhar.
Pacote
Abrir no capítuloProjetar gráficos e painéis pela decisão@number-flow/reactApache ECharts
Medir o custo de desenhar 200 mil pontos com o ECharts
Troque o tipo de gráfico e o volume de pontos, leia o tempo de desenho e alterne o eixo em zero. Mude o tema do site e veja as cores refazerem.
Pacote
Abrir no capítuloProjetar gráficos e painéis pela decisãoechartssharp e svgo
Escolher a variante certa da imagem e conferir o teto de 150 KB
Arraste a largura da tela simulada, troque a densidade entre 1x e 2x e veja qual arquivo o navegador escolhe, quanto ele pesa e se cabe no orçamento.
Pacote
Abrir no capítuloValidar desempenho, autenticação e segurançasharp, svgoReact Flow (xyflow)
Disparar um pedido e ver o orquestrador distribuir, conferir e responder
Alterne paralelo e sequencial, ligue e desligue a verificação e use a medição real; observe o tempo de parede em cada combinação.
Pacote
Abrir no capítuloConstruir as cenas do orquestrador, do paralelismo e do robô@xyflow/reactGSAP, Web Workers e number-flow
Dividir mil tarefas entre trabalhadores reais e correr três ritmos de geração
Execute com um trabalhador, depois com quatro e oito, e compare o tempo; em seguida percorra a corrida e separe a espera inicial do ritmo.
Pacote
Abrir no capítuloConstruir as cenas do orquestrador, do paralelismo e do robôgsap, @number-flow/reactThree.js com React Three Fiber, drei, Rapier e XR
Carregar o braço robótico, ver a física trabalhar e entrar na cena com o visor
Carregue a cena pelo botão, inicie o ciclo, mostre os ângulos das juntas, troque a câmera e a velocidade; com visor, entre em realidade virtual.
Pacote
Abrir no capítuloConstruir as cenas do orquestrador, do paralelismo e do robôthree, @react-three/fiber, @react-three/drei, @react-three/rapier, @react-three/xrMotion
Ver quatro agentes em raias trocando mensagens e a revisão devolvendo um trecho
Reproduza os 60 s de modelo, percorra o tempo pelo controle e esconda as mensagens para comparar a leitura; repare no tempo de parede contra a soma.
Pacote
Abrir no capítuloEspecificar, medir e produzir as cenas da máquinamotionMediaRecorder, Canvas 2D e Long Animation Frames (plataforma)
Medir o quadro da cena e gravar seis segundos dela em vídeo
Suba as partículas, force um bloqueio de 300 ms e leia o medidor; depois grave seis segundos, veja o codec escolhido e baixe o arquivo.
Pacote
Abrir no capítuloEspecificar, medir e produzir as cenas da máquinasem pacotesigma.js, graphology com ForceAtlas2 e cosmos.gl
Ver o grafo real do curso e um grafo de milhares de nós se organizarem em aglomerados
Rode o layout no grafo real, passe o mouse pelos nós e busque uma entidade; troque para 20 mil nós e leia o medidor; depois carregue o modo massivo na placa de vídeo.
Pacote
Abrir no capítuloAnimar um grafo de conhecimento amplo em movimentosigma, graphology, graphology-layout-forceatlas2, graphology-generators, @cosmos.gl/graph
Capítulos vizinhos em Frontends com Vibecoding
- 29Construir um aplicativo instalável e resiliente
- 30Produzir apresentações e PDF com critérios de entrega
- 31Construir as cenas do orquestrador, do paralelismo e do robô
- 32Especificar, medir e produzir as cenas da máquina
- 33Animar um grafo de conhecimento amplo em movimento