Kinect。如何处理多个质心,而不使它们在功能上相互影响?

Kinect。如何处理多个质心,而不使它们在功能上相互影响?,kinect,processing,multiple-users,simple-openni,Kinect,Processing,Multiple Users,Simple Openni,我目前正在修美术学士课程,最近我开始尝试通过阅读格雷格·博伦斯坦的《让事物看到》来学习编程 我正在开发的作品是一种尝试,当观众使用Kinect在画廊空间中移动时,跟踪多个质心。我希望观众能在屏幕上留下痕迹,而且当他们接近某些区域时,他们的接近程度会用一条线或什么来表示。我设法找到了一条线索,但一旦另一个人进入视野,他们的观点就会突然联系起来。“接近线”似乎只适用于当前用户,而不适用于以前的用户 我想我的问题真的可以归结为如何隔离每个新用户,这样我就可以创建适用于所有新用户但又不会相互干扰的函数或

我目前正在修美术学士课程,最近我开始尝试通过阅读格雷格·博伦斯坦的《让事物看到》来学习编程

我正在开发的作品是一种尝试,当观众使用Kinect在画廊空间中移动时,跟踪多个质心。我希望观众能在屏幕上留下痕迹,而且当他们接近某些区域时,他们的接近程度会用一条线或什么来表示。我设法找到了一条线索,但一旦另一个人进入视野,他们的观点就会突然联系起来。“接近线”似乎只适用于当前用户,而不适用于以前的用户

我想我的问题真的可以归结为如何隔离每个新用户,这样我就可以创建适用于所有新用户但又不会相互干扰的函数或类

这是到目前为止的节目

import processing.opengl.*;
import SimpleOpenNI.*;
import peasy.*;

PeasyCam cam;
SimpleOpenNI kinect;

ArrayList<PVector> trails;

Hotpoint piece;

PVector currentPosition;
PVector previousPosition;

int pieceX = 0;
int pieceY = 0;
int pieceZ = 2000;
int pieceSize = 500;

void setup() {
  size(1280, 680, OPENGL);
  kinect = new SimpleOpenNI(this);
  kinect.enableDepth();
  kinect.enableUser(SimpleOpenNI.SKEL_PROFILE_NONE);
  kinect.setMirror(true);

  trails = new ArrayList();

  piece = new Hotpoint(pieceX, pieceY, pieceZ, pieceSize);

  cam = new PeasyCam(this, 0, 0, 0, 1000);
}

void draw() {
  background(255);
  kinect.update();
  rotateX(radians(180));

  lights();

  stroke(0);
  strokeWeight(3);

  IntVector userList = new IntVector();
  kinect.getUsers(userList);

  piece.draw();

  for (int i=0; i<userList.size(); i++) {
    int userId = userList.get(i);

    PVector positionCenter = new PVector();
    kinect.getCoM(userId, positionCenter);

    trails.add(positionCenter);

    createTrail();

    piece.check(positionCenter);

    if(piece.check(positionCenter) == true) {
      stroke(255, 0, 0);
      line(positionCenter.x, positionCenter.y, positionCenter.z,
           pieceX, pieceY, pieceZ);
      stroke(0);
    }
  }
}

void createTrail() {
  for (int e=1; e < trails.size(); e++) {
    currentPosition = trails.get(e);
    previousPosition = trails.get(e-1);
    if (currentPosition.z < 1) {
      trails.clear();
    } 
    else {
      stroke(0);
      line(previousPosition.x, previousPosition.y, previousPosition.z, 
      currentPosition.x, currentPosition.y, currentPosition.z);
    }
  }
}
import processing.opengl.*;
导入SimplePenni。*;
进口豌豆*;
豌豆凸轮;
simplepenni-kinect;
ArrayList小径;
热点片;
PVector当前位置;
PVector前位;
整数x=0;
整数Y=0;
整数Z=2000;
int pieceSize=500;
无效设置(){
大小(1280680,OPENGL);
kinect=新的SimplePenni(本);
kinect.enableDepth();
kinect.enableUser(simplePenni.SKEL_PROFILE_NONE);
kinect.setMirror(真);
trails=新的ArrayList();
工件=新热点(工件X、工件Y、工件Z、工件尺寸);
cam=新的PeasyCam(这个,0,0,0,1000);
}
作废提款(){
背景(255);
kinect.update();
旋转度(弧度(180));
灯光();
冲程(0);
冲程重量(3);
IntVector用户列表=新的IntVector();
getUsers(userList);
单件画();
对于(int i=0;i center.x-size/2和&point.xcenter.y-size/2和point.ycenter.z-size/2&&point.z阈值);
}
布尔isHit(){
返回currentlyHit()&&!wasJustHit;
}
无效清除(){
wasJustHit=currentlyHit();
包含的点=0;
}
}
任何帮助都将不胜感激


编辑:

非常感谢您的时间和您的回答@jesses.co.tt,但我一直很难理解它。。。 例如,userList上的循环是否与用户数组不同? 我担心我一次要问的不止一件事,所以我将其分解,首先尝试理解在没有人联系的情况下绘制多条路线

import processing.opengl.*;
import SimpleOpenNI.*;
import peasy.*;

SimpleOpenNI kinect;
PeasyCam cam;

ArrayList<PVector> trails1;
ArrayList<PVector> trails2;

PVector currentPosition;
PVector previousPosition;

void setup() {
  size(1280, 800, OPENGL);

  kinect = new SimpleOpenNI(this);
  kinect.enableDepth();
  kinect.enableUser(SimpleOpenNI.SKEL_PROFILE_NONE);
  kinect.setMirror(true);

  trails1 = new ArrayList();
  trails2 = new ArrayList();

  cam = new PeasyCam(this, 0, 0, 0, 1000);
}

void draw() {
  kinect.update();
  rotateX(radians(180));
  background(255);

  IntVector userList = new IntVector();
  kinect.getUsers(userList);

  //println(userList);

  for (int i=0; i<userList.size(); i++) {
    int userId = userList.get(i);
    //println(userId);
    PVector positionCenter = new PVector();
    kinect.getCoM(userId, positionCenter);

    stroke(0);
    strokeWeight(10);
    point(positionCenter.x, positionCenter.y, positionCenter.z);

    if (userId == 1) {

      trails1.add(positionCenter);
      createTrail1();
    } 
    else if (userId == 2) {
      trails2.add(positionCenter);
      createTrail2();
    }
  }
}

void createTrail1() {
  for (int e=1; e < trails1.size(); e++) {
    currentPosition = trails1.get(e);
    previousPosition = trails1.get(e-1);
    if (currentPosition.z < 1) { // [possibly x or y or all?]
      trails1.clear();
    } 
    else {
      // if (currentPosition.x != 0 || previousPosition.x != 0) { // [not working]
      stroke(0);
      line(previousPosition.x, previousPosition.y, previousPosition.z, 
      currentPosition.x, currentPosition.y, currentPosition.z);
      //trails.clear();
    }
  }
}

void createTrail2() {
  for (int e=1; e < trails2.size(); e++) {
    currentPosition = trails2.get(e);
    previousPosition = trails2.get(e-1);
    if (currentPosition.z < 1) { // [possibly x or y or all?]
      trails2.clear();
    } 
    else {
      // if (currentPosition.x != 0 || previousPosition.x != 0) { // [not working]
      stroke(0);
      line(previousPosition.x, previousPosition.y, previousPosition.z, 
      currentPosition.x, currentPosition.y, currentPosition.z);
      //trails.clear();
    }
  }
}
import processing.opengl.*;
导入SimplePenni。*;
进口豌豆*;
simplepenni-kinect;
豌豆凸轮;
ArrayList trails1;
ArrayList trails2;
PVector当前位置;
PVector前位;
无效设置(){
大小(1280800,OPENGL);
kinect=新的SimplePenni(本);
kinect.enableDepth();
kinect.enableUser(simplePenni.SKEL_PROFILE_NONE);
kinect.setMirror(真);
trails1=新的ArrayList();
trails2=新的ArrayList();
cam=新的PeasyCam(这个,0,0,0,1000);
}
作废提款(){
kinect.update();
旋转度(弧度(180));
背景(255);
IntVector用户列表=新的IntVector();
getUsers(userList);
//println(用户列表);

对于(inti=0;i,据我所知,您需要创建一个可调整大小的用户列表(SimplePenni已经提供给您了),并为您找到的每个新用户创建一个HotPoint类的新实例(或者为每个消失的用户删除它)

您就快到了,因为您正在正确地迭代已知用户的列表

您需要添加一个根据找到的用户数调整大小的热点阵列列表…然后在找到新用户时创建一个新的点实例。按照您现在的方式,您只有一个实例,因此如果有两个用户,它将连接他们-这就是您看到的

确保根据需要从ArrayList中删除项目

你真的很接近…;-)

所以

然后,在用户的for循环中

// Add a new HotPoint if we have more users than Points
if(i > users.size()) {
  users.add(new HotPoint(...));
}
// Delete From ArrayList if we have too many... 
else if(users.size() > userList.size()) {
  users.remove(...);
} 

// Cast and call methods
HotPoint piece = (HotPoint) users.get(i);
piece.check(positionCenter);
piece.draw();
etc...

哎呀,我忘了把Hotpoint类也包括进去,所以现在已经编辑好了!非常感谢你的回答@jesses.co.tt这确实令人鼓舞,尽管我只是在理解上还有困难。我编辑了这个问题,希望能把我的问题再细分一点……如果你能进一步帮助我,那就太好了!
// Global Variables
ArrayList users;
// Add a new HotPoint if we have more users than Points
if(i > users.size()) {
  users.add(new HotPoint(...));
}
// Delete From ArrayList if we have too many... 
else if(users.size() > userList.size()) {
  users.remove(...);
} 

// Cast and call methods
HotPoint piece = (HotPoint) users.get(i);
piece.check(positionCenter);
piece.draw();
etc...