Kinect&处理:将骨架手数据传递到鼠标位置

时间:2017-03-03 16:23:15

标签: java processing kinect

我已经做了一段时间,感觉如此接近!应该很容易,但我还是新手。

骨架手数据正在joints[KinectPV2.JointType_HandLeft]传递,可以通过joint.getX()joint.getY()访问。我想将此数据传递给更新函数以替换mouseX和mouseY。我猜我必须创建全局变量才能在更新函数中访问它,或者我必须将骨架数据作为参数传递给更新函数?如何用手位置替换鼠标位置数据?

      import KinectPV2.*;
      KinectPV2 kinect;                  

      private class MyFluidData implements DwFluid2D.FluidData{

        // update() is called during the fluid-simulation update step.
        @Override
        public void update(DwFluid2D fluid) {

          float px, py, vx, vy, radius, vscale, temperature;

          radius = 15;
          vscale = 10;
          px     = width/2;
          py     = 50;
          vx     = 1 * +vscale;
          vy     = 1 *  vscale;
          radius = 40;
          temperature = 1f;
          fluid.addDensity(px, py, radius, 0.2f, 0.3f, 0.5f, 1.0f);
          fluid.addTemperature(px, py, radius, temperature);
          particles.spawn(fluid, px, py, radius, 100);


          boolean mouse_input = mousePressed;

          // add impulse: density + velocity, particles
          if(mouse_input && mouseButton == LEFT){
            radius = 15;
            vscale = 15;
            px     = mouseX;
            py     = height-mouseY;
            vx     = (mouseX - pmouseX) * +vscale;
            vy     = (mouseY - pmouseY) * -vscale;
            fluid.addDensity (px, py, radius, 0.25f, 0.0f, 0.1f, 1.0f);
            fluid.addVelocity(px, py, radius, vx, vy);
            particles.spawn(fluid, px, py, radius*2, 300);
          }

          // add impulse: density + temperature, particles
          if(mouse_input && mouseButton == CENTER){
            radius = 15;
            vscale = 15;
            px     = mouseX;
            py     = height-mouseY;
            temperature = 2f;
            fluid.addDensity(px, py, radius, 0.25f, 0.0f, 0.1f, 1.0f);
            fluid.addTemperature(px, py, radius, temperature);
            particles.spawn(fluid, px, py, radius, 100);
          }

          // particles
          if(mouse_input && mouseButton == RIGHT){
            px     = mouseX;
            py     = height - 1 - mouseY; // invert
            radius = 50;
            particles.spawn(fluid, px, py, radius, 300);
          }

        }
      }


      int viewport_w = 1280;
      int viewport_h = 720;
      int viewport_x = 230;
      int viewport_y = 0;

      int gui_w = 200;
      int gui_x = 20;
      int gui_y = 20;

      int fluidgrid_scale = 3;

      DwFluid2D fluid;

      // render targets
      PGraphics2D pg_fluid;
      //texture-buffer, for adding obstacles
      PGraphics2D pg_obstacles;

      // custom particle system
      MyParticleSystem particles;

      // some state variables for the GUI/display
      int     BACKGROUND_COLOR           = 0;
      boolean UPDATE_FLUID               = true;
      boolean DISPLAY_FLUID_TEXTURES     = false;
      boolean DISPLAY_FLUID_VECTORS      = false;
      int     DISPLAY_fluid_texture_mode = 0;
      boolean DISPLAY_PARTICLES          = true;


      public void settings() {
        size(viewport_w, viewport_h, P2D);
        smooth(4);
      }



      public void setup() {
        surface.setLocation(viewport_x, viewport_y);

        // main library context
        DwPixelFlow context = new DwPixelFlow(this);
        context.print();
        context.printGL();

        // fluid simulation
        fluid = new DwFluid2D(context, viewport_w, viewport_h, fluidgrid_scale);

        // set some simulation parameters
        fluid.param.dissipation_density     = 0.999f;
        fluid.param.dissipation_velocity    = 0.99f;
        fluid.param.dissipation_temperature = 0.80f;
        fluid.param.vorticity               = 0.10f;
        fluid.param.timestep                = 0.25f;
        fluid.param.gridscale               = 8f;

        // interface for adding data to the fluid simulation
        MyFluidData cb_fluid_data = new MyFluidData();
        fluid.addCallback_FluiData(cb_fluid_data);

        // pgraphics for fluid
        pg_fluid = (PGraphics2D) createGraphics(viewport_w, viewport_h, P2D);
        pg_fluid.smooth(4);
        pg_fluid.beginDraw();
        pg_fluid.background(BACKGROUND_COLOR);
        pg_fluid.endDraw();

            // pgraphics for obstacles
        pg_obstacles = (PGraphics2D) createGraphics(viewport_w, viewport_h, P2D);
        pg_obstacles.smooth(4);
        pg_obstacles.beginDraw();
        pg_obstacles.clear();
        float radius;
        radius = 200;
        pg_obstacles.stroke(64);
        pg_obstacles.strokeWeight(1);
        pg_obstacles.fill(0);
        pg_obstacles.rect(1*width/2f,  1*height/4f, radius, radius/2, 10);
        pg_obstacles.stroke(64);
        pg_obstacles.strokeWeight(1);
        pg_obstacles.fill(0);
        pg_obstacles.rect(1*width/3.5f,  1*height/2.5f, radius, radius/2, 10);
        //// border-obstacle
        //pg_obstacles.strokeWeight(20);
        //pg_obstacles.stroke(64);
        //pg_obstacles.noFill();
        //pg_obstacles.rect(0, 0, pg_obstacles.width, pg_obstacles.height);
        pg_obstacles.endDraw();

        fluid.addObstacles(pg_obstacles);

        // custom particle object
        particles = new MyParticleSystem(context, 1024 * 1024);

        kinect = new KinectPV2(this);
        //Enables depth and Body tracking (mask image)
        kinect.enableDepthMaskImg(true);
        kinect.enableSkeletonDepthMap(true);
        kinect.init();   

        background(0);
        frameRate(60);
      }




      public void draw() {    



        PImage imgC = kinect.getDepthMaskImage();
        image(imgC, 0, 0, 320, 240);

        //get the skeletons as an Arraylist of KSkeletons
        ArrayList<KSkeleton> skeletonArray =  kinect.getSkeletonDepthMap();
        //individual joints
        for (int i = 0; i < skeletonArray.size(); i++) {
          KSkeleton skeleton = (KSkeleton) skeletonArray.get(i);
          //if the skeleton is being tracked compute the skleton joints
          if (skeleton.isTracked()) {
            KJoint[] joints = skeleton.getJoints();

            color col  = skeleton.getIndexColor();
            fill(col);
            stroke(col);

            drawHandState(joints[KinectPV2.JointType_HandRight]);
            drawHandState(joints[KinectPV2.JointType_HandLeft]);
          }
        }

        // update simulation
        if(UPDATE_FLUID){
          fluid.addObstacles(pg_obstacles);
          fluid.update();
          particles.update(fluid);
        }

        // clear render target
        pg_fluid.beginDraw();
        pg_fluid.background(BACKGROUND_COLOR);
        pg_fluid.endDraw();


        // render fluid stuff
        if(DISPLAY_FLUID_TEXTURES){
          // render: density (0), temperature (1), pressure (2), velocity (3)
          fluid.renderFluidTextures(pg_fluid, DISPLAY_fluid_texture_mode);
        }

        if(DISPLAY_FLUID_VECTORS){
          // render: velocity vector field
          fluid.renderFluidVectors(pg_fluid, 10);
        }

        if( DISPLAY_PARTICLES){
          // render: particles; 0 ... points, 1 ...sprite texture, 2 ... dynamic points
          particles.render(pg_fluid, BACKGROUND_COLOR);
        }


        // display
        image(pg_fluid    , 320, 0);
        image(pg_obstacles, 320, 0);

        // display number of particles as text
        //String txt_num_particles = String.format("Particles  %,d", particles.ALIVE_PARTICLES);
        //fill(0, 0, 0, 220);
        //noStroke();
        //rect(10, height-10, 160, -30);
        //fill(255,128,0);
        //text(txt_num_particles, 20, height-20);

        // info
        //String txt_fps = String.format(getClass().getName()+ "   [size %d/%d]   [frame %d]   [fps %6.2f]", fluid.fluid_w, fluid.fluid_h, fluid.simulation_step, frameRate);
        //surface.setTitle(txt_fps);
      }


    //draw a ellipse depending on the hand state
    void drawHandState(KJoint joint) {
      noStroke();
      handState(joint.getState());
      //println(joint.getState());
      pushMatrix();
      translate(joint.getX(), joint.getY(), joint.getZ());
      //println(joint.getX(), joint.getY(), joint.getZ());
      ellipse(joint.getX(), joint.getY(), 70, 70);
      popMatrix();
    }

    /*
    Different hand state
     KinectPV2.HandState_Open
     KinectPV2.HandState_Closed
     KinectPV2.HandState_Lasso
     KinectPV2.HandState_NotTracked
     */

    //Depending on the hand state change the color
    void handState(int handState) {
      switch(handState) {
      case KinectPV2.HandState_Open:
        fill(0, 255, 0);
        break;
      case KinectPV2.HandState_Closed:
        fill(255, 0, 0);
        break;
      case KinectPV2.HandState_Lasso:
        fill(0, 0, 255);
        break;
      case KinectPV2.HandState_NotTracked:
        fill(100, 100, 100);
        break;
      }
    }

1 个答案:

答案 0 :(得分:0)

  

我猜我必须创建全局变量才能在更新函数中访问它,或者我必须将骨架数据作为参数传递给更新函数?

当你尝试这些方法时发生了什么?

两种方法听起来都不错。您可以将变量存储在草图级变量中,从kinect代码中设置这些变量,然后在绘图代码中使用这些变量。或者您可以将变量作为参数传递给绘图代码。要么应该工作正常。我可能会采用第一种方法,因为这对我来说听起来更容易,但这只是我个人的偏好。

我建议working in smaller chunks。创建一个单独的程序,暂时忽略kinect。创建一个硬编码的草图级变量,该变量包含您从kinect获得的相同类型的信息。然后编写使用该硬编码变量绘制帧的绘图代码。在尝试添加kinect代码之前,请完美地完成工作。

然后,如果您遇到特定步骤,可以发布MCVE,我们可以从那里开始。祝你好运。