【问题标题】:Processing with leapmotion , cursor display跳跃运动处理,光标显示
【发布时间】:2014-10-23 04:13:38
【问题描述】:

我正在处理中的跳跃运动。我正在制作一个简单的应用程序,它将跟踪 index_finger 运动并绘制它...... 一切都很好......我的项目正在根据需要跟踪我的指针和草图,但问题是当我停止草图时(我使用圆周运动来启用草图并点击运动停止)没有什么可以告诉我我的光标在哪里是...我必须猜测我的 index_finger 指针的位置。 这是我到目前为止所做的......

    import java.util.Map;
    import java.util.concurrent.ConcurrentMap;
    import java.util.concurrent.ConcurrentHashMap;

    import com.leapmotion.leap.Controller;
    import com.leapmotion.leap.Finger;
    import com.leapmotion.leap.Frame;
    import com.leapmotion.leap.Pointable;
    import com.leapmotion.leap.Hand;
    import com.leapmotion.leap.Tool;
    import com.leapmotion.leap.Vector;
    import com.leapmotion.leap.Gesture;
    import com.leapmotion.leap.processing.LeapMotion;

    LeapMotion leapMotion;

    ConcurrentMap<Integer, Integer> fingerColors;
    ConcurrentMap<Integer, Integer> toolColors;
    ConcurrentMap<Integer, Vector> fingerPositions;
    ConcurrentMap<Integer, Vector> toolPositions;


    float hey = 21;
    float hi = 15;
    float hoo = 0;

    boolean circle_me = false;
    boolean tap_me = false;

    void setup()
    {
      size(16 * 50, 9 * 50);
      background(250);
      frameRate(60);
      ellipseMode(CENTER);

      leapMotion = new LeapMotion(this);
      fingerColors = new ConcurrentHashMap<Integer, Integer>();
      fingerPositions = new ConcurrentHashMap<Integer, Vector>();
    }

    void draw()
    {
       text("Sketch Pad", 250,80);

      for (Map.Entry entry : fingerPositions.entrySet())
      {
        Integer fingerId = (Integer) entry.getKey();
     //   println ("finger_id: " + fingerId);
        Vector position = (Vector) entry.getValue();
    //    fill(fingerColors.get(fingerId));
        if (keyPressed && (key == 'd') || circle_me == true){    
        smooth();
        fill(random(0,255),random(0,255),random(0,255),120);
    //    fill(255, 0, 0, 25);
        //stroke(0);
        noStroke();
        ellipseMode(CENTER);
        ellipse(leapMotion.leapToSketchX(position.getX()), leapMotion.leapToSketchY(position.getY()), 25.0, 25.0);

        }
        //else
        //pencil(position);

        if(tap_me){
          circle_me = false;
          tap_me = false;
        }


        /*
        else{
          //fill(100);
          //rect(0,0,width,height);
          ellipseMode(CENTER);
          ellipse(leapMotion.leapToSketchX(position.getX()), leapMotion.leapToSketchY(position.getY()), 5.0, 5.0);
        }
        */


        if (keyPressed && (key == 'e'))
           background(255);


      }

    }

    boolean pencil(Vector position){

        if(hoo == 0){
          hi = leapMotion.leapToSketchX(position.getX());
          hey = leapMotion.leapToSketchY(position.getY());
          hoo++;
        }
        line(leapMotion.leapToSketchX(position.getX()), leapMotion.leapToSketchY(position.getY()), hi, hey);
        hi = leapMotion.leapToSketchX(position.getX());
        hey = leapMotion.leapToSketchY(position.getY());
        strokeWeight(1);
       // println("x: " + position.getX() + "\n y: " + position.getY());
    return true;
    }

    void onInit(final Controller controller)
    {
      controller.enableGesture(Gesture.Type.TYPE_CIRCLE);
      controller.enableGesture(Gesture.Type.TYPE_KEY_TAP);
      // enable background policy
      controller.setPolicyFlags(Controller.PolicyFlag.POLICY_BACKGROUND_FRAMES);
    }

    void onFrame(final Controller controller)
    {
      Frame frame = controller.frame();
      for (Gesture gesture : frame.gestures())
      {
        if ("TYPE_CIRCLE".equals(gesture.type().toString()) && "STATE_START".equals(gesture.state().toString())) {
          //circle_me = true;
          println("circled " + gesture.duration());
        }
        else if ("TYPE_CIRCLE".equals(gesture.type().toString()) && "STATE_STOP".equals(gesture.state().toString())) {
          circle_me = true;
          println("circledS " + gesture.duration());
        }
        else if ("TYPE_KEY_TAP".equals(gesture.type().toString()) && "STATE_STOP".equals(gesture.state().toString())) {
              if ("TYPE_KEY_TAP".equals(gesture.type().toString()) && "STATE_STOP".equals(gesture.state().toString())) {
              tap_me = true;
              println("tapped " + gesture.duration());
            }
        }
      }
      fingerPositions.clear();
      for (Finger finger : frame.fingers())
      {
        int fingerId = finger.id();
        color c = color(random(0, 255), random(0, 255), random(0, 255));

        fingerColors.putIfAbsent(fingerId, c);

        if("TYPE_INDEX".equals(finger.type().toString())){

          fingerPositions.put(fingerId, finger.stabilizedTipPosition());
          String finger1 = finger.type().toString();
         // println ("index: " + finger.stabilizedTipPosition());
        //println("x: " + finger.getX() + "\n y: " + finger.getY());
        }
         /*
        if("TYPE_THUMB".equals(finger.type().toString())){

          String finger2 = finger.type().toString();

        //  fingerPositions.put(fingerId, finger.stabilizedTipPosition());
         // println ("thumb: " + finger.stabilizedTipPosition());
        }
        */
      }
    }

当素描模式不活动时,我需要一个像光标一样的东西。

【问题讨论】:

    标签: java processing leap-motion


    【解决方案1】:

    您必须使用 PGraphics 对象绘制到“屏幕外缓冲区”,然后将其和光标绘制到屏幕上。见https://www.processing.org/reference/createGraphics_.html

    这是一个例子,我改编自我做过的其他事情。按一个键打开和关闭绘画:

    import com.leapmotion.leap.*;
    
    int width = 800;
    int height = 600;
    int maxBrushSize = 120;
    color canvasColor = 0xffffff;
    float alphaVal = 10;
    PGraphics canvas;
    Boolean isDrawing = true;
    
    Controller leap = new Controller();
    
    void setup()
    {
       frameRate(120);
       size(width, height);
       canvas = createGraphics(width, height);
       background(canvasColor);
       stroke(0x00ffffff);
    }
    
    
    void draw(){
      Frame frame = leap.frame();
      Pointable pointer = frame.pointables().frontmost();
      if( pointer.isValid() )
      {
        background(canvasColor);
    
        color frontColor = color( 255, 0, 0, alphaVal );
        color backColor  = color( 0, 0, 255, alphaVal );
    
        InteractionBox iBox = frame.interactionBox();
        Vector tip = iBox.normalizePoint(pointer.tipPosition());
        float x = tip.getX() * width;
        float y = height - tip.getY() * height;
        float brushSize = maxBrushSize - maxBrushSize * tip.getZ();
    
        if(isDrawing){
          canvas.beginDraw();
          canvas.fill(frontColor);
          canvas.noStroke();
          canvas.ellipse( x, y, brushSize, brushSize);
          canvas.endDraw();
        }
        image(canvas, 0, 0); //Draw canvas to screen
    
        noFill();
        stroke(0, 0, 0);
        ellipse( x, y, brushSize, brushSize); // draw cursor
      }
    }
    
    void keyPressed()
    {
       isDrawing = !isDrawing;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-21
      • 2013-08-12
      • 1970-01-01
      • 1970-01-01
      • 2022-10-25
      • 2014-04-29
      • 1970-01-01
      • 2018-02-10
      相关资源
      最近更新 更多