Wie kann man 3D-Pose-Markierungen (Punkte im 3D-Raum) auf ein manipuliertes humanoides Modell in Three.js umlenken?JavaScript

Javascript-Forum
Guest
 Wie kann man 3D-Pose-Markierungen (Punkte im 3D-Raum) auf ein manipuliertes humanoides Modell in Three.js umlenken?

Post by Guest »

Ich versuche, einen 3D-Avatar in Three.js zu implementieren, indem ich 3D-Posenmarkierungen einer Person (Bild für Bild) aus einem Video extrahiere (mithilfe von MediaPipe/PoseFormat). Ich habe derzeit eine .pose-Datei, die pro Bild Orientierungspunkte für den Körper, die linke Hand und die rechte Hand bereitstellt, die aus einem Video extrahiert wurden. Jeder Orientierungspunkt hat (x,y,z) plus einen Konfidenzwert c. Da sie ursprünglich in Pixeleinheiten vorliegen, habe ich sie normalisiert, damit ich sie im 3D-Raum rendern kann.
Was ich bisher getan habe:
Strichmännchen-Animation: Ich habe für jedes Gelenk (z. B. Schulter, Ellenbogen, Handgelenk) kleine Kugeln erstellt und diese mit Zylindern verbunden, um ein „Strichmännchen“ zu bilden. Indem ich jede Kugel an einem Orientierungspunkt (x, y, z) positioniere und einen Zylinder zwischen den Kugeln zeichne, sehe ich eine grobe Figur, die sich korrekt bewegt und die Person im Video korrekt nachahmt.
Image

Ein manipuliertes 3D-Modell geladen:< /em> Das habe ich importierte ein humanoides .gltf-Modell mit einem Skelett (Knochen für jeden Körperteil).
wie:

Code: Select all

model.traverse((child) => {
if (child.isBone) {
bonesMap[child.name] = child;
}
});
Versuch einer Neuausrichtung: Pro Frame berechne ich Richtungsvektoren für Gliedmaßen (z. B. UpperArm → ForeArm = (ElbowPos - ShoulderPos)) im Weltraum. Dann versuche ich, die Rotation des Knochens über eine Funktion wie:
einzustellen

Code: Select all

function setBoneDirection(bone, parentPos, childPos) {
const direction = new THREE.Vector3()
.subVectors(childPos, parentPos)
.normalize();
// Then set the bone’s quaternion somehow...
}
Image

Die Knochen bewegen sich zwar, aber die Richtung stimmt nicht und der Arm/Unterarm dreht sich unbeholfen. Der Ellenbogen beugt sich einigermaßen richtig, dreht sich aber in die falsche Richtung.
Meine Hauptfragen:
Lokal vs . Weltraum: Meine Orientierungspunkte liegen im Weltraum, aber die Transformation jedes Knochens in einem Skelett ist im lokalen Raum definiert (relativ zu seinem übergeordneten Element). Wenn ich also den Oberarm bewege, wird die Drehung des Unterarms beeinflusst. Wie konvertiere ich meine Pose-Daten richtig in den lokalen Raum jedes Bones, damit sich die Kette korrekt bewegt?
Anweisungen für Pose/Ruhepose binden: Die Bones des Rigs sind wahrscheinlich ar Sie sind nicht entlang
(0,1,0) (0,1,0) oder (0,−1,0) (0,−1,0) in ihrer neutralen (Bindungs-)Position ausgerichtet. Wie finde ich die Standardachse jedes Knochens heraus, damit ich den korrekten Rotationsversatz berechnen kann?
Robuster Ansatz/Bibliothek: Gibt es eine Bibliothek, einen Algorithmus oder einen Code? Muster, das:
  • die Orientierungspunkte aus dem Weltraum → den lokalen Raum des übergeordneten Knochens transformiert
  • die „Ruhehaltungsrichtung“ eines Knochens bestimmt ” durch Messung in der Bindeposition des Rigs
  • Berechnet die endgültige Rotation für alle Knochen, sodass das Modell zu meiner Strichmännchen-Animation passt?
Hier ist meine aktuelle Implementierung in CodeSandbox, die die Strichmännchen-Animation und den 3D-Modell-Retargeting-Versuch enthält: https://codesandbox.io/p/github/AzizSta ... ue&embed=1
Quellcode: https://github.com/AzizStark/3DAvatar
Alle hilfreichen Vorschläge oder Codebeispiele zur genauen Anwendung von Frame-by-Frame-Landmark-Daten auf ein manipuliertes Modell in Three.js wäre super hilfreich. Danke!

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post