openKinect + Fisica. movement

edited August 2016 in Kinect

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);

} }

Tagged:

Answers

  • Answer ✓

    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/

  • edited August 2016

    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.

Sign In or Register to comment.