We are about to switch to a new forum software. Until then we have removed the registration on this forum.
Hello. Before I ask nothing, i mean 2 things. 1. My native language is Spanish and 2. I'm not a professional programmer, I'm learning. So please excuse my car for all the gramatical errors and programming errors or the messy code.
Ok, I want to make some "organisms", that move alone, and then when someone is closer to the kinect, can modify the movement of these "organisms" For this, I been using fisica library and openKinect library, but I can't move them with the data taken from the kinect.
this is my code
Thanks for any help.
/*BASADO EN TUTORIAL DANIERL SHIFFMAN */
import org.openkinect.processing.*;
Kinect kinect; PImage img; float minThresh = 485; float maxThresh = 770;
import fisica.*; FWorld world;
int cantidad = 10; ArrayList noctilucas;
FBox box;
void setup(){
size(640, 520, P3D); kinect = new Kinect(this); kinect.initDepth(); img = createImage(kinect.width, kinect.height, RGB);
//---------MUNDO... Fisica.init(this); world = new FWorld(); world.setGravity(0, 0); world.setEdges();
box = new FBox(60,60);
noctilucas = new ArrayList ();
for (int i = 0; i < cantidad; i ++) { Noctilucas n = new Noctilucas(); world.add(n); noctilucas.add(n); n.crea(32, 233, 245); }
}
void draw(){
background(0);
img.loadPixels();
/calibración de profundidad la kinect versiión 1 o 1414 tiene los valores entre cero y.... para modificar las variables min y maxThresh/ // minThresh = map(mouseX, 0, width, 0, 4500); //maxThresh = map(mouseY, 0, height, 0, 4500); //println(minThresh, maxThresh);
int[] depth = kinect.getRawDepth();
/cantidad de pixeles en X, cantidad de pixeles en Y suma total de todos los pixeles en X y Y/
float sumX = 0; float sumY = 0; float totalPixels = 0;
//buscar la profundidad de cada pixel
for (int x = 0; x < kinect.width; x++){ for(int y = 0; y < kinect.height; y++){
int offset = x + y * kinect.width;
float d = depth[offset];
//espacio minimo y máximo. dentro del que
//debe estar el interactor.
if(d > minThresh && d < maxThresh && x > 105){
/*pixeles que están entre el minimo
y máximo threshold (profundidad) violeta*/
img.pixels[offset] = color(255, 0 , 150);
/*sumando a cada pixel un pixel de los
que están dentro de la profundidad elegida
en X y Y*/
sumX += x;
sumY += y;
totalPixels++;
}else{
img.pixels[offset] = color(0);
}
}
}
img.updatePixels(); image(img, 0, 0);
/avg es la variable para el promedio/
float avgX = sumX / totalPixels; float avgY = sumY / totalPixels; fill(150, 0, 255); //ellipse(avgX, avgY, 64, 64);
for (int i = noctilucas.size()-1; i>= 0; i --) { Noctilucas n = noctilucas.get(i); n.movimiento(); n.kinectDepth(avgX, avgY); }
world.step(); world.draw(); }
//-------class Noctilucas------- class Noctilucas extends FBlob {
float s = random(10, 20 ); float x, y;
Noctilucas() {
super();
}
void crea(color r, color g, color b) {
x = width/2-200 + random(-5, 5);
y = height/2-10 + random(-5, 5);
setAsCircle(random(x - 10), random(y - 10), s, 10);
setStroke(r, g, b);
setStrokeWeight(1);
//setNoStroke();
setFill(94, 133, 157, 70);
setGrabbable(false);
setName("hijas");
}
void movimiento() {
if (frameCount % 2 == 0)
{
x = random(-70, 70);
y = random(-30, 30);
addForce(x, y);
}
}
void kinectDepth(float mX, float mY) {
setPosition(mX, mY);
} }
Answers
Are you working on windows? If so I might recommend using the kinect pv2 library which will give you skeleton tracking. This way you could combine the user's body form with fisica. http://codigogenerativo.com/kinectpv2/
Thanks for the answer, but, I'm not working on windows. there's something similar to that for Mac? Equaly I'm going to see the examples, maybe there's something that can help me like reference. I've really tried various things with the fisica library but FBlob bring me problems.
Thanks equally for the answer.