P5 und Motion-Capture: Visualisierung von Einzelperspektiven
(Person und Objekt)


Mit dem Motion-Capture-System des MediaLabs lassen sich in hoher Auflösung und Qualität Bewegungen von einer oder mehreren Personen/Objekten als dreidimensionale Daten erfassen und als Bewegungsmuster oder Zahlentabellen abspeichern.

Mit Hilfe von P5 lassen sich diese Daten als Kurven oder zwei- oder dreidimensionale interaktive bewegte Punktwolken/Drahtgittermodelle visualisieren, um z.B. die Bewegungen von Tänzer/Musiker*innen als abstrakte Formen darzustellen.

Um die Daten in P5 darstellen/weiterverarbeiten zu können, müssen sie im Qualisys Track Manager des MediaLabs als Zahlenwerte in Form von tab-separated-values (*.tsv) exportiert werden, wie z.B. die hier verwendeten Aufnahme4_ausschnitt.tsv.


Export der Messwerte aus dem Qualisys Track Manager als tab-separated-values (tsv)

Zur visuellen Kontrolle bzw. auf für spätere Synchronisationen lässt sich dort auch das Video als *.avi-Datei exportieren, sowohl unbearbeitet als auch - über die rechte Maustaste im Videobild des Qualisys Track Managers - mit einem 3D-Overlay der erfassten Bewegungsstrukturen.


Mit der rechten Maustaste ein 3D-Overlay über das Video legen.

So lassen sich sowohl ein Originalvideo (z.B.) als auch das gleiche Video mit dem 3D-Overlay aus Ausgangsmaterialien exportieren. Für die Darstellung im Netz bietet es sich an, die Videos nach dem Export in mp4 zu konvertieren (z.B. Aufnahme4_ausschnitt_3D.mp4 und Aufnahme4_ausschnitt_3D_Overlay.mp4).


Export von Videos aus dem Qualisys-Trackmanager als avi-Dateien

Die exportiere *.tsv-Datei lässt sich ohne weiteres in Excel öffnen und kann dort weiter verarbeitet werden (hierfür müssen die Punkte bei den Zahlen in Beistriche umgewandelt werden) oder auch in Javascript-Arrays umgewandelt werden (z.B. Aufnahme4_ausschnitt.js), um sie dann in P5 zwei- oder dreidimensional zu visualisieren:

Neben der P5.js-Library müssen hierfür im Header natürlich die Javascript-Arrays in Aufnahme4_ausschnitt.js eingebunden werden

<script src="header/Aufnahme4_ausschnitt.js"></script>

Im Script folgt nach der Deklarierung von enigen grundlegenden Variablen ...

var qualisys_frames_pro_sekunde = 100; // Frame-Rate der Motion-Capture-Datei
var schalter=0; // Schalter um die dazugehörenden Videos ein- und auszuschalten
var vzeit=0; // aktuelle Zeit des Videos

... die Setup-Funktion mit der Derfinition des Canvas, der Einrichtung eines Start/Stopps bei Mausklick und das Einführen der Variablen i , um mit jedem Framewechsel einen Zähler von 0 bis ans Ende des Javascript-Arrays zu zählen:

function setup(){
container=createCanvas(800,800); // Canvas erstellen
container.parent('p5container'); // an DIV-Container anhängen
container.mouseClicked(togglePlay); // auf Klick auf Canvas reagieren
i=0; // Variable zum Hochzählen auf 0 setzen
}

In der Draw-Funktion wird für drei unterschiedliche Perspektiven (bestehend aus den X-Y-, X-Z- und Y-Z-Koordinaten der 3D-Daten) für jede Punktkombination der beim Motion-Capturen erfassten 42 Körperpunkte mit beginShape(POINTS); vertex(X,Y);... endShape(); eine Figur als Punkte-Shape erstellt.
Da die 42 Körperpunkte beim Qualisys-System meist gleich benannt werden, lässt sich das hier entwickelte Script auf beliebige Exporte der Bewegungsdaten einer Person anwenden (es müssen nur die Javascript-Arrays und die Videos entsprechend ausgetauscht werden).
Über i wird pro Punkt auf die jeweilige Position des Arrays zugegriffen und mit dem Zusatz /6+250 und /6+600 wird die Größe geändert (/6 verkleinert auf 1/6) und ein Versatz auf der X- und Y-Achse angegeben (+250 bzw. +600)(diese Zahlen sind beliebig/je nach Situation änderbar). Dies bedeutet z.B. für den Kopf der Person:

beginShape(POINTS); // Punkte-Shape für die Person aus X-Y-Perspektive erstellen
vertex(PersID_HeadTopX_array[i]/6+250, PersID_HeadTopY_array[i]/6+600);
vertex(PersID_HeadFrontX_array[i]/6+250, PersID_HeadFrontY_array[i]/6+600);
vertex(PersID_HeadLX_array[i]/6+250, PersID_HeadLY_array[i]/6+600);
vertex(PersID_HeadRX_array[i]/6+250, PersID_HeadRY_array[i]/6+600);
...
endShape();

Zusätzliche Objekte werden im *.tsv-Export durch zusätzliche Koordinaten bzw. Spalten beschrieben, d.h. sie liegen dann nach der Konvertierung des *.tsv-Exports auch als zusätzliche Arrays vor. Diese erhalten via beginShape(POINTS); vertex(X,Y);... endShape(); eine eigene Form, die hier z.B. über die Strichfarbe stroke(100,100,100); grau gefärbt ist:

beginShape(POINTS); // Punkte-Shape für die Box B aus X-Y-Perspektive erstellen
vertex(B_Top1X_array[i]/6+250, B_Top1Y_array[i]/6+600);
vertex(B_Top2X_array[i]/6+250, B_Top2Y_array[i]/6+600);
vertex(B_Top3X_array[i]/6+250, B_Top3Y_array[i]/6+600);
vertex(B_Top4X_array[i]/6+250, B_Top4Y_array[i]/6+600);
vertex(B_Bottom1X_array[i]/6+250, B_Bottom1Y_array[i]/6+600);
vertex(B_Bottom2X_array[i]/6+250, B_Bottom2Y_array[i]/6+600);
vertex(B_Bottom3X_array[i]/6+250, B_Bottom3Y_array[i]/6+600);
vertex(B_Bottom4X_array[i]/6+250, B_Bottom4Y_array[i]/6+600);
endShape();

Über die Strichfarbe lassen sich die Punkt-Visualisierungen beliebig einfärben (z.B. blau stroke(50,50,150); oder grün stroke(50,150,50);) und wenn man die Strichweite und die Transparenz des Hintergrunds an die X- und Y-Koordinaten des Mauszeigers hängt, kann man mit den Bewegungen der Person gleichzeitig malen ;->.

Am Ende der Draw-Funktion wird i mit jedem Frame-Wechsel weiter hochgezählt. Da hier die Aufnahme im Qualisys-System mit 100 Werten pro Sekunde stattfand (über qualisys_frames_pro_sekunde in der Variable am Anfang des Scripts einstellbar) und die Frame-Rate bei P5 von der Rechner/Netz-Auslastung abhängig ist, sollte für eine flüssige Original-Bewegung ein Faktor ermittelt werden, mit dem i beim Hochzählen multipliziert werden muss:

framefaktor = qualisys_frames_pro_sekunde/round(frameRate());

Dann kann die Länge des z.B. PersID_HeadTopX_array als Maß dafür verwendet werden, für wie lange i multipliziert mit dem gerundeten framefaktor hochgezählt wird, bis es wieder auf 0 gesetzt wird:

if(i<PersID_HeadTopX_array.length){
i=i+1*round(framefaktor);
}else{
i=0;
}

Will man nun auch die beiden Videos Frame für Frame mit den Bewegungen der Punktwolken synchronisieren, sollte am Ende jedes Durchlaufs (also am Ende der Draw-Funktion) der Wert von i an die Variable für die entsprechende Videozeit übergeben werden (also vzeit = i;) . Darüber hinaus sollten im HTML-Text zwei Videoplayer mit den jeweiligen Videos eingebunden werden:

<video id="meinvplayer" src="bilder/Aufnahme2_ausschnitt_3D.mp4" ontimeupdate="vzeitanzeige()" height="235" width="400"></video>
<video id="meinvplayer_overlay" src="bilder/Aufnahme2_ausschnitt_3D_Overlay.mp4" height="235" width="400"></video>

Über den im Video-Tag eingesetzten Aufruf ontimeupdate="vzeitanzeige()" wird die Funktion function vzeitanzeige(){ ... } aufgerufen, die - nachdem sie beide Player via getElementById() auf der Seite gefunden hat - bei jedem Aufruf den zu vzeit passenden Frame den Playern zuweist.

Über die Funktion function togglePlay() {.. } schließlich werden die Videos gestartet und gestoppt.

 

Insgesamt sieht das Script dann folgendermaßen aus:

<script src="header/p5.js"></script>
<script src="header/p5.sound.js"></script>
<script src="header/Aufnahme4_ausschnitt.js"></script>

<script>

var qualisys_frames_pro_sekunde = 100;
var schalter=0;
var vzeit=0;

function setup(){
container=createCanvas(800,800);
container.parent('p5container');
container.mouseClicked(togglePlay);
i=0;
}

function draw(){
cursor(HAND);
background(255,255,255,mouseY/8);
strokeWeight(mouseX/40);
stroke(50,50,150);
beginShape(POINTS);
vertex(PersID_HeadTopX_array[i]/6+250, PersID_HeadTopY_array[i]/6+600);
vertex(PersID_HeadFrontX_array[i]/6+250, PersID_HeadFrontY_array[i]/6+600);
vertex(PersID_HeadLX_array[i]/6+250, PersID_HeadLY_array[i]/6+600);
vertex(PersID_HeadRX_array[i]/6+250, PersID_HeadRY_array[i]/6+600);

vertex(PersID_LShoulderTopX_array[i]/6+250, PersID_LShoulderTopY_array[i]/6+600);
vertex(PersID_LShoulderBackX_array[i]/6+250, PersID_LShoulderBackY_array[i]/6+600);
vertex(PersID_LArmX_array[i]/6+250, PersID_LArmY_array[i]/6+600);
vertex(PersID_LElbowOutX_array[i]/6+250, PersID_LElbowOutY_array[i]/6+600);
vertex(PersID_LWristInX_array[i]/6+250, PersID_LWristInY_array[i]/6+600);
vertex(PersID_LWristOutX_array[i]/6+250, PersID_LWristOutY_array[i]/6+600);
vertex(PersID_LHandOutX_array[i]/6+250, PersID_LHandOutY_array[i]/6+600);

vertex(PersID_RShoulderTopX_array[i]/6+250, PersID_RShoulderTopY_array[i]/6+600);
vertex(PersID_RShoulderBackX_array[i]/6+250, PersID_RShoulderBackY_array[i]/6+600);
vertex(PersID_RArmX_array[i]/6+250, PersID_RArmY_array[i]/6+600);
vertex(PersID_RElbowOutX_array[i]/6+250, PersID_RElbowOutY_array[i]/6+600);
vertex(PersID_RWristInX_array[i]/6+250, PersID_RWristInY_array[i]/6+600);
vertex(PersID_RWristOutX_array[i]/6+250, PersID_RWristOutY_array[i]/6+600);
vertex(PersID_RHandOutX_array[i]/6+250, PersID_RHandOutY_array[i]/6+600);

vertex(PersID_ChestX_array[i]/6+250, PersID_ChestY_array[i]/6+600);
vertex(PersID_SpineTopX_array[i]/6+250, PersID_SpineTopY_array[i]/6+600);
vertex(PersID_BackLX_array[i]/6+250, PersID_BackLY_array[i]/6+600);
vertex(PersID_BackRX_array[i]/6+250, PersID_BackRY_array[i]/6+600);

vertex(PersID_WaistLFrontX_array[i]/6+250, PersID_WaistLFrontY_array[i]/6+600);
vertex(PersID_WaistLBackX_array[i]/6+250, PersID_WaistLBackY_array[i]/6+600);
vertex(PersID_LThighX_array[i]/6+250, PersID_LThighY_array[i]/6+600);
vertex(PersID_LKneeOutX_array[i]/6+250, PersID_LKneeOutY_array[i]/6+600);
vertex(PersID_LShinX_array[i]/6+250, PersID_LShinY_array[i]/6+600);
vertex(PersID_LAnkleOutX_array[i]/6+250, PersID_LAnkleOutY_array[i]/6+600);
vertex(PersID_LForefootInX_array[i]/6+250, PersID_LForefootInY_array[i]/6+600);
vertex(PersID_LToeTipX_array[i]/6+250, PersID_LToeTipY_array[i]/6+600);
vertex(PersID_LForefootOutX_array[i]/6+250, PersID_LForefootOutY_array[i]/6+600);
vertex(PersID_LHeelBackX_array[i]/6+250, PersID_LHeelBackY_array[i]/6+600);

vertex(PersID_WaistRFrontX_array[i]/6+250, PersID_WaistRFrontY_array[i]/6+600);
vertex(PersID_WaistRBackX_array[i]/6+250, PersID_WaistRBackY_array[i]/6+600);
vertex(PersID_RThighX_array[i]/6+250, PersID_RThighY_array[i]/6+600);
vertex(PersID_RKneeOutX_array[i]/6+250, PersID_RKneeOutY_array[i]/6+600);
vertex(PersID_RShinX_array[i]/6+250, PersID_RShinY_array[i]/6+600);
vertex(PersID_RAnkleOutX_array[i]/6+250, PersID_RAnkleOutY_array[i]/6+600);
vertex(PersID_RForefootInX_array[i]/6+250, PersID_RForefootInY_array[i]/6+600);
vertex(PersID_RToeTipX_array[i]/6+250, PersID_RToeTipY_array[i]/6+600);
vertex(PersID_RForefootOutX_array[i]/6+250, PersID_RForefootOutY_array[i]/6+600);
vertex(PersID_RHeelBackX_array[i]/6+250, PersID_RHeelBackY_array[i]/6+600);
endShape();

stroke(100,100,100);
beginShape(POINTS);
vertex(B_Top1X_array[i]/6+250, B_Top1Y_array[i]/6+600);
vertex(B_Top2X_array[i]/6+250, B_Top2Y_array[i]/6+600);
vertex(B_Top3X_array[i]/6+250, B_Top3Y_array[i]/6+600);
vertex(B_Top4X_array[i]/6+250, B_Top4Y_array[i]/6+600);
vertex(B_Bottom1X_array[i]/6+250, B_Bottom1Y_array[i]/6+600);
vertex(B_Bottom2X_array[i]/6+250, B_Bottom2Y_array[i]/6+600);
vertex(B_Bottom3X_array[i]/6+250, B_Bottom3Y_array[i]/6+600);
vertex(B_Bottom4X_array[i]/6+250, B_Bottom4Y_array[i]/6+600);
endShape();

stroke(50,150,50);
beginShape(POINTS);
vertex(PersID_HeadTopX_array[i]/6+250, 800-PersID_HeadTopZ_array[i]/6-400);
vertex(PersID_HeadFrontX_array[i]/6+250, 800-PersID_HeadFrontZ_array[i]/6-400);
vertex(PersID_HeadLX_array[i]/6+250, 800-PersID_HeadLZ_array[i]/6-400);
vertex(PersID_HeadRX_array[i]/6+250, 800-PersID_HeadRZ_array[i]/6-400);

vertex(PersID_LShoulderTopX_array[i]/6+250, 800-PersID_LShoulderTopZ_array[i]/6-400);
vertex(PersID_LShoulderBackX_array[i]/6+250, 800-PersID_LShoulderBackZ_array[i]/6-400);
vertex(PersID_LArmX_array[i]/6+250, 800-PersID_LArmZ_array[i]/6-400);
vertex(PersID_LElbowOutX_array[i]/6+250, 800-PersID_LElbowOutZ_array[i]/6-400);
vertex(PersID_LWristInX_array[i]/6+250, 800-PersID_LWristInZ_array[i]/6-400);
vertex(PersID_LWristOutX_array[i]/6+250, 800-PersID_LWristOutZ_array[i]/6-400);
vertex(PersID_LHandOutX_array[i]/6+250, 800-PersID_LHandOutZ_array[i]/6-400);

vertex(PersID_RShoulderTopX_array[i]/6+250, 800-PersID_RShoulderTopZ_array[i]/6-400);
vertex(PersID_RShoulderBackX_array[i]/6+250, 800-PersID_RShoulderBackZ_array[i]/6-400);
vertex(PersID_RArmX_array[i]/6+250, 800-PersID_RArmZ_array[i]/6-400);
vertex(PersID_RElbowOutX_array[i]/6+250, 800-PersID_RElbowOutZ_array[i]/6-400);
vertex(PersID_RWristInX_array[i]/6+250, 800-PersID_RWristInZ_array[i]/6-400);
vertex(PersID_RWristOutX_array[i]/6+250, 800-PersID_RWristOutZ_array[i]/6-400);
vertex(PersID_RHandOutX_array[i]/6+250, 800-PersID_RHandOutZ_array[i]/6-400);

vertex(PersID_ChestX_array[i]/6+250, 800-PersID_ChestZ_array[i]/6-400);
vertex(PersID_SpineTopX_array[i]/6+250, 800-PersID_SpineTopZ_array[i]/6-400);
vertex(PersID_BackLX_array[i]/6+250, 800-PersID_BackLZ_array[i]/6-400);
vertex(PersID_BackRX_array[i]/6+250, 800-PersID_BackRZ_array[i]/6-400);

vertex(PersID_WaistLFrontX_array[i]/6+250, 800-PersID_WaistLFrontZ_array[i]/6-400);
vertex(PersID_WaistLBackX_array[i]/6+250, 800-PersID_WaistLBackZ_array[i]/6-400);
vertex(PersID_LThighX_array[i]/6+250, 800-PersID_LThighZ_array[i]/6-400);
vertex(PersID_LKneeOutX_array[i]/6+250, 800-PersID_LKneeOutZ_array[i]/6-400);
vertex(PersID_LShinX_array[i]/6+250, 800-PersID_LShinZ_array[i]/6-400);
vertex(PersID_LAnkleOutX_array[i]/6+250, 800-PersID_LAnkleOutZ_array[i]/6-400);
vertex(PersID_LForefootInX_array[i]/6+250, 800-PersID_LForefootInZ_array[i]/6-400);
vertex(PersID_LToeTipX_array[i]/6+250, 800-PersID_LToeTipZ_array[i]/6-400);
vertex(PersID_LForefootOutX_array[i]/6+250, 800-PersID_LForefootOutZ_array[i]/6-400);
vertex(PersID_LHeelBackX_array[i]/6+250, 800-PersID_LHeelBackZ_array[i]/6-400);

vertex(PersID_WaistRFrontX_array[i]/6+250, 800-PersID_WaistRFrontZ_array[i]/6-400);
vertex(PersID_WaistRBackX_array[i]/6+250, 800-PersID_WaistRBackZ_array[i]/6-400);
vertex(PersID_RThighX_array[i]/6+250, 800-PersID_RThighZ_array[i]/6-400);
vertex(PersID_RKneeOutX_array[i]/6+250, 800-PersID_RKneeOutZ_array[i]/6-400);
vertex(PersID_RShinX_array[i]/6+250, 800-PersID_RShinZ_array[i]/6-400);
vertex(PersID_RAnkleOutX_array[i]/6+250, 800-PersID_RAnkleOutZ_array[i]/6-400);
vertex(PersID_RForefootInX_array[i]/6+250, 800-PersID_RForefootInZ_array[i]/6-400);
vertex(PersID_RToeTipX_array[i]/6+250, 800-PersID_RToeTipZ_array[i]/6-400);
vertex(PersID_RForefootOutX_array[i]/6+250, 800-PersID_RForefootOutZ_array[i]/6-400);
vertex(PersID_RHeelBackX_array[i]/6+250, 800-PersID_RHeelBackZ_array[i]/6-400);
endShape();

stroke(100,100,100);
beginShape(POINTS);
vertex(B_Top1X_array[i]/6+250, 800-B_Top1Z_array[i]/6-400);
vertex(B_Top2X_array[i]/6+250, 800-B_Top2Z_array[i]/6-400);
vertex(B_Top3X_array[i]/6+250, 800-B_Top3Z_array[i]/6-400);
vertex(B_Top4X_array[i]/6+250, 800-B_Top4Z_array[i]/6-400);
vertex(B_Bottom1X_array[i]/6+250, 800-B_Bottom1Z_array[i]/6-400);
vertex(B_Bottom2X_array[i]/6+250, 800-B_Bottom2Z_array[i]/6-400);
vertex(B_Bottom3X_array[i]/6+250, 800-B_Bottom3Z_array[i]/6-400);
vertex(B_Bottom4X_array[i]/6+250, 800-B_Bottom4Z_array[i]/6-400);
endShape();


stroke(150,50,50);

beginShape(POINTS);
vertex(PersID_HeadTopY_array[i]/6+650, 800-PersID_HeadTopZ_array[i]/6-300);
vertex(PersID_HeadFrontY_array[i]/6+650, 800-PersID_HeadFrontZ_array[i]/6-300);
vertex(PersID_HeadLY_array[i]/6+650, 800-PersID_HeadLZ_array[i]/6-300);
vertex(PersID_HeadRY_array[i]/6+650, 800-PersID_HeadRZ_array[i]/6-300);

vertex(PersID_LShoulderTopY_array[i]/6+650, 800-PersID_LShoulderTopZ_array[i]/6-300);
vertex(PersID_LShoulderBackY_array[i]/6+650, 800-PersID_LShoulderBackZ_array[i]/6-300);
vertex(PersID_LArmY_array[i]/6+650, 800-PersID_LArmZ_array[i]/6-300);
vertex(PersID_LElbowOutY_array[i]/6+650, 800-PersID_LElbowOutZ_array[i]/6-300);
vertex(PersID_LWristInY_array[i]/6+650, 800-PersID_LWristInZ_array[i]/6-300);
vertex(PersID_LWristOutY_array[i]/6+650, 800-PersID_LWristOutZ_array[i]/6-300);
vertex(PersID_LHandOutY_array[i]/6+650, 800-PersID_LHandOutZ_array[i]/6-300);

vertex(PersID_RShoulderTopY_array[i]/6+650, 800-PersID_RShoulderTopZ_array[i]/6-300);
vertex(PersID_RShoulderBackY_array[i]/6+650, 800-PersID_RShoulderBackZ_array[i]/6-300);
vertex(PersID_RArmY_array[i]/6+650, 800-PersID_RArmZ_array[i]/6-300);
vertex(PersID_RElbowOutY_array[i]/6+650, 800-PersID_RElbowOutZ_array[i]/6-300);
vertex(PersID_RWristInY_array[i]/6+650, 800-PersID_RWristInZ_array[i]/6-300);
vertex(PersID_RWristOutY_array[i]/6+650, 800-PersID_RWristOutZ_array[i]/6-300);
vertex(PersID_RHandOutY_array[i]/6+650, 800-PersID_RHandOutZ_array[i]/6-300);

vertex(PersID_ChestY_array[i]/6+650, 800-PersID_ChestZ_array[i]/6-300);
vertex(PersID_SpineTopY_array[i]/6+650, 800-PersID_SpineTopZ_array[i]/6-300);
vertex(PersID_BackLY_array[i]/6+650, 800-PersID_BackLZ_array[i]/6-300);
vertex(PersID_BackRY_array[i]/6+650, 800-PersID_BackRZ_array[i]/6-300);

vertex(PersID_WaistLFrontY_array[i]/6+650, 800-PersID_WaistLFrontZ_array[i]/6-300);
vertex(PersID_WaistLBackY_array[i]/6+650, 800-PersID_WaistLBackZ_array[i]/6-300);
vertex(PersID_LThighY_array[i]/6+650, 800-PersID_LThighZ_array[i]/6-300);
vertex(PersID_LKneeOutY_array[i]/6+650, 800-PersID_LKneeOutZ_array[i]/6-300);
vertex(PersID_LShinY_array[i]/6+650, 800-PersID_LShinZ_array[i]/6-300);
vertex(PersID_LAnkleOutY_array[i]/6+650, 800-PersID_LAnkleOutZ_array[i]/6-300);
vertex(PersID_LForefootInY_array[i]/6+650, 800-PersID_LForefootInZ_array[i]/6-300);
vertex(PersID_LToeTipY_array[i]/6+650, 800-PersID_LToeTipZ_array[i]/6-300);
vertex(PersID_LForefootOutY_array[i]/6+650, 800-PersID_LForefootOutZ_array[i]/6-300);
vertex(PersID_LHeelBackY_array[i]/6+650, 800-PersID_LHeelBackZ_array[i]/6-300);

vertex(PersID_WaistRFrontY_array[i]/6+650, 800-PersID_WaistRFrontZ_array[i]/6-300);
vertex(PersID_WaistRBackY_array[i]/6+650, 800-PersID_WaistRBackZ_array[i]/6-300);
vertex(PersID_RThighY_array[i]/6+650, 800-PersID_RThighZ_array[i]/6-300);
vertex(PersID_RKneeOutY_array[i]/6+650, 800-PersID_RKneeOutZ_array[i]/6-300);
vertex(PersID_RShinY_array[i]/6+650, 800-PersID_RShinZ_array[i]/6-300);
vertex(PersID_RAnkleOutY_array[i]/6+650, 800-PersID_RAnkleOutZ_array[i]/6-300);
vertex(PersID_RForefootInY_array[i]/6+650, 800-PersID_RForefootInZ_array[i]/6-300);
vertex(PersID_RToeTipY_array[i]/6+650, 800-PersID_RToeTipZ_array[i]/6-300);
vertex(PersID_RForefootOutY_array[i]/6+650, 800-PersID_RForefootOutZ_array[i]/6-300);
vertex(PersID_RHeelBackY_array[i]/6+650, 800-PersID_RHeelBackZ_array[i]/6-300);
endShape();

stroke(100,100,100);
beginShape(POINTS);

vertex(B_Top1Y_array[i]/6+650, 800-B_Top1Z_array[i]/6-300);
vertex(B_Top2Y_array[i]/6+650, 800-B_Top2Z_array[i]/6-300);
vertex(B_Top3Y_array[i]/6+650, 800-B_Top3Z_array[i]/6-300);
vertex(B_Top4Y_array[i]/6+650, 800-B_Top4Z_array[i]/6-300);
vertex(B_Bottom1X_array[i]/6+650, 800-B_Bottom1Z_array[i]/6-300);
vertex(B_Bottom2X_array[i]/6+650, 800-B_Bottom2Z_array[i]/6-300);
vertex(B_Bottom3X_array[i]/6+650, 800-B_Bottom3Z_array[i]/6-300);
vertex(B_Bottom4X_array[i]/6+650, 800-B_Bottom4Z_array[i]/6-300);
endShape();
framefaktor = qualisys_frames_pro_sekunde/round(frameRate());
if(i<PersID_HeadTopX_array.length){i=i+1*round(framefaktor);}else{i=0;}
vzeit = i;
}


function vzeitanzeige(){
var meinvplayer = document.getElementById('meinvplayer');
var meinvplayer_overlay = document.getElementById('meinvplayer_overlay');
if (schalter==1) {
videozeit= vzeit/100;
} else {
videozeit= 0;
}
meinvplayer.currentTime = videozeit;
meinvplayer_overlay.currentTime = videozeit;
}

function togglePlay() {
if (schalter==0) {
document.getElementById('meinvplayer').play();
document.getElementById('meinvplayer_overlay').play();
schalter=1;
} else {
schalter=0;
}
}
</script>

 

<DIV id="p5container" style="width:800;border: 1px solid #333;box-shadow: 8px 8px 5px #444;padding: 8px 12px;background-color:ffffff"></DIV>

<video id="meinvplayer" src="bilder/Aufnahme4_ausschnitt_3D.mp4" ontimeupdate="vzeitanzeige()" height="235" width="400"></video>

<video id="meinvplayer_overlay" src="bilder/Aufnahme4_ausschnitt_3D_Overlay.mp4" height="235" width="400"></video>