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