2017-10-28 4 views
1

Ich habe Daten, bei denen ein Teilnehmer an jeder Hand Positionsdaten hatte:Verwenden von R: Wie animiert man mehrere 3D-Objekte in einer einzelnen rgl-Leinwand?

links: rechts:

Positionsdaten hat

pos.x 
pos.y 
pos.z 

irgendwann t

Die erste Frage war, über den Import von OBJ zur Arbeit mit RGL: https://stackoverflow.com/posts/46626767/revisions

Das habe ich herausgefunden. Ich habe Funktionen geschrieben, um rgl Mesh-Framework für Open-Source-OBJ-Dateien zu verbessern.

Ich legte die erforderlichen Funktionen online: https://gist.github.com/MonteShaffer/d142210cddf346c86aeab1ea2d1d7e9d

die Positionsdaten sollten auf einer Armbanduhr erfasst werden, so dass ich möchte in der Lage sein zu zeigen, zwei oder mehr 3D-Datenobjekte und animieren jeweils unabhängig voneinander basierend auf Positions/Zeit Daten.

Behandeln Sie die Hand wie ein starres Objekt, wobei sich die Armbanduhrregion entsprechend bewegt.

stellte ich die hand.OBJ Datei online: https://gist.github.com/MonteShaffer/6c0057b1431364caf120220db77dde4b

ich grundlegender Grafik bewusst bin, Aktualisierung, Spinnen:

library(rgl) 

mymesh = buildBasicMeshFromOBJ(parseFileOBJ("hand.OBJ")); 

open3d() 
shade3d(mymesh, col = "pink") 
par3d(userMatrix = rotate3d(par3d("userMatrix"), 0.1, 1,0,0)) 
play3d(spin3d(axis = c(1, 0, 0))) 

Mein Ziel ist es, mehrere Objekte auf der gleichen rgl Leinwand zu zeichnen.

z.B.

righthand = mymesh 
lefthand = mymesh 

head = buildBasicMeshFromOBJ(parseFileOBJ("head.obj")); 

und jedes Element hat, unabhängig als eine Animation im Laufe der Zeit auf Positions/Zeit-Daten für jedes Element basierend bewegen. Vorläufig bleibt der Kopf ruhig, aber jede Hand bewegt sich basierend auf der starren Idee mit der Position, die das Handgelenk darstellt.

Es wäre ein Bonus, dass die Maus ziehen könnte (um 3D-Ansichten um die Hände und den Kopf zu ändern), während die Animation läuft.

Antwort

0

Sie können Objekte innerhalb der Szene mithilfe einer Funktion wie rotate3d verschieben. Trotz seines Namens erlaubt es ganz allgemeine Bewegungsarten: siehe Hilfeseite.

Verschieben Sie also die Objekte selbst, anstatt par3d zu verwenden, um Objekte zu verschieben.

rgl bietet keine Möglichkeit, Objekte zu ändern, die bereits in der Szene sind (obwohl die WebGL Anzeige von rgl Objekte tut ...), so die Grundidee ist folgende:

  • Plot der Objekt, speichern und die IDs (zB ids <- shade3d(mymesh))
  • Dann wird in einer Schleife:
    • Updates deaktivieren (mit par3d(skipRedraw=TRUE))
    • löschen Sie das Objekt (zBrgl.pop(id=ids))
    • Verschieben Sie das Objekt und geben Sie es erneut ein
    • Aktivieren Sie die Updates.

Die play3d Funktion bietet einen Rahmen, dies zu automatisieren, aber Sie brauchen es nicht zu benutzen. Zum Beispiel stellt diese zwei Ikosaeder und dreht sie nach dem Zufall unabhängig:

orig1 <- icosahedron3d() 
id1 <- shade3d(orig1, col = "green") 
orig2 <- translate3d(orig1, 4, 0, 0) 
id2 <- shade3d(orig2, col = "blue") 

repeat { 
    orig1 <- rotate3d(orig1, 0.01, rnorm(1, 1), rnorm(1), rnorm(1)) 
    orig2 <- rotate3d(orig2, 0.05, rnorm(1, -1), rnorm(1), rnorm(1)) 
    par3d(skipRedraw = TRUE) 
    rgl.pop(id = c(id1, id2)) 
    id1 <- shade3d(orig1, col = "green") 
    id2 <- shade3d(orig2, col = "blue") 
    par3d(skipRedraw = FALSE) 
} 

Ein anderer Weg, dies zu tun ist, zwei separate subscenes einzurichten. Dann kann jede durch ihre eigene par3d() Einstellung gesteuert werden. Zum Beispiel

Jetzt kann jeder der Ikosaeder unabhängig mit der Maus manipuliert werden. Wenn Sie es mit par3d tun möchten, verwenden Sie etwas wie par3d(..., subscene = ids[1]), um das linke Fenster, par3d(..., subscene = ids[2]) für das rechte Fenster zu beeinflussen.

Verwandte Themen