Hello! I’ve asked a similar question tonight but worded it very stupidly and can’t work out how to delete it (apologies! Will work it out).
Basically, I’d like the particles to move away from points of the highest threshold, these values are held in ‘v2.x’ ‘v2.y’ ‘v1.x’ ‘v1.y’
I’m using a Kinect, but I think it’s a really simple issue like I’m missing a loop or something. Could anyone of more experience be of any help with this? I’d appreciate it heaps! I’ve spent hours upon hours doing tutorials etc and I’m really struggling with this. Thank you in advance for any help!
void setup() {
size(640, 420);
/////KINECT/////
kinect = new Kinect(this);
tracker = new KinectTracker();
smooth();
particles = new ArrayList<Particle>();
for (int i = 0; i < num; i++) {
particles.add(new Particle());
}
}
void draw() {
//background(0);
/////KINECT/////
// Run the tracking analysis
tracker.track();
// Show the image
tracker.display();
// Let's draw the raw location
background(0);
PVector v1 = tracker.getPos();
fill(50, 100, 250, 200);
noStroke();
ellipse(v1.x, v1.y, 20, 20);
// Let's draw the "lerped" location
PVector v2 = tracker.getLerpedPos();
fill(100, 250, 50, 200);
noStroke();
ellipse(v2.x, v2.y, 20, 20);
for (Particle p : particles) {
p.move();
p.sketch();
//p.checkMouse();
}
float dx = v2.x;
float dy = v2.y;
float px = width / 2;
float py = height/2;
//void checkMouse() {
float mouseRadius = 50;
float d = dist(v2.x,v2.y, px, py);
if (d<mouseRadius && d > 1) {
dx += (px-v2.x) / d*mouseRadius;
dy += (py-v2.y) / d*mouseRadius;
}
}
//}
class Particle {
float px, py;
float dx, dy;
float damp;
color sc;
Particle() {
px = width / 2;
py = height/2;
dx = random(width);
dy = random(height);
damp = random(0.01, 0.04);
sc = color(random(100, 255), 0, random(15, 25));
}
void move() {
dx += random(-5, +5);
dy += random(-5, +5);
px += (dx - px) * damp;
py += (dy - py) * damp;
}
void sketch() {
fill(sc, 100);
noStroke();
ellipse(px, py, 20, 20);
}
---------------------------------------------------------------------
// Tab 2 for the Kinect Tracking!
// Daniel Shiffman
// Tracking the average location beyond a given depth threshold
// Thanks to Dan O'Sullivan
// https://github.com/shiffman/OpenKinect-for-Processing
// http://shiffman.net/p5/kinect/
class KinectTracker {
// Depth threshold
int threshold = 745;
// Raw location
PVector loc;
// Interpolated location
PVector lerpedLoc;
// Depth data
int[] depth;
// What we'll show the user
PImage display;
KinectTracker() {
// This is an awkard use of a global variable here
// But doing it this way for simplicity
kinect.initDepth();
kinect.enableMirror(true);
// Make a blank image
display = createImage(kinect.width, kinect.height, RGB);
// Set up the vectors
loc = new PVector(0, 0);
lerpedLoc = new PVector(0, 0);
}
void track() {
// Get the raw depth as array of integers
depth = kinect.getRawDepth();
// Being overly cautious here
if (depth == null) return;
float sumX = 0;
float sumY = 0;
float count = 0;
for (int x = 0; x < kinect.width; x++) {
for (int y = 0; y < kinect.height; y++) {
int offset = x + y*kinect.width;
// Grabbing the raw depth
int rawDepth = depth[offset];
// Testing against threshold
if (rawDepth < threshold) {
sumX += x;
sumY += y;
count++;
}
}
}
// As long as we found something
if (count != 0) {
loc = new PVector(sumX/count, sumY/count);
}
// Interpolating the location, doing it arbitrarily for now
lerpedLoc.x = PApplet.lerp(lerpedLoc.x, loc.x, 0.3f);
lerpedLoc.y = PApplet.lerp(lerpedLoc.y, loc.y, 0.3f);
}
PVector getLerpedPos() {
return lerpedLoc;
}
PVector getPos() {
return loc;
}
void display() {
PImage img = kinect.getDepthImage();
// Being overly cautious here
if (depth == null || img == null) return;
// Going to rewrite the depth image to show which pixels are in threshold
// A lot of this is redundant, but this is just for demonstration purposes
display.loadPixels();
for (int x = 0; x < kinect.width; x++) {
for (int y = 0; y < kinect.height; y++) {
int offset = x + y * kinect.width;
// Raw depth
int rawDepth = depth[offset];
int pix = x + y * display.width;
if (rawDepth < threshold) {
// A red color instead
display.pixels[pix] = color(150, 50, 50);
} else {
display.pixels[pix] = img.pixels[offset];
}
}
}
display.updatePixels();
// Draw the image
image(display, 0, 0);
}
int getThreshold() {
return threshold;
}
void setThreshold(int t) {
threshold = t;
}
}