Communitygithub.com

contact-dots

Mede no Blender headless se coisas que deveriam tocar, assentar, ficar paradas ou alinhar realmente o fazem, nas malhas reais de uma animação (FBX ou .blend). Contato corporal em mm (mão na coxa, dedos em um objeto, pés no chão), verificações estruturais (uma peça encaixada em seu soquete, uma caixa apoiada plana, um objeto segurado sem deslizar, um espaçamento fixo) e verificações rotacionais em graus (uma peça alinhada, uma dobradiça ou junta dentro de seu limite), além de cada penetração, com uma folha de imagens em close-up. Use quando for solicitado a verificar, medir ou checar contatos, penetrações, encaixes, deslizamentos ou ângulos em uma animação ou pose. Apenas mede; não corrige nada.

O que é contact-dots?

Contact-dots é uma habilidade do Blender headless (executado com `blender -b`) que coloca pontos de medição (dots) em mãos, membros, pés e pelve de personagens e objetos, e então mede, quadro a quadro, a distância de cada ponto a uma superfície, a distância entre pontos e o ângulo entre direções. Com base nisso, gera um relatório em `dots.json` e uma folha de imagens `dots-sheet.png` com close-ups de cada verificação e da pior penetração. Suporta verificações de toque (`touch`, como mão na coxa), penetrações (sempre verificadas), encaixes (`seat`, peça em soquete), repouso (`rest`, caixa apoiada plana), segurar (`hold`, objeto na mão sem deslizar), distância fixa (`distance`), alinhamento (`align`, palma virada para mesa) e faixa angular (`range`, cotovelo não dobra para trás). Funciona com arquivos .fbx ou .blend. O uso é feito através do script Python `scripts/dots.py` que oferece três comandos principais: `bones` para mapear ossos da rig, `measure` para executar as medições com base em um arquivo de configuração JSON, e `selftest` para verificar se o Blender está funcionando corretamente. É útil para animadores e artistas técnicos que precisam verificar contatos corporais, penetrações ou alinhamentos de forma automática e precisa.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/FullCircle-0/ContactDots/tree/HEAD/skill/contact-dots

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

O que contact-dots faz?

Coloca pontos (dots) nas mãos, membros, pés e pelve de cada personagem (e em qualquer outra coisa que você nomear), em seguida mede, quadro a quadro, no Blender headless, o espaço de cada ponto até uma superfície, a distância entre pontos e o ângulo entre direções. Escreve dots.json, imprime um breve resumo e renderiza dots-sheet.png (um close-up por verificação e por pior penetração).

Nunca altera um arquivo de origem e escreve apenas na pasta de saída que você nomear.

Quando usar

  • "A palma direita dela está realmente na coxa esquerda dele no quadro 40?" (contato corporal, touch)
  • "Algum dedo entra dentro do copo?" (penetrações são sempre verificadas)
  • "O carregador está encaixado no quadro 40", "a caixa está apoiada plana", "a arma fica na mão", "o pé plantado não desliza" (estruturais: seat, rest, hold, distance)
  • "O cotovelo nunca dobra para trás", "a tampa abre 0-110 graus", "a palma está virada para a mesa" (rotação: range, align)

Não serve para: corrigir poses, física ou equilíbrio, contato de boca ou tecido, sobreposição malha-contra-malha.

Necessidades

Blender (qualquer versão recente; seu próprio Python é usado internamente) e biblioteca padrão do Python 3 para o script hospedeiro. O Blender é encontrado a partir de --blender CAMINHO, depois $BLENDER, depois PATH, depois as pastas de instalação comuns.

Comandos

Todos através de scripts/dots.py nesta pasta da habilidade:

python scripts/dots.py selftest [--out DIR]       # respostas conhecidas; execute primeiro em uma máquina nova
python scripts/dots.py bones <arquivo.fbx|.blend>  # os ossos do rig e o mapa de ossos proposto
python scripts/dots.py measure <config.json>      # mede, julga, escreve dots.json + dots-sheet.png
python scripts/dots.py sheet <dots.json>          # rerrenderiza apenas a folha

Opções: --blender CAMINHO, --timeout S (padrão 600), --limits finger|limb (medir), --no-sheet (medir, apenas números).

A linha de resultado (após qualquer aviso ou linhas de autoteste): dots: PASS ... (saída 0), dots: FAIL ... (saída 1) ou dots: skipped (<motivo>) (saída 2: sem Blender, timeout, erro do Blender ou configuração ruim; o motivo diz qual). Uma execução ignorada não é um resultado: corrija o motivo e execute novamente.

De uma frase a uma configuração

  1. Execute dots.py bones <arquivo> para cada arquivo de personagem se você não tiver certeza do mapeamento do rig (Mixamo e nomes humanoides Unity mapeiam sozinhos; caso contrário, escreva um boneMap).
  2. Atribua a cada personagem um role curto (her, him, a, b): os pontos são <role>.<dot>.
  3. Transforme cada coisa a verificar em uma entrada de checks, com os quadros em que deve se manter.
  4. Nomeie uma pasta out (caminhos relativos são relativos ao arquivo de configuração).

"A palma direita dela na coxa esquerda dele no quadro 40":

{"out": "dots_out",
 "characters": [{"role": "her", "file": "her.fbx"}, {"role": "him", "file": "him.fbx"}],
 "frames": [40],
 "checks": [{"id": "palm-on-thigh", "kind": "touch", "a": "her.R.palm", "b": "him.LeftUpLeg", "frames": [40]}]}

"A mão direita dela na coxa esquerda dele" (qualquer parte da mão): "a": "her.R.hand" (o ponto mais próximo do grupo é considerado).

Pontos corporais (S = R ou L): S.<finger>.tip, S.<finger>.mid (thumb, index, middle, ring, pinky), S.palm, S.forearm.1-3, S.upperarm.1-3, S.thigh.1-3, S.shin.1-3, S.knee, S.heel, S.ball, S.toe, pelvis.front, pelvis.back. Grupos: S.hand, S.foot, S.forearm, S.upperarm, S.thigh, S.shin, pelvis.

Superfícies (b de um toque): <role> (corpo inteiro), <role>.<osso canônico> (uma parte do corpo, ex.: him.LeftUpLeg, him.Spine1, him.Head), self, self.<osso>, prop:<nome do objeto>, floor, nearest.

Verificações estruturais e rotacionais usam pontos personalizados (em um osso, um objeto ou uma região de malha) e direções (eixo de osso ou objeto, uma linha entre pontos, uma normal de superfície, uma normal de palma, um eixo mundo). Configuração completa: references/config.md. Um exemplo trabalhado por tipo de verificação: references/checks.md. Uma cena inteira com toque, segurar, alinhar, faixa e repouso (uma mão de manequim segura e levanta uma barra): examples/grab/ no repositório ContactDots (config.json; o resultado esperado é PASS 10/10, 0 penetrações).

Limites: predefinição finger (padrão: um contato pode estar no máximo 3 mm afastado em seus quadros e no máximo 2 mm para dentro em qualquer quadro) ou limb (10 mm / 10 mm), ou seus próprios números.

Lendo os resultados

O resumo lista cada verificação com seu número, pior quadro, o limite e PASS/FAIL, em seguida penetrações mais profundas que o limite. Espaços são pele até superfície em mm: positivo = separado, negativo = dentro. Detalhes de dots.json: references/results.md.

  • Um FAIL de toque com um pior espaço positivo = não está tocando (flutuando); com um espaço mais profundo grande negativo = afundando.
  • skinMm em dots.json é o raio de pele próprio de cada ponto; um raio estranho significa pesos de pele ruins ou uma malha corporal errada, e o espaço daquele ponto é aproximado.
  • Nenhuma verificação declarada: o resumo lista contatos observados (pontos dentro de 30 mm) em vez disso.

Aviso de quadro mundial

Dois arquivos FBX nem sempre compartilham um quadro mundial (diferentes raízes de exportação ou deslocamentos). Com dois ou mais personagens, o resumo imprime a posição da raiz de cada personagem no primeiro quadro. Confirme que eles estão onde deveriam, um em relação ao outro, antes de confiar em qualquer número de par. Se não estiverem, os números não têm significado: corrija a exportação, não ajuste os números.

OLHE a folha

Apenas números não são suficientes. Abra dots-sheet.png (na pasta out) antes de relatar: cada malha em uma cor sólida por personagem ou objeto em um fundo escuro, pontos pequenos por personagem, o par medido unido por uma linha (amarelo = passa, magenta = falha; um anel em torno de um espaço próximo de zero), um disco translúcido na superfície tocada (cor complementar, contorno e seta normal), tríades XYZ (X vermelho, Y verde, Z azul claro) na palma, pulso, cabeça e pelve em vistas próximas, setas para verificações de ângulo, uma legenda por tile (id, valor, limite, PASS/FAIL). O par medido, setas, contorno do disco e tríades são desenhados na frente das malhas; os pontos pequenos podem se esconder atrás deles. Verifique se cada tile mostra as partes que você quis (mão direita, coxa direita, quadro direito). Um passe no ponto errado é uma resposta errada.

Relate de volta

A primeira linha do resumo, cada número de verificação com seu limite e quadro, penetrações acima do limite, as posições das raízes se dois personagens, e o que a folha mostra. Diga que mediu apenas.

Habilidades Relacionadas