To run the code below, you'll need a XML file inside the data folder of the processing sketch, as we did in the previous post.
To move inside the 3D world, left-click and move, to zoom, right-click and move
//http://creativec0d1ng.blogspot.com.br/ by Italo Travenzoli
import java.awt.Frame; //import Frame
import java.awt.BorderLayout; //import Border Layout
import controlP5.*; //import proxml library
private ControlP5 cp5; //import controlP5 library
ControlFrame cf; // create a control frame object
import peasy.*; //import Peasy library
PeasyCam cam;
import proxml.*; //import proxml library
//xml element to store and load the data of the xml
XMLElement Animation;
XMLElement Object;
XMLElement frame;
XMLElement framePointer;
XMLElement position;
XMLElement positionPointer;
XMLElement rotation;
XMLElement rotationPointer;
XMLInOut xmlInOut;
float posX, posY, posZ; // float variables for positions
String objName; // string variables for object name
int frameSelector = 0; //variable to select frames, initialized with the 0 position
int frameSelectorConstrain; ///constrained variable to select frames
int objectSelector = 0; //variable to select objects, initialized with the 0 position
int numFrames=0; //variable to count the number of frames in the animation, initialized with the 0 position
int numObjects=0; //variable to count the number of objects in the scene, initialized with the 0 position
float [] pointCloudX; //array of floats (x positions of points in the cloud)
float [] pointCloudY; //array of floats (y positions of points in the cloud)
float [] pointCloudZ; //array of floats (z positions of points in the cloud)
float varYMap; //float variable to map the y variation
void setup() {
size(600, 350, P3D); //size & p3d render
cam = new PeasyCam (this, 1000);
//cam.setMinimumDistance(1000);
cam.setMaximumDistance(5000);
xmlInOut = new XMLInOut(this);
try {
xmlInOut.loadElement("data.xml");
}
catch(Exception e) {
//if the xml file could not be loaded it has to be created
// xmlEvent(new XMLElement("Animation"));
}
//controls
cp5 = new ControlP5(this); //new ControlP5 object
cf = addControlFrame("extra", 400, 150); //new Control Frame object - secondary window - (name, width, height)
numObjects = (Animation.countChildren()-1); //define numObjects with the number of childrens of the 'Animation' tag
numFrames= (Object.countChildren()-1); //define numFrames with the number of childrens of the 'Object' tag
pointCloudX= new float [numFrames]; //create an float array with the size of number of frames
pointCloudY= new float [numFrames]; //create an float array with the size of number of frames
pointCloudZ= new float [numFrames]; //create an float array with the size of number of frames
}
void xmlEvent(XMLElement element) {
Animation = element; //define the Animation element as the element (first tag of XML)
Object = Animation.getChild(0); //define the Object element as the -first- child of Animation tag in position 0 (the first object of the xml file)
}
void draw() {
background(255); //white bg
frameSelectorConstrain = constrain(frameSelector, 0, (Object.countChildren()-2)); // constrain frame selector
for (int a = 0; a< numObjects; a++) { // for all objects in scene
Object = Animation.getChild(a); //get objects
objName =(Object.getAttribute("name")); //get objects names
for (int b=0; b<numFrames;b++) { // for all frames
framePointer = Object.getChild(b); //get frame in context
positionPointer = framePointer.getChild(0); //read _position as first child of _frame
rotationPointer = framePointer.getChild(1); //read _rotation as second child of _frame
pointCloudX[b] = positionPointer.getFloatAttribute("posX"); //read attribute 'posX' as float
pointCloudY[b] = positionPointer.getFloatAttribute("posY"); //read attribute 'posY' as float
pointCloudZ[b] = positionPointer.getFloatAttribute("posZ"); //read attribute 'posZ' as float
fill(255, 0, 0); //red fill
stroke(255,0,0); //red stroke
//draw points (to represent position in time)
pushMatrix();
stroke(255,0,0); //red stroke
strokeWeight(5); //stroke weight 5
translate(pointCloudX[b]*100, pointCloudZ[b]*-100, pointCloudY[b]*100); //translate each point to the position of the objects in scene (*100, because the values are too low)
point(0,0); //draw point
popMatrix();
// draw lines (to represent rotation in time)
pushMatrix();
pushStyle();
stroke(0,0,255); //blue stroke
strokeWeight(1); //stroke weight 2
translate(pointCloudX[b]*100, pointCloudZ[b]*-100, pointCloudY[b]*100); //translate each line to the position of the objects in scene (*100, because the values are too low)
rotateX(radians(rotationPointer.getFloatAttribute("rotX")*100)); //rotate x
rotateY(radians(rotationPointer.getFloatAttribute("rotY")*100)); //rotate y
rotateZ(radians(rotationPointer.getFloatAttribute("rotZ")*100)); //rotate z
line(0,0,0,-30); //draw line
popStyle();
popMatrix();
}
//draw point of the selected frame
pushMatrix();
stroke(0,255,0); //green stroke
strokeWeight(8); //stroke weight 8
translate(pointCloudX[frameSelectorConstrain]*100, pointCloudZ[frameSelectorConstrain]*-100, pointCloudY[frameSelectorConstrain]*100); //translate each point to the position of the objects in scene (*100, because the values are too low)
point(0,0); //draw point
popMatrix();
//draw text
pushMatrix();
fill(255,0,0);
translate(pointCloudX[0]*100, pointCloudZ[0]*-100, pointCloudY[0]*100); //translate each object name to the position of the objects in scene (*100, because the values are too low)
textSize(20); // text size 20
text(objName, 20, 20); //draw text with offset of 20 pixels
popMatrix();
}
//draw world box
noFill();
stroke(150);
strokeWeight(2);
box (700);
}
ControlFrame addControlFrame(String theName, int theWidth, int theHeight) {
Frame f = new Frame(theName);
ControlFrame p = new ControlFrame(this, theWidth, theHeight);
f.add(p);
p.init();
f.setTitle(theName);
f.setSize(p.w, p.h);
f.setLocation(100, 100);
f.setResizable(false);
f.setVisible(true);
return p;
}
// the ControlFrame class extends PApplet, so we
// are creating a new processing applet inside a
// new frame with a controlP5 object loaded
public class ControlFrame extends PApplet {
int w, h;
int abc = 100;
public void setup() {
size(w, h);
frameRate(25);
cp5 = new ControlP5(this);
//create sliders
//slider to select frame
numFrames=(Object.countChildren()-1);
cp5.addSlider("frameSelector")
.setPosition(20, 20)
.setWidth(200)
.setHeight(50)
.setRange(0, numFrames) // values can range from big to small as well
.setValue(0)
//.setSliderMode(Slider.FLEXIBLE)
.plugTo(parent, "frameSelector")
;
frameSelector = constrain(frameSelector,0,Object.countChildren()-1);
/*
cp5.addSlider("abc").setRange(0, 255).setPosition(10,10);
cp5.addSlider("def").plugTo(parent,"def").setRange(0, 255).setPosition(10,30);
*/
}
public void draw() {
background(255);
fill(0);
pushMatrix();
textSize(20);
text("frame: "+frameSelector, 20, 100);
popMatrix();
}
private ControlFrame() {
}
public ControlFrame(Object theParent, int theWidth, int theHeight) {
parent = theParent;
w = theWidth;
h = theHeight;
}
public ControlP5 control() {
return cp5;
}
ControlP5 cp5;
Object parent;
}














