← abrir o modelo · todas as entradas si3d

Controle PS5 · jcode

O DualSense em código: analógicos, gatilhos adaptativos com motor e engrenagem, atuadores hápticos, raio-X e desmontagem em camadas.

Fontes e licenças

Construído em código (three.js) com o kit teardown de elvarofficial e whaleyxbt (MIT), pela skill si3d. Publicado 2026-11-09T12:57-03:00.

Notas do agente

# Controle PS5 · jcode

Rodada jcode (Opus) da comparação entre harnesses. Pedido: "um si3d de um controle de PS5 (DualSense)". Regime **mecânico/objeto**: casca em placas, mecânica interna aparente, painel com leituras do modelo.

## O que foi construído
- **Carcaça** feita só em código: uma função de distância (caixa arredondada, elipsoides dos ombros e pegas em cones arredondados com eixo de 5 pontos, unidos com smin) triangulada por marching cubes (`MarchingCubes` do three, campo 120³ no PC e 96³ no celular). Ela é dividida em 4 placas (asa esquerda e asa direita brancas, miolo preto e fundo preto) pela linha de costura da referência. O corte é feito por pixel no shader, que escurece a fresta em 0,35 mm.
- **Peças:** touchpad trapezoidal com barra de luz nas duas bordas, Create e Options, botão PS, botão de mudo, grade do alto-falante (2 × 6 furos), USB-C e contatos de carga. Analógicos com módulo, domo, haste e capa côncava com 56 sulcos (`InstancedMesh`). Direcional de 4 teclas translúcidas com seta. △○✕□ em acrílico transparente sobre um poço cinza. L1/R1, e L2/R2 em alavanca curva com engrenagem setorial.
- **Interno:** motor do gatilho adaptativo com pinhão (gira 9/2,6 vezes o setor), placa principal com chips, bateria, alto-falante e os dois atuadores hápticos (bobina de cobre que acende com a amplitude e ondas no modo Háptica).
- **Uma entrada move tudo:** `estado(φ)` em `kin.js` dá o curso do R2 e do L2, a força pelo perfil (mola, arco com parede, arma com clique), os analógicos em Lissajous, a amplitude e a frequência hápticas, os botões apertados e a cor da luz. Pose, painel e gráfico de força × curso leem esse mesmo estado.
- **Modos (`<button>`):** Jogar, Gatilho adaptativo, Háptica, Analógicos, Raio-X, Desmontar, Remontar e ▶ Tour. O tour automático tem cursor que clica nos botões. Clique, arrasto, roda ou tecla assume o controle, e depois de 25 s parado o tour volta. Pinça funciona no celular, e as teclas 1–7 trocam de modo.
- **Celular em pé (390×844):** painel denso escondido, linha-resumo no lugar, botões de 48 px, FOV pela largura e qualidade menor.

## Medidas tiradas da referência
Referência 2 (vista de cima): 160 mm = 773 px, ou seja 4,83 px/mm, com o centro em x = 497 px. Resultados: touchpad de ±36/±32 mm por 32 mm (z −53..−21); analógicos em x ±31; direcional e botões em x ±57, z −27, passo de 13,5 mm; PS em z −3 e mudo em z +6; pegas com as pontas em x ±52, z +49, inclinadas para dentro; vão central até z ≈ +20. Ficha pública: 160 × 106 × 66 mm, 280 g, 1560 mAh. Referência 1 (3/4): o branco cobre o alto e o lado de fora das pegas, o miolo e a barriga são pretos, e há contatos dourados no vão.

## Reaproveitado
Só o kit teardown (elvarofficial/teardown @a91262a, MIT): `build.mjs`, `capture.mjs`, `paths.mjs` e fontes. Nenhum código de entradas si3d anteriores, nenhuma malha pronta, nada pago. As fotos de referência servem só para leitura e não vão embutidas na página.

## Rodadas de revisão
1. Casca invertida (winding dos triângulos), setor do gatilho saindo pelo topo e motor flutuando. Corrigi o winding, o arco do setor e a posição do motor.
2. Costura serrilhada (corte por triângulo) e botões de face engolidos pelo ombro curvo. Troquei pelo corte por pixel no shader e assentei os botões pela normal da superfície.
3. Ombros altos demais e grade do marching cubes cortando a base. Baixei o ombro e aumentei a caixa do campo.
4. Comparação lado a lado com a vista de cima: pegas retas, cantos de cima quadrados e posições deslocadas. Ajustei o eixo das pegas para dentro, encolhi a caixa, remedi todas as posições a 4,83 px/mm e escureci o poço dos botões.
5. Placa principal atravessava a barriga e os contatos de carga flutuavam. Recortei a placa e pus os contatos na borda do vão. Erro de console no primeiro quadro (φ < 0) corrigido.

## Teste
Teste local (`testar.mjs`, fila GPU, RTX 4070 Ti SUPER): no PC (1600×900), 60 fps, p95 de 16,7 ms, 204 draw calls, 0 erro de console e 8/8 botões mudam a tela. No celular simulado (390×844 @3x, toque), 59,7 fps, 204 draw calls, 0 erro e 8/8 botões. O arrasto gira a câmera nos dois. Página de 933 KB, offline. Uma rodada anterior pegou o erro do φ negativo (0 → 1 erro, todos os botões "igual"), que já foi corrigido. Celular só foi simulado no Chromium, e a GPU integrada não foi testada.

## Limites honestos
- A superfície vem do marching cubes, então há leve facetamento nos reflexos de perto e nada de textura fina (o padrão de símbolos △○✕□ do miolo e da barriga não foi feito).
- As pegas são um pouco mais curtas e o miolo mais largo que no real. O vão entre as pegas é mais quadrado.
- O logo PS virou uma pílula preta (marca da Sony não reproduzida de propósito).
- O interno é ilustrativo (posição e tamanho plausíveis, não tirados de teardown real). Os perfis de força dos gatilhos são curvas didáticas, não dados da Sony.