Communitygithub.com

contact-dots

Kontaktabstände in mm, Winkel in Grad und Penetrationen für Animationen prüfen – mit Blender-Messungen und Bildübersicht für jede Prüfung.

Was ist contact-dots?

contact-dots ist ein KI-Agenten-Skill, der in headless Blender für jede einzelne Szene automatisch überprüft, ob Körperteile wie Hände, Füße, Becken oder benannte Objekte innerhalb vorgegebener Toleranzen (mm) Abstand, Berührung, Sitz, Gleiten oder Drehung einhalten. Es unterstützt FBX- und .blend-Dateien, misst frame-genau und erzeugt eine Zusammenfassung in dots.json sowie eine Bildübersicht (dots-sheet.png) mit farbcodierten Markierungen (gelb=bestanden, magenta=fehlgeschlagen). Die Konfiguration erfolgt über eine JSON-Datei, in der Charaktere mit Rollen (z. B. „her“, „him“), Check-Arten (touch, hold, seat, rest, distance, align, range) und Frames definiert werden. Es wird über ein Python-Skript ausgeführt (scripts/dots.py) und benötigt Blender sowie die Python-Standardbibliothek. Der Skill eignet sich besonders für Entwickler und TDs, die im VFX-/Game-Entwicklungs-Workflow die Pose-Korrektheit und Kollisionsfreiheit von Animationen prüfen müssen, ohne die Quelldateien zu verändern.

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

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Was macht contact-dots?

Setzt Punkte auf Hände, Gliedmaßen, Füße und Becken jedes Charakters (und auf alles andere, das Sie benennen) und misst dann Frame für Frame in headless Blender den Abstand jedes Punktes zu einer Oberfläche, den Abstand zwischen Punkten und den Winkel zwischen Richtungen. Schreibt dots.json, gibt eine kurze Zusammenfassung aus und erstellt dots-sheet.png (eine Nahaufnahme pro Prüfung und pro schlimmster Penetration).

Es ändert niemals eine Quelldatei und schreibt nur in den von Ihnen benannten Ausgabeordner.

Wann verwenden

  • "Liegt ihre rechte Handfläche wirklich auf seinem linken Oberschenkel in Frame 40?" (Körperkontakt, touch)
  • "Geht ein Finger in die Tasse?" (Penetrationen werden immer geprüft)
  • "Das Magazin sitzt in Frame 40", "die Kiste liegt flach", "die Waffe bleibt in der Hand", "der aufgesetzte Fuß rutscht nicht" (strukturell: seat, rest, hold, distance)
  • "Der Ellbogen beugt sich nie nach hinten", "der Deckel öffnet sich 0-110 Grad", "die Handfläche zeigt zum Tisch" (rotational: range, align)

Nicht für: Korrektur von Posen, Physik oder Balance, Mund- oder Stoffkontakt, Netz-auf-Netz-Überlappung.

Voraussetzungen

Blender (eine beliebige aktuelle Version; das eigene Python wird intern verwendet) und Python 3 Standardbibliothek für das Host-Skript. Blender wird gefunden aus --blender PFAD, dann $BLENDER, dann PATH, dann den üblichen Installationsordnern.

Befehle

Alle über scripts/dots.py in diesem Skill-Ordner:

python scripts/dots.py selftest [--out VERZ]       # bekannte Antworten; zuerst auf einem neuen Rechner ausführen
python scripts/dots.py bones <datei.fbx|.blend>    # die Knochen des Rigs und die vorgeschlagene Knochenzuordnung
python scripts/dots.py measure <config.json>      # messen, bewerten, dots.json + dots-sheet.png schreiben
python scripts/dots.py sheet <dots.json>          # nur das Blatt neu rendern

Optionen: --blender PFAD, --timeout S (Standard 600), --limits finger|limb (messen), --no-sheet (messen, nur Zahlen).

Die Ergebniszeile (nach etwaigen Warnungen oder selftest-Zeilen): dots: PASS ... (Exit 0), dots: FAIL ... (Exit 1) oder dots: skipped (<Grund>) (Exit 2: kein Blender, Zeitüberschreitung, Blender-Fehler oder eine fehlerhafte Konfiguration; der Grund gibt an, welcher). Ein übersprungener Durchlauf ist kein Ergebnis: Beheben Sie den Grund und führen Sie es erneut aus.

Von einem Satz zu einer Konfiguration

  1. Führen Sie dots.py bones <datei> für jede Charakterdatei aus, wenn Sie sich bei der Rig-Zuordnung nicht sicher sind (Mixamo- und Unity-Humanoid-Namen werden automatisch zugeordnet; andernfalls schreiben Sie eine boneMap).
  2. Geben Sie jedem Charakter eine kurze role (her, him, a, b): die Punkte sind <rolle>.<punkt>.
  3. Wandeln Sie jede zu prüfende Sache in einen Eintrag von checks um, mit den Frames, in denen sie gelten soll.
  4. Geben Sie einen out-Ordner an (relative Pfade sind relativ zur Konfigurationsdatei).

"Ihre rechte Handfläche auf seinem linken Oberschenkel in Frame 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]}]}

"Ihre rechte Hand auf seinem linken Oberschenkel" (jeder Teil der Hand): "a": "her.R.hand" (der nächste Punkt der Gruppe zählt).

Körperpunkte (S = R oder 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. Gruppen: S.hand, S.foot, S.forearm, S.upperarm, S.thigh, S.shin, pelvis.

Oberflächen (b einer Berührung): <rolle> (ganzer Körper), <rolle>.<kanonischer Knochen> (ein Körperteil, z.B. him.LeftUpLeg, him.Spine1, him.Head), self, self.<knochen>, prop:<objektname>, floor, nearest.

Strukturelle und rotatorische Prüfungen verwenden benutzerdefinierte Punkte (an einem Knochen, einem Objekt oder einer Netzregion) und Richtungen (Knochen- oder Objektachse, eine Linie zwischen Punkten, eine Oberflächennormale, eine Handflächennormale, eine Weltachse). Vollständige Konfiguration: references/config.md. Ein durchgerechnetes Beispiel pro Prüfungsart: references/checks.md. Eine ganze Szene mit Berührung, Halten, Ausrichtung, Bereich und Ruhen (eine Schaufensterpuppenhand greift und hebt eine Stange): examples/grab/ im ContactDots-Repository (config.json; das erwartete Ergebnis ist PASS 10/10, 0 Penetrationen).

Grenzwerte: voreingestellt finger (Standard: ein Kontakt darf höchstens 3 mm Abweichung in seinen Frames und höchstens 2 mm Eindringung in jedem Frame haben) oder limb (10 mm / 10 mm), oder eigene Zahlen.

Ergebnisse lesen

Die Zusammenfassung listet jede Prüfung mit ihrer Nummer, dem schlechtesten Frame, dem Grenzwert und PASS/FAIL auf, dann Penetrationen, die tiefer als der Grenzwert sind. Abstände sind Haut zu Oberfläche in mm: positiv = getrennt, negativ = eingedrungen. Details von dots.json: references/results.md.

  • Ein touch FAIL mit einem positiven schlechtesten Abstand = nicht berührend (schwebend); mit einem großen negativen tiefsten Abstand = einsinkend.
  • skinMm in dots.json ist der Hautradius jedes Punktes; ein seltsamer Radius bedeutet schlechte Hautgewichte oder ein falsches Körpernetz, und der Abstand dieses Punktes ist ungenau.
  • Keine Prüfungen deklariert: Die Zusammenfassung listet beobachtete Kontakte (Punkte innerhalb von 30 mm) stattdessen auf.

Warnung zur Weltkoordinate

Zwei FBX-Dateien teilen sich nicht immer eine gemeinsame Weltkoordinate (unterschiedliche Export-Ursprünge oder Offsets). Bei zwei oder mehr Charakteren gibt die Zusammenfassung die Wurzelposition jedes Charakters im ersten Frame aus. Bestätigen Sie, dass sie dort stehen, wo sie sein sollten, relativ zueinander, bevor Sie einer Paarnummer vertrauen. Wenn nicht, sind die Zahlen bedeutungslos: Beheben Sie den Export, verschieben Sie nicht die Zahlen.

SCHAUEN Sie auf das Blatt

Zahlen allein reichen nicht. Öffnen Sie dots-sheet.png (im out-Ordner), bevor Sie Bericht erstatten: jedes Netz in einer einfarbigen Farbe pro Charakter oder Objekt auf dunklem Hintergrund, kleine Punkte pro Charakter, das gemessene Paar durch eine Linie verbunden (gelb = bestanden, magenta = fehlgeschlagen; ein Ring um einen nahezu Null-Abstand), eine transparente Scheibe auf der berührten Oberfläche (Komplementärfarbe, Umriss und Normalenpfeil), XYZ-Triaden (X rot, Y grün, Z hellblau) auf Handfläche, Handgelenk, Kopf und Becken in Nahansichten, Pfeile für Winkelprüfungen, eine Beschriftung pro Kachel (id, Wert, Grenzwert, PASS/FAIL). Das gemessene Paar, Pfeile, Scheibenumriss und Triaden werden vor den Netzen gezeichnet; die kleinen Punkte können sich dahinter verstecken. Überprüfen Sie, dass jede Kachel die Teile zeigt, die Sie gemeint haben (rechte Hand, rechter Oberschenkel, richtiger Frame). Ein Bestehen am falschen Punkt ist eine falsche Antwort.

Rückmeldung

Die erste Zusammenfassungszeile, jede Prüfungsnummer mit ihrem Grenzwert und Frame, Penetrationen über dem Grenzwert, die Wurzelpositionen bei zwei Charakteren und was das Blatt zeigt. Sagen Sie, dass es nur gemessen hat.

Verwandte Skills